漏洞复现 - Struts2 S2-020 DoS 与 RCE 利用
本文最后更新于 2025年7月14日 下午
📌 漏洞简介
Struts2 S2-020 是 Apache Struts 2 框架中的一处高危漏洞,
其本质是 ClassLoader 可控,导致 OGNL 表达式可以修改服务器上下文属性,从而执行任意代码或破坏配置。
- 影响版本:Struts 2.0.0 - Struts 2.3.15.1
- 漏洞点:未对 OGNL 表达式做充分的上下文属性过滤
🚩 利用场景 1️⃣ - 拒绝服务(DoS)
⚙️ 原理
通过可控 OGNL,修改 classLoader
加载的 docBase
路径,
如果将其改成一个不存在的目录,当前应用的映射会失效,访问任意路径都会返回 404,实现 DoS。
🗂️ 漏洞环境
- 目标:
http://xxx/uprr/goLoginJsp.ajax
✅ 利用示例
构造恶意参数
1 |
|
请求示例:
1 |
|
✅ 访问效果
- 执行后,当前应用映射的物理路径被改成了一个不存在的目录;
- 所有后续访问都会返回
404 Not Found
; - 直至服务被重新部署或重启,服务不可用。
📸 截图示例
执行前:
设置为不存在路径后,访问404:
🚩 场景 2️⃣ - 远程命令执行(RCE)
⚙️ 原理
OGNL 表达式不仅能修改配置,还可调用 Java 类加载器、运行时对象,执行系统命令。
例如:
- 调用
java.lang.Runtime.getRuntime().exec()
- 输出命令结果到页面
🗂️ 漏洞环境
- 目标 URL:
http://xxx/uprr/goLoginJsp.ajax
✅ 构造命令执行 POC
下面示例执行 whoami
:
1 |
|
🔍 关键参数拆解
参数 | 作用 |
---|---|
method:#_memberAccess |
关闭安全沙箱限制 |
#a |
执行系统命令 |
#b |
读命令输出 |
#c |
缓冲流 |
#d |
输出缓冲 |
#out |
获得 Response Writer |
✅ 效果示例
执行后,页面会直接回显命令结果:
1 |
|
🔗 通用 payload 变体
1 |
|
- Windows 下可改
whoami
/dir
- Linux 下可改
id
/ifconfig
/ping
⚠️ 影响
- 该方法不需要上传文件或执行命令,只需要可访问漏洞点即可。
- 攻击难度低,极易被批量扫描滥用造成拒绝服务。
🛡️ 修复建议
✅ 官方修复:
- 升级至 Struts 2.3.15.2 及以上版本
- 严格限制 OGNL 表达式可访问属性范围
- 生产环境禁用
devMode
- 使用 WAF 拦截包含敏感 OGNL 字段的恶意参数
🔍 漏洞利用拓展
除了 DoS,该漏洞还可用于:
- 远程命令执行(RCE):执行系统命令,如
ping
、whoami
- 读取/写入文件
- 服务器提权与持久化
🔗 参考链接
📝 总结
- DoS:直接断绝路径映射
- RCE:利用 OGNL 动态执行命令
- 危害:极易打点横向移动,后果严重