第二次代码审计
第二次代码审计
本次审计的提示是文件上传。
工作结构
ThinkPHP
的框架结构已经熟悉,在/app
下的目录结构如图:
常规服务的工作目录是哪个呢?不妨登录网页看看:
(fofa
语句:"web/static/css/chunk-elementUI.f92cd1c5.css"
)
猜测是web
目录下,对照源码证实猜想。
寻找入口
ThinkPHP
自带的文件上传方法,本次就使用request()->file()
:
我们不可能一个一个文件寻找,使用全局搜索:
只有Video.php
的检测不严格,可以MIME
绕过:
实现上传
想要上传,需要满足几点:
- 知道启动方法的路径
- 是POST方法,并且可以上传文件
- 开启相关配置
对于第一点,我猜测路径是/web/video/uploadMedia
,但是实际上是/web.php/video/uploadMedia
,我发现这一点是在头像上传的请求包里:
原理是什么呢:
在ThinkPHP中,
web.php
是应用的入口文件。访问路径中的web.php
部分实际是对入口文件的引用,这是因为服务器配置了URL重写,将所有请求导向入口文件(如web.php
),以便框架可以处理它们。
在上图的基础上可以完成第二点。
至于第三点,请看下图:
这是因为Fileinfo
扩展未启用,finfo_open()
是 PHP Fileinfo
扩展的一部分。如果该扩展未启用,会导致函数未定义的错误。
思路分析
本次的思路非常清晰:
- 从框架等入手推出相应的危险方法
- 全局搜索使用对应危险方法的源码
- 找到可利用的点,实现攻击
每一次审计的项目体量都不小,所以我们需要熟知对应框架有哪些危险方法等等,有根据地去寻找可利用的点。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 山 · 水!
评论