在复现第八届封神台ctf第一次接触到了php -S服务启动后造成代码泄露
的漏洞
PHP从5.4开始,就提供了一个内置的web服务器,主要是用来做本地的开发用的。
前提:php已经加入到本地电脑的环境变量中
cd 项目目录
php -S localhost:8080
通过php -S
开起的内置WEB服务器存在源码泄露漏洞,可以将PHP文件作为静态文件直接输出源码
随意访问一个不存在的php,触发以下页面,这算是php -S启动服务的一个标志:(页面来自封神台的图床题)

我们这里就结合这道题来介绍这个漏洞的利用
我们bp抓包发送repeater来准备读取unzip.php的源码,一定能要关闭repeater的自动更新Content-Length 以及显示回车换行,方便数据包的构造。

这里就读取到了源码但是不在接着往下写,想往下看这题去看我的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源码将会被以静态文件的方式泄露(即直接访问获取)