第二次代码审计

本次审计的提示是文件上传

工作结构

ThinkPHP的框架结构已经熟悉,在/app下的目录结构如图:
image-20240807181321285

常规服务的工作目录是哪个呢?不妨登录网页看看:

fofa语句:"web/static/css/chunk-elementUI.f92cd1c5.css"

image-20240807181602133

猜测是web目录下,对照源码证实猜想。

寻找入口

ThinkPHP自带的文件上传方法,本次就使用request()->file()

add27ad1bcb3a00f8ecfe059d0ae2b83

我们不可能一个一个文件寻找,使用全局搜索:

image-20240807182055916

只有Video.php的检测不严格,可以MIME绕过:

image-20240807182235297

实现上传

想要上传,需要满足几点:

  1. 知道启动方法的路径
  2. 是POST方法,并且可以上传文件
  3. 开启相关配置

对于第一点,我猜测路径是/web/video/uploadMedia,但是实际上是/web.php/video/uploadMedia,我发现这一点是在头像上传的请求包里:

image-20240807182918440

原理是什么呢:

在ThinkPHP中,web.php 是应用的入口文件。访问路径中的 web.php 部分实际是对入口文件的引用,这是因为服务器配置了URL重写,将所有请求导向入口文件(如 web.php),以便框架可以处理它们。

在上图的基础上可以完成第二点。

至于第三点,请看下图:

image-20240807185220805

这是因为Fileinfo 扩展未启用,finfo_open()PHP Fileinfo 扩展的一部分。如果该扩展未启用,会导致函数未定义的错误。

思路分析

本次的思路非常清晰:

  1. 从框架等入手推出相应的危险方法
  2. 全局搜索使用对应危险方法的源码
  3. 找到可利用的点,实现攻击

每一次审计的项目体量都不小,所以我们需要熟知对应框架有哪些危险方法等等,有根据地去寻找可利用的点。