文章目录
- 前记
- 服务攻防------第八十一天
-
- 开发框架安全&SpringBoot&Struts2&Laravel&ThinkPHP&CVE复现
-
- [开发框架 - 常见语言开发框架](#开发框架 - 常见语言开发框架)
- [PHP - 框架安全-Thinkphp&Laravel](#PHP - 框架安全-Thinkphp&Laravel)
- [J2EE - 框架漏洞-Struts2&SpringBoot](#J2EE - 框架漏洞-Struts2&SpringBoot)
前记
- 今天是学习小迪安全的第八十一天,今天主要是了解PHP和Java的框架漏洞 ,包括PHP的ThinkPHP 、Laravel ,Java的Struts2 、SpringBoot
- 因为是复现其CVE漏洞,所以内容比较多,然后也介绍了很多工具,下去可以归个类,自己也好好复现一下
服务攻防------第八十一天
开发框架安全&SpringBoot&Struts2&Laravel&ThinkPHP&CVE复现
开发框架 - 常见语言开发框架
- PHP:
- ThinkPHP:国内常用的PHP框架,目前主流的版本为TP8,也有很多企业使用TP6
- Laravel:国内外都比较常用的框架,安全性比TP高,目前主流版本为Laravel11
- YII / YII2 :国外常用开发框架,目前主流版本为
YII2
- CodeIgniter
- CakePHP
- Zend
- Symfony
- JAVA:
- Struts / Struts2:早些年最流行的JAVA框架,目前可能只有一些老项目能够见到
- Spring:15年左右Spring MVC逐渐成熟,成为主推的开发框架
- SpringBoot:20年左右SpingBoot以 "零配置" 的优点引爆市场;并且随着SpringBoot3.0正式到来,其整体渗透率达到了惊人的68%,是目前最常见的JAVA开发框架
- MyBatis:是国内常用的JAVA数据库访问控制组件
- Hibernate:国外常用的JAVA数据库访问控制组件
- Python:
- Django:是目前国内外主流的Python开发框架,主流版本为5.1 LTS
- Flask / FlaskAPI:Flask和FlaskAPI也是比较常见的框架
- Bottle
- Turbobars
- Tornado
- Web2py
- JavaScript:
- React:UI组件层框架,目前主流版本为18.3,国内外都比较常用
- Vue.js:比较常用的JS前端框架,主流版本为3.5,国内比较常用
- Node.js:JS运行时框架,主流版本为22 LTS,JS全栈开发离不开
- Angular
- Svelte
- Bootstrap
- JQuer:主流版本为3.7.1,老项目仍在使用
PHP - 框架安全-Thinkphp&Laravel
Laravel
漏洞介绍
- Laravel 是一套简洁、优雅的 PHP Web 开发框架(PHP Web Framework)
- CVE-2021-3129:
- 漏洞描述 :当
APP_DEBUG=true
时,内置调试组件 Ignition 的「解决方案」接口未过滤用户输入,可通过 Phar 反序列化实现远程代码执行。 - 影响版本 :
Laravel ≤ 8.4.2
facade/ignition < 2.5.2
- 利用条件 :
- 开启Debug模式(
APP_DEBUG = true
) - igniton组件版本低于2.5.2
- 开启Debug模式(
- 漏洞描述 :当
- CVE-2022-31279:
- 漏洞描述:Laravel 9.1.8 之前未对「广播队列」负载做签名校验,攻击者可投递恶意序列化对象,触发 POP 链 RCE
- 影响版本 :
Laravel < 9.1.8
- 利用条件 :
- 使用
redis/database
等广播驱动 - 队列 worker 消费攻击者可控的广播数据
- 使用
- CVE-2024-47823:
- 漏洞描述 :Livewire 上传组件只看 MIME 类型,未校验真实后缀,导致可上传
.php
文件。 - 影响版本 :
Livewire 2 ≥ 2.12.7
且< 3.5.2
Livewire 3 < 3.5.2
- 说明:Livewire 是 Laravel 的"全栈动态界面"框架,属于其第三方组件,并非框架漏洞
- 漏洞描述 :Livewire 上传组件只看 MIME 类型,未校验真实后缀,导致可上传
- CVE-2025-53833:
- 漏洞描述 :文档工具 LaRecipe 的
renderBlade()
直接把 Markdown 里的{``{ }}
、{!! !!}
交给 Blade 编译,造成 SSTI → RCE - 影响版本 :
LaRecipe < 2.8.1
- 说明:LaRecipe 是 Laravel 的专用文档生成器,同样也属于其第三方组件,并非框架本身漏洞
- 漏洞描述 :文档工具 LaRecipe 的
- CVE-2024-55556:
- 漏洞描述 :Laravel 的
decrypt()
会自动反序列化解密数据;一旦APP_KEY
泄露,攻击者可构造恶意 payload 触发 RCE - 影响版本 :
Laravel 10.x
(含10.x)之前的所有版本
- 利用条件 (满足其一即可):
SESSION_DRIVER=cookie
且 KEY 泄露- 业务把用户输入直接丢进
decrypt()
- 漏洞描述 :Laravel 的
漏洞复现
CVE-2021-3129
-
首先开启靶机:
-
然后我们就直接使用工具一把梭就好了,项目地址:https://github.com/zhzyker/CVE-2021-3129
-
下载文件夹之后我们使用命令:
python
python exp.py http://123.58.224.8:20094

- 可以看到第二个,还有其他下面的很多都能够成功返回
whoami
的执行结果,说明存在该漏洞 - 其实这个
exp.py
本身是基于phpggc
这个工具的,为什么是上面特定的exp
执行成功就是因为这几个exp
满足当前的Laravel
版本:
ThinkPHP
漏洞介绍
- ThinkPHP 是一套开源的、基于 PHP 的轻量级 Web 应用开发框架。
- CVE-2018-1002015:
- 漏洞描述 :在解析控制器名时,直接把用户输入拼接到类名字符串,且仅做简单正则过滤,允许插入反斜杠
\\
穿越命名空间,从而可调用任意公共方法。 - 影响版本 :
TP 5.0.x
(≤ 5.0.23
)TP 5.1.x
(< 5.1.31
)
- 利用条件 :
url_route_must
保持默认(false,未开启强制路由)
- 漏洞描述 :在解析控制器名时,直接把用户输入拼接到类名字符串,且仅做简单正则过滤,允许插入反斜杠
- CVE-2019-9082:
- 漏洞描述:框架把 PATHINFO 直接当控制器类名,导致可调用任意 public 方法
- 影响版本 :
TP 5.0.0~5.0.23
- 利用条件 :
url_route_must
未开启(默认)
- CVE-2018-20062:
- 漏洞描述 :5.1 重写路由后,对控制器名正则过滤不完整,可插入
\
穿越 - 影响版本 :
TP 5.1.0~5.1.31
- 利用条件 :
url_route_must
未开启(默认)
- 漏洞描述 :5.1 重写路由后,对控制器名正则过滤不完整,可插入
- CNVD-2021-44350:
- 漏洞描述 :
Builder::parseData()
把数组键名当字段名拼接,未过滤导致SQL注入 - 影响版本 :
TP 5.0.13~5.0.15
TP 5.1.0~5.1.5
- 利用条件 :
- 把
$_POST
直接当数组键名写进insert()
- 把
- 漏洞描述 :
- CVE-2022-45982:
- 漏洞描述 :默认文件/Redis 缓存对数据
unserialize()
,可被写入恶意对象 - 影响版本 :
TP 6.0.0~6.0.13
TP 6.1.0~6.1.1
- 利用条件 :
- 使用默认缓存驱动
- 漏洞描述 :默认文件/Redis 缓存对数据
- QVD-2022-46174:
- 漏洞描述 :
lang=../../../path
可穿越包含任意 PHP 文件 - 影响版本 :
TP 5.0/5.1
全分支TP 6.0.1~6.0.13
- 利用条件 :
- 开启多语言(
lang_switch_on=true
)
- 开启多语言(
- 文件上传 :在开启
register_argc_argv
且安装了pcel/pear
的情况下,可以包含/usr/local/lib/php/pearcmd.php
并写入任意文件
- 漏洞描述 :
- CVE-2024-48112:
- 漏洞描述 :
think\exception
模板渲染链可被反序列化,导致任意代码执行 - 影响版本 :
TP 6.1.3~8.0.4
- 利用条件 :
- 开启异常模板调试(默认关闭)
- 漏洞描述 :
- 我看了一下,在8月5号的时候TP5又爆出来一个RCE,但是这里就不多写了,具体可以自查CVE官网:CVE: Common Vulnerabilities and Exposures
漏洞复现
- 同样,直接工具一把梭即可,这里工具可以直接使用ONE-FOX自带的thinkphp检测工具,也可以使用蓝鲸这个工具
- 下载地址:https://github.com/bewhale/thinkphp_gui_tools/
CVE-2018-1002015
-
启动靶场,然后访问目标网站:
-
这里从图标可以看出来网站是Thinkphp搭建,但是没有具体版本号,但是可以尝试让他报错,看看是否暴漏版本号:
-
这里确实可以拿到版本号为
TP 5.1.30
,符合上面好几个的漏洞版本,那这里我们就可以一个一个试了 -
假设我们知道这里就是关于CVE-2018-1002015的漏洞利用,所以我们就也是直接使用
Payload
:
php
/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

- 成功执行任意命令,接下来就可以尝试上传
WebShell
了 - 当然,这里使用工具一把梭也是能够RCE的:
QVD-2022-46174
-
启动靶机,访问地址
/public/index.php
:
-
直接给出了TP版本号为
6.0.12
,那可以利用的也就那几个漏洞,一个一个试就完了 -
当然这里我们查看网络数据包发现Set-Cookie的值有个
think_lang=zh-cn
,可以猜测存在多语言的漏洞:
-
直接抓包,转到Repeater模块,写入如下
Payload
看看是否有回显:
php
/public/index.php?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+/var/www/html/shell.php

-
然后我们访问
shell.php
看看是否创建了phpinfo()
的页面:
-
说明存在RCE漏洞,同样我们也可以尝试使用工具一把梭:
-
也可以扫出来可能存在这个漏洞,手动验证一下即可
J2EE - 框架漏洞-Struts2&SpringBoot
Struts2
漏洞介绍
Apache Struts2
框架是一个使用JavaEE网络应用程序的Web框架,可能存在OGNL表达式注入扩展,从而造成RCE,风险极大- CVE-2020-17530(S2-061):
- 漏洞描述:标签属性二次 OGNL 解析
- 影响版本 :
- Struts2
2.0.0 ~ 2.5.25
- Struts2
- 利用条件 :
- 目标应用使用受影响标签
- 标签的"id"或其他可二次解析属性被赋值为用户可控数据
- 服务器未升级到 2.5.30/6.0.0 以上
- CVE-2021-31805(S2-062):
- 漏洞描述 :这是对 2020 年 CVE-2020-17530(S2-061)补丁的"二次绕过"。当 JSP 标签属性使用
%{...}
强制 OGNL 评估且属性值来自用户输入时,攻击者仍可注入 OGNL 表达式,导致任意代码执行。 - 影响版本 :
Struts 2.0.0 ~ 2.5.29
(含)
- 利用条件 :
- 同
CVE-2020-17530
- 同
- 漏洞描述 :这是对 2020 年 CVE-2020-17530(S2-061)补丁的"二次绕过"。当 JSP 标签属性使用
- CVE-2023-50164(S2-066):
- 漏洞描述 :文件上传拦截器对"上传路径+文件名"的校验存在缺陷,允许攻击者通过构造
../
序列将任意文件写入 Web 容器可执行目录,进而导致远程代码执行。 - 影响版本:
- Struts2
2.5.0 ~ 2.5.32
- Struts2
6.0.0 ~ 6.3.0
- Struts2
- 利用条件:
- 应用使用了
<s:file>
上传功能并且保存路径由后端自动拼接 - 未对上传后缀或路径做额外白名单限制
- 具备文件上传权限(多数场景无需管理员身份)
- 应用使用了
- 漏洞描述 :文件上传拦截器对"上传路径+文件名"的校验存在缺陷,允许攻击者通过构造
- 其他漏洞,看到比较全的文章是这篇:Struts2框架漏洞总结与复现 - FreeBuf网络安全行业门户
漏洞复现
- 同样,直接工具一把梭即可,工具可以使用ONE-FOX自带的struts2全版本检测工具
- 该工具目前仍在更新,下载地址:https://github.com/abc123info/Struts2VulsScanTools/releases
CVE-2016-0785(S2-029)
-
这个是老漏洞了,像这种就纯是用工具一把梭了,基本实战已经碰不到了
-
启动靶场,是这个样子的:
-
怎么判断是否为Struts2框架呢,首先是看看指纹识别工具 是否能够识别出,然后可以看看有没有
.action
这种后缀 的页面,最后实在没有就看这个网站它是不是哪种看起来就特别老的网站 ,并且是Java语言开发的 -
这里并没有,也不用管,反正就盲扫就盲扫就完了:
-
也是能够成功扫到漏洞并利用成功
CVE-2020-17530(S2-061)
-
启动靶机,也是不管,就扫:
-
这里又是扫到了,然后他提示并没有利用功能,但是我们选择执行命令,仍然是可以执行成功的:
-
当然,如果确定漏洞,但这里也利用不了的话,我们就使用具体的利用工具:yaunsky/s2-061-rce: s2-061批量扫描兼命令执行exp
-
成功利用
CVE-2021-31805(S2-062)
-
启动靶机,然后访问网站,还是用工具扫:
-
不过很可惜的是这里并没有扫出来,当然也可以使用其他的工具扫描,比如Tscan、Yakit等等带PoC的工具慢慢尝试
-
这里也假设知道了就是这个漏洞,我们就使用网上的exp进行利用即可,下载地址:pyroxenites/s2-062: 远程代码执行S2-062 CVE-2021-31805验证POC
-
这里使用有回显的那个脚本都是利用失败的,原因是因为这里传入的参数为
name
,但脚本中的默认参数为id
-
emmm,虽然改完之后也没用,可能他是不回显的,那我们尝试他的第二个dnslog带外的脚本:
python
python exp.py --url http://192.168.0.143:58503/s2_062/index.action --par name

-
可以看到,是存在漏洞的,那么我们就尝试利用,这里抓包然后尝试反弹Shell
-
怎么抓到python的包呢,我们就可以利用之前学到的
Proxifier
联动BP抓包:
-
抓到包之后转到Repeater模块:
-
这里先在kali上开启监听,比如监听9999端口:
-
然后我们将这个name的值转到Decode模块,URL解码之后,将命令改成反弹Shell的命令,然后URL编码:
-
替换参数之后发包,我还是不明白为什么这里老是连不上,真没办法理解是环境的问题还是我的问题
SpringBoot
漏洞介绍
- CVE-2021-21234:
- 漏洞描述 :spring-boot-actuator-logview(第三方日志查看器)在 0.2.13 之前版本未对
base
参数做校验,仅校验filename
参数。攻击者可将base
设为任意路径穿越串,拼接后读取日志根目录之外的任意文件,造成目录遍历/任意文件读取。 - 影响版本 :
spring-boot-actuator-logview < 0.2.13
- 利用条件 :
- 应用显式引入上述依赖
/log/view
或/manage/log/view
端点可访问且未鉴权- 运行用户对目标文件具有读权限
- 说明:该漏洞是第三方组件的漏洞,并非SpringBoot本身的框架漏洞,因此如果对方未引用该组件,便无法形成危害
- 漏洞描述 :spring-boot-actuator-logview(第三方日志查看器)在 0.2.13 之前版本未对
- CVE-2022-22947:
- 漏洞描述 :Spring Cloud Gateway 在启用并暴露 Gateway Actuator 端点(
/actuator/gateway/routes
与/actuator/gateway/refresh
)时,允许远程攻击者通过 POST 创建恶意路由 。路由中的 filter 字段 会被 Gateway 内部ShortcutConfigurable#getValue()
方法以 SpEL 表达式 形式解析,且使用 StandardEvaluationContext ,从而可执行任意系统命令,造成 未经身份验证的 RCE。 - 影响版本 :
Spring Cloud Gateway 3.1.x < 3.1.1
Spring Cloud Gateway 3.0.x < 3.0.7
- 其他旧版本分支同样受此影响
- 利用条件 :
- 应用引入 spring-cloud-gateway-server 并启用 Actuator (
management.endpoints.web.exposure.include=gateway
或*
) - 端点 未做认证保护(默认无鉴权)
- 攻击者可发送 HTTP POST 请求到
/actuator/gateway/routes/{id}
与/actuator/gateway/refresh
- 网关版本在受影响范围内。
- 应用引入 spring-cloud-gateway-server 并启用 Actuator (
- 说明 :和上面一样,这个漏洞本质是
Spring Cloud Gateway
的缺陷,不属于Spring Boot
框架本身的漏洞
- 漏洞描述 :Spring Cloud Gateway 在启用并暴露 Gateway Actuator 端点(
- CVE-2022-22963:
- 漏洞描述 :Spring Cloud Function 的
RoutingFunction
在收到functionRouter
请求时,会把 HTTP 头spring.cloud.function.routing-expression
的值直接交给 SpEL 解析器。攻击者可在该头写入任意 SpEL,从而远程执行系统命令。 - 影响版本 :
3.0.0.RELEASE ≤ Spring Cloud Function ≤ 3.2.2
(含 3.1.6、3.2.2 等全部维护分支)
- 利用条件 :
- 应用引入
spring-cloud-function-context
并暴露functionRouter
端点(默认即存在) - 路由功能开启(
spring.cloud.function.routing.enabled=true
,默认开启) - 攻击者可发送 HTTP POST 请求
- 应用引入
- 说明 :同样,这个漏洞本质是
Spring Cloud Function
的SpEL
解析缺陷,不属于Spring Boot
框架本身的漏洞
- 漏洞描述 :Spring Cloud Function 的
- CVE-2022-22965:
- 漏洞描述 :Spring Framework 5.3.17/5.2.19 及更早版本在 JDK 9+ 环境下,对 Java Bean 属性绑定过滤不完整,允许攻击者通过嵌套属性链访问
class.module.classLoader
等内部对象。结合 Tomcat 的AccessLogValve
可在 Web 根目录写入任意文件,实现远程代码执行。 - 影响版本 :
Spring Framework 5.3.0 ~ 5.3.17
Spring Framework 5.2.0 ~ 5.2.19
- 其他旧分支同样受影响
- 利用条件 :
- JDK ≥ 9(模块系统绕过关键)
- 使用 Spring MVC/WebFlux 且存在 POJO 参数绑定
- 部署方式为 WAR 包运行在 Apache Tomcat(jar 包无法写入 webapps)
- 未对
class.*
、Class.*
等字段做全局黑名单过滤
- 说明 :本质是
Spring Framework
核心缺陷,并非Spring Boot
自身代码漏洞,但是基本上的项目都会将该组件拉进来,所以也算是其框架漏洞了
- 漏洞描述 :Spring Framework 5.3.17/5.2.19 及更早版本在 JDK 9+ 环境下,对 Java Bean 属性绑定过滤不完整,允许攻击者通过嵌套属性链访问
- CVE-2022-27772:
- 漏洞描述 :Spring Boot 自带的 Unix 启动脚本(
spring-boot-loader-tools
生成的init.d
服务)在创建临时目录时未校验符号链接,导致本地攻击者通过目录劫持实现任意文件写入/覆盖,最终可获取代码执行权限。 - 影响版本 :
SpringBoot 2.2.0 ~ 2.2.10 RELEASE
SpringBoot 1.5.x
- 利用条件 :
- 应用以
systemd
/init.d
方式安装并启用 Spring Boot 自带启动脚本 - 攻击者已拥有本地普通用户 shell
- 可预测或控制
/tmp/spring-boot-*
临时目录路径(默认权限 755,重启后清空)
- 应用以
- 漏洞描述 :Spring Boot 自带的 Unix 启动脚本(
- CVE-2023-34055:
- 漏洞描述 :Spring Boot 对外部配置源(环境变量、JNDI、
spring.application.json
、spring.config.import
)的信任链校验不足,攻击者可在容器/云平台注入恶意属性,导致敏感配置泄露或间接远程代码执行。 - 影响版本 :
SpringBoot 2.6.x
全系列SpringBoot 2.7.0 ~ 2.7.18
SpringBoot 3.0.0 ~ 3.0.11
- 利用条件 :
- 应用使用
spring-boot-starter-actuator
或spring-cloud-kubernetes
等动态配置能力 - 攻击者可控制 Pod/容器环境变量或 ConfigMap(例如拥有
patch
权限) - 应用将 Environment 属性直接拼接到命令行、JVM 参数或日志输出
- 应用使用
- 漏洞描述 :Spring Boot 对外部配置源(环境变量、JNDI、
漏洞复现
- 对于大部分的SpringBoot漏洞,我们同样可以采用现成的工具,比如SpringBoot_Scan和YYBaby
- 下载地址:
CVE-2021-21234
-
启动靶机,先看看是不是SpringBoot框架:
-
显示为Spring框架,都差不多,那我们就直接用工具先扫一遍,看看能不能扫出东西:
python
python .\SpringBoot-Scan.py -v http://192.168.0.143:55190/

- 那可以看到就扫出来了,直接利用即可,抓包然后逐个尝试其
Payload
:
CVE-2022-22963
-
这个漏洞的靶机我们使用
vulhub
,因为vulfocus
上好像没有,启动起来之后访问网站:
-
打开就是熟悉的报错页面,确定为SpringBoot,然后工具启动:
-
成功扫到了存在漏洞CVE-2022-22963,于是我们就在网上找找有没有直接利用的exp,下载地址:brinhosa/CVE-2022-22963-Spring-cloud-function-SpEL-RCE: Spring-cloud-function-SpEL-RCE 批量检测脚本,反弹shell_EXP,欢迎师傅们试用
-
先在本地进行监听:
cmd
.\nc.exe -lvvp 9999
-
然后运行这个脚本:
-
成功反弹Shell:
-
这里我们可以看看exp是怎么写的:
-
其实就很简单了,就是将反弹Shell的命令通过
Runtiome.getRuntime().exec()
去执行,然后放到请求头中发送给目标网站的/functionRouter
路径 -
当然我们也就可以直接尝试用BP抓包去利用,这里就不再尝试了
CVE-2022-22965
-
这个漏洞我们也用
vulhub
,启动靶机之后访问网站:
-
可以看到指纹识别到为Spring,还是直接工具开扫:
-
这里让我们自己尝试,那直接访问提供的地址:
-
成功利用,那这里我们还是先搜一下有没有利用脚本,下载地址:likewhite/CVE-2022-22965: CVE-2022-22965 EXP
-
我们就不利用了,直接看他的exp是怎么写的:
-
首先对请求头进行加工,这里添加一些数据,然后对请求的data数据,写入我们的
payload
,比如写入参数为cmd
,写入的文件后缀为.jsp
,文件名和文件路径都由用户指定,最后使用post提交 -
那我们可以尝试抓包自己利用一下看看能不能成功:
-
比如这里写入文件名为
tomcatwar.jsp
,用post提交提示405方法不允许,改为get提交提示200成功,但是访问这个文件仍然显示不存在 -
这个就不知道是什么原因了,我重新用那个SpringBoot_Scan利用了一遍抓包,换个文件名也不行,不懂
CVE-2022-22947
-
这里我们又换回
vulfocus
靶场,启动起来,然后访问网站:
-
同样Spring框架,同样工具先扫描一遍:
-
这里就直接扫到了,我们还是再了解一下利用过程,这里也不用搜了,我感觉网上的exp好多都利用不了,直接看SpringBoot_Scan的数据包吧
-
他的逻辑就是首先创建一个路由,路径为
/actuator/gateway/routes/路由名称
,让他的值为命令执行的语句,执行id
命令 -
再访问这个路径,就可以看到命令执行的结果了:
-
之后再通过
/static/uploadify/uploadFile.jsp?uploadPath=/static/uploadify
路径上传一句话木马getshell