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

文章目录

前记

  • 今天是学习小迪安全的第八十一天,今天主要是了解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 复制代码
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

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
    • 利用条件
      • 目标应用使用受影响标签
      • 标签的"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 复制代码
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 复制代码
python .\SpringBoot-Scan.py -v http://192.168.0.143:55190/
  • 那可以看到就扫出来了,直接利用即可,抓包然后逐个尝试其Payload
CVE-2022-22963
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

相关推荐
tingshuo291717 小时前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
用户962377954481 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954481 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher3 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
BingoGo5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·laravel
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel