PHP_=7.4.21 Development Server源码泄露漏洞


在复现第八届封神台ctf第一次接触到了php -S服务启动后造成代码泄露的漏洞

PHP从5.4开始,就提供了一个内置的web服务器,主要是用来做本地的开发用的。
前提:php已经加入到本地电脑的环境变量中

cd 项目目录

php -S localhost:8080

通过php -S开起的内置WEB服务器存在源码泄露漏洞,可以将PHP文件作为静态文件直接输出源码

随意访问一个不存在的php,触发以下页面,这算是php -S启动服务的一个标志:(页面来自封神台的图床题)

![](PHP_=7.4.21 Development Server源码泄露漏洞/1745475646348-eadb9113-2888-4365-b623-c1760e25cf3e.png)

我们这里就结合这道题来介绍这个漏洞的利用

我们bp抓包发送repeater来准备读取unzip.php的源码,一定能要关闭repeater的自动更新Content-Length 以及显示回车换行,方便数据包的构造。

![](PHP_=7.4.21 Development Server源码泄露漏洞/1745476282943-e7089b83-167d-4ec0-a8bc-79671a3362f5.png)

这里就读取到了源码但是不在接着往下写,想往下看这题去看我的wp

这里先上poc并附上解释

GET /unzip.php HTTP/1.1
Host: 159.138.63.173:8085

GET /AAA.txt Http/1.1

ps:这里一定要换行

第一个GET后的/unzip.php是直接访问已存在的unzip.php文件

PHP源码中的php_cli_server_request_translate_vpath函数将请求的PHP文件的路径转换为文件系统上的

完整路径。

如果请求的文件是一个目录,它会检查是否存在索引文件,如index.php或 index.html,并使用其中一个文

件的路径(如果找到的话)。

第二个GET后的/请求的是目录而不是文件。

此PHP版本提供的代码包括一个检查,以确定请求的文件是应被视为静态文件还是作为PHP文件执行。

这是通过检查文件的扩展名来完成的。如果扩展不是.php或.PHP,或者如果扩展名的长度不等于3,则该文件被视为静态文件,

因此如果我们把第二个GET请求的内容改为类似1.txt的文件时,php源码将会被以静态文件的方式泄露(即直接访问获取)


文章作者: YUNiversity
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YUNiversity !
评论
  目录