Struts2-全漏洞研究(三)


本文是在自己入门漏洞研究的同时编写这些笔记。
个人整理,如有错误,请联系更改。 – taamr
微步社区的文章也是我发的,并不是我抄的,看id就能知道了。
并且只提供POC,不提供EXP,谢谢


S2-021

漏洞原理:
关于漏洞,其实就是struts2参数拦截器的特性,而且不单单是classLoader,只要是符合条件的对象,都可以操控。这里再说一下官方修复为什么会被绕过,还是看参数拦截器的代码 (ParametersInterceptor.java) ,他会调用isExcluded去检测请求参数是否合规,这个 this. excludeParams 便是 struts2-core.jar 中 struts-default.xml 中配置的正则了,而在其他位置没有过滤,所以变换一下写法就可以bypass掉。
关于操控classLoader其实早在S2-009就有这种利用了,而且那时候官方过滤更加不严,因为OGNL支持(aa)(bb)这样的方式执行代码,所以当时在tomcat下的利用是 class.classLoader.jarPath=(PAYLOAD)(aa)&x[(class.classLoader.jarPath)(‘aa’)] 这样,其实这个是操控classLoader的jarPath属性。当然不同的容器对应不同的属性,比如JBOSS的classLoader中也有 class.classLoader.jarPath 这个属性,所以跟tomcat相同的利用方法。在resin下还有个class.classLoader.id是String类型同时在WebappClassLoader里也存在setid这个方法,所以也可以像jarPath那样利用。

简单来说,修复S2-020时只是用匹配正则过滤参数,变化POC写法就能BYPASS。
漏洞类型:
远程命令执行漏洞。过滤限制不完整。可利用性:7分。

漏洞手测:

?Class['ClassLoader'].parent= GENXOR

S2-022

漏洞原理:
修复S2-021时过滤不严格,在cookie拦截器仍存在S2-21漏洞。

简单来说,同上。

漏洞类型:
远程命令执行漏洞。过滤限制不完整。可利用性:7分。

漏洞手测:
拦截抓包,把S2-021的poc放在cookie值。


S2-023

漏洞原理:
Struts2的token验证机制泄露。攻击者使用预测的令牌制作一个特殊的手工表单,强制登录用户(CSRF)执行操作。

简单来说,CSRF漏洞。

漏洞类型:
跨站请求伪造漏洞。可利用性:5分。

漏洞手测:
无。


S2-024

漏洞原理:
官方描述,漏洞形成原因是之前S2-021提到的struts2默认的excludeParams正则过滤出现问题。利用可导致攻击者可以破坏内部应用程序的状态。
关于这个漏洞的信息少之又少。以至官方给出的漏洞类型都是,“”如果使用默认设置,攻击者可以破坏应用程序的内部状态“”。
在我从网上找到存在漏洞的2.3.20版本后,看了下。
存在漏洞正则表达式:
修复前

修复后的正则表达式:
修复后
可以看见是正则表达式错误。。。
本人猜测有S2-024漏洞的应用,应该会有与之相关(使用excludeParams过滤的)的所有漏洞。
大佬们如有更好的见解请评论。

简单来说,excludeParams配置错误,导致过滤失效。可能会引发之前用次过滤方法修复的漏洞。

漏洞类型:
?。开发配置错误。可利用性:?。

漏洞手测:
无。


S2-025

漏洞原理:
开发模式下的JSP文件和公开的JSP文件中存在跨站点脚本漏洞。

漏洞类型:
跨站脚本漏洞。可利用性:4分。

漏洞手测:

<script>alert("xss")</script>

S2-026

漏洞原理:
ValueStack定义了表示执行上下文根的特殊top对象。它可以用来操纵Struts的内部结构,也可以用来影响容器的设置。Parameters拦截器里isExcluded检测函数中的excludeParams正则匹配未过滤此类利用。攻击者可利用该漏洞绕过安全限制,执行未授权操作。

漏洞类型:
安全绕过漏洞。过滤不完整。可利用性:6分。

漏洞手测:
无。


S2-027

漏洞原理:
struts2中的TextParseUtil.translateVariables方法会将给定的字符串当作OGNL表达式执行。默认情况下,Struts 2框架不会直接或间接地向该方法传递任何用户可修改的输入。但是,开发基于Struts的web应用程序的开发人员可能会将未过滤的用户输入传递给此方法,导致命令执行。

简单来说,TextParseUtil.translateVariables不过滤恶意OGNL表达式,开发人员如果将未过滤的用户参数传递给此方法,会导致RCE。

漏洞类型:
远程命令执行漏洞。过滤不完整。可利用性:6分。(非通用)

漏洞手测:
如果白盒测试发现有对TextParseUtil.translateVariables传参且没有任何过滤,可用之前的任意OGNL表达式POC进行验证。


S2-028

漏洞原理:
Struts 2使用是标准的JRE URL解码器对参数值进行解码。但是JRE 1.5的URLDecover实现似乎被破解,以至于这种非规范编码没有被拒绝/过滤。所以使用JRE 1.5时,可能会导致XSS漏洞。后来更新的JRE 1.8里已经修复此问题。

漏洞类型:
跨站脚本漏洞。可利用性:4分。

漏洞手测:

<script>alert("xss")</script>

S2-029

漏洞原理:
ApacheStruts框架在强制执行时,会对分配给特定标签的属性值执行双重求值,因此可以传入一个值,该值将在呈现标签的属性时再次求值。
漏洞的根源是调用findString、findValue等函数。在I18NInterceptor的UIBean中对自己的name和value属性值进行操作时,会先尝试获取value的值,如果value为空,那么就二次解释执行了name。并且在执行前给name加上了”%{}”。最终造成二次执行。而UIBean被很多类继承,类似的textarea、label、hidden等标签都存在二次执行问题。该漏洞可利用性比较困难,能够双重执行的属性位于name中,而我们通常可以传参的地方是value(不排除哪个程序员可以让你操控name属性值,同时你的value值还为空的情况)。

简单来说,struts2在处理特定标签时会对name属性值进行二次解析执行,并执行前加上了”%{}”,导致命令执行。

漏洞类型:
远程命令执行漏洞。逻辑错误。可利用性:6分。(非通用)

漏洞手测:
提交参数POC:

2.2.1只需要下面几个:
#_memberAccess['allowPrivateAccess']=true
#_memberAccess['allowProtectedAccess']=true
#_memberAccess['allowPackageProtectedAccess']=true
#_memberAccess['allowStaticMethodAccess']=true
2.3.24.12.5beta3则需要:
#_memberAccess['allowPrivateAccess']=true
#_memberAccess['allowProtectedAccess']=true
#_memberAccess['excludedPackageNamePatterns']=#_memberAccess['acceptProperties']
#_memberAccess['excludedClasses']=#_memberAccess['acceptProperties']
#_memberAccess['allowPackageProtectedAccess']=true
#_memberAccess['allowStaticMethodAccess']=true
2.3.252.3.26 则需要
#_memberAccess['excludedPackageNames']=#_memberAccess['acceptProperties']
#_memberAccess['allowPrivateAccess']=tru
#_memberAccess['allowProtectedAccess']=true
#_memberAccess['excludedPackageNamePatterns']=#_memberAccess['acceptProperties']
#_memberAccess['excludedClasses']=#_memberAccess['acceptProperties']
#_memberAccess['allowPackageProtectedAccess']=true
#_memberAccess['allowStaticMethodAccess']=true
这些开启配置的OGNL后面加命令执行语句:@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream()))

S2-030

漏洞原理:
ApacheStruts框架使用I18N拦截器允许用户和开发人员切换框架中使用的语言以及构建在其上的应用程序。问题是拦截器不执行任何用户输入验证,和字符串验证。开发人员可以用来显示用户选择的语言,但是,struts2框架不会默认在UI中公开该功能。开发人员如果提供用户根据I18N拦截器自己选择显示语言的功能,可能会导致XSS。

漏洞类型:
跨站脚本漏洞。未过滤用户输入。可利用性:4分。

漏洞手测:

<script>alert("xss")</script>

文章作者: meta-taamr
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 meta-taamr !