大家好,又见面了,我是你们的朋友全栈君。
60网站安全检测最新struts2命令执行漏洞分析
时间:2013-07-18 09:46 |
在struts2中,DefaultActionMapper类支持以“action:”、“redirect:”、“redirectAction:”作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。
这里以“redirect:”前缀举例,struts2会将“redirect:”前缀后面的内容设置到redirect.location当中,这里我们一步步跟踪,首先是这个getMapping函数跟入
truts框架是Apache基金会Jakarta项目组的一个Open Source项目,它采用MVC模式,帮助java开发者利用J2EE开发Web应用。Struts框架广泛应用于运营商、政府、金融行业的门户网站建设,作为网站开发的底层模版使用,目前大量开发者利用j2ee开发web应用的时候都会利用这个框架。Apache Struts2 是第二代基于Model-View-Controller (MVC)模型的JAVA企业级WEB应用框架。
根据分析结果,此问题源于Apache Struts2对参数action的值redirect以及redirectAction没有正确过滤,导致ognl代码执行。Apache Struts2的action:、redirect:和redirectAction:前缀参数在实现其功能的过程中使用了Ognl表达式,并将用户通过URL提交的内容拼接入Ognl表达式中,远程攻击者可以通过构造恶意URL来执行任意Java代码,进而可执行任意命令。redirect:和redirectAction:此两项前缀为Struts默认开启功能。
此次爆出的高危漏洞,受影响Apache Struts2版本: Struts 2.0.0 – Struts 2.3.15。
这里一直到这个handleSpecialParameters(),继续跟入
这里真正传入OGNL表达式是在这个parameterAction.execute()中,继续跟入来到DefaultActionMapper.java的代码
这里key.substring(REDIRECT_PREFIX.length())便是前缀后面的内容也就是OGNL表达式,struts2会调用setLocation方法将他设置到redirect.location中。然后这里调用mapping.setResult(redirect)将redirect对象设置到mapping对象中的result里,如图所示
然而上面的过程只是传递OGNL表达式,真正执行是在后面,这里是在FilterDispatcher类中的dispatcher.serviceAction()方法,这里的mapping对象中设置了传入的OGNL
这里跟入方法最终会在TextParseUtil这个类的调用stack.findValue()方法执行OGNL。
PoC:
漏洞重现:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158471.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...