小迪安全v2023学习笔记(八十一讲)—— 框架安全&ThinkPHP&Laravel&Struts2&SpringBoot&CVE复现

发布于:2025-09-12 ⋅ 阅读:(23) ⋅ 点赞:(0)

前记

  • 今天是学习小迪安全的第八十一天,今天主要是了解PHP和Java的框架漏洞,包括PHP的ThinkPHPLaravel,Java的Struts2SpringBoot
  • 因为是复现其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
  • 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 的“全栈动态界面”框架,属于其第三方组件,并非框架漏洞
  • CVE-2025-53833
    • 漏洞描述:文档工具 LaRecipe 的 renderBlade() 直接把 Markdown 里的 {{ }}{!! !!} 交给 Blade 编译,造成 SSTI → RCE
    • 影响版本
      • LaRecipe < 2.8.1
    • 说明:LaRecipe 是 Laravel 的专用文档生成器,同样也属于其第三方组件,并非框架本身漏洞
  • CVE-2024-55556
    • 漏洞描述:Laravel 的 decrypt() 会自动反序列化解密数据;一旦 APP_KEY 泄露,攻击者可构造恶意 payload 触发 RCE
    • 影响版本
      • Laravel 10.x(含10.x)之前的所有版本
    • 利用条件(满足其一即可):
      • SESSION_DRIVER=cookie 且 KEY 泄露
      • 业务把用户输入直接丢进 decrypt()
漏洞复现
CVE-2021-3129
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 未开启(默认)
  • 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
    • 利用条件
      • 使用默认缓存驱动
  • 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
漏洞复现
CVE-2018-1002015
  • 启动靶场,然后访问目标网站:
    在这里插入图片描述

  • 这里从图标可以看出来网站是Thinkphp搭建,但是没有具体版本号,但是可以尝试让他报错,看看是否暴漏版本号:
    在这里插入图片描述

  • 这里确实可以拿到版本号为TP 5.1.30,符合上面好几个的漏洞版本,那这里我们就可以一个一个试了

  • 假设我们知道这里就是关于CVE-2018-1002015的漏洞利用,所以我们就也是直接使用Payload

/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看看是否有回显:

/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
    • 利用条件
      • 目标应用使用受影响标签
      • 标签的“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
  • CVE-2023-50164(S2-066):
    • 漏洞描述:文件上传拦截器对“上传路径+文件名”的校验存在缺陷,允许攻击者通过构造 ../ 序列将任意文件写入 Web 容器可执行目录,进而导致远程代码执行。
    • 影响版本:
      • Struts2 2.5.0 ~ 2.5.32
      • Struts2 6.0.0 ~ 6.3.0
    • 利用条件:
      • 应用使用了 <s:file> 上传功能并且保存路径由后端自动拼接
      • 未对上传后缀或路径做额外白名单限制
      • 具备文件上传权限(多数场景无需管理员身份)
  • 其他漏洞,看到比较全的文章是这篇:Struts2框架漏洞总结与复现 - FreeBuf网络安全行业门户
漏洞复现
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 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本身的框架漏洞,因此如果对方未引用该组件,便无法形成危害
  • 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 并启用 Actuatormanagement.endpoints.web.exposure.include=gateway*
      • 端点 未做认证保护(默认无鉴权)
      • 攻击者可发送 HTTP POST 请求到 /actuator/gateway/routes/{id}/actuator/gateway/refresh
      • 网关版本在受影响范围内。
    • 说明:和上面一样,这个漏洞本质是 Spring Cloud Gateway 的缺陷,不属于 Spring Boot 框架本身的漏洞
  • 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 FunctionSpEL 解析缺陷,不属于 Spring Boot 框架本身的漏洞
  • 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 自身代码漏洞,但是基本上的项目都会将该组件拉进来,所以也算是其框架漏洞了
  • 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,重启后清空)
  • CVE-2023-34055
    • 漏洞描述:Spring Boot 对外部配置源(环境变量、JNDI、spring.application.jsonspring.config.import)的信任链校验不足,攻击者可在容器/云平台注入恶意属性,导致敏感配置泄露或间接远程代码执行。
    • 影响版本
      • SpringBoot 2.6.x 全系列
      • SpringBoot 2.7.0 ~ 2.7.18
      • SpringBoot 3.0.0 ~ 3.0.11
    • 利用条件
      • 应用使用 spring-boot-starter-actuatorspring-cloud-kubernetes 等动态配置能力
      • 攻击者可控制 Pod/容器环境变量或 ConfigMap(例如拥有 patch 权限)
      • 应用将 Environment 属性直接拼接到命令行、JVM 参数或日志输出
漏洞复现
CVE-2021-21234
  • 启动靶机,先看看是不是SpringBoot框架:
    在这里插入图片描述

  • 显示为Spring框架,都差不多,那我们就直接用工具先扫一遍,看看能不能扫出东西:

python .\SpringBoot-Scan.py -v http://192.168.0.143:55190/

在这里插入图片描述

  • 那可以看到就扫出来了,直接利用即可,抓包然后逐个尝试其Payload
    在这里插入图片描述
CVE-2022-22963
.\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


网站公告

今日签到

点亮在社区的每一天
去签到