php审计之phar://协议
之前在网上看到这么个协议,感觉记忆有点模糊,故复现一下。
- php.ini中的phar.readonly设置为Off(默认为On)
一般来说此协议可适用于文件包含
这个协议就是用来读取压缩包中的文件内容的。
我们这里用最最经典的pikachu靶场来做实验。
看代码,直接包含了get方法接收到的filename参数,我们这里去给include里面加一个压缩包,压缩包里面弄一个shell。
现在我们去包含这个1.zip
可以看到直接包含也只能看到里面的文件名字
但是我们使用,phar://
协议去包含的话(中途改了下代码)
phar://C:\code\phpstudy_pro\WWW\vul\fileinclude\include\12.zip\12.php
而且后缀也不是非要zip,换成png也可以,这样就可以绕过了。
生成
同时也可以用php脚本打包一个phar文件,下面是脚本
<?php
$pharFilename = 'myapp.phar';
$entrypoint = '1.php';
$stub = <<<STUB
<?php
Phar::mapPhar('$pharFilename');
include 'phar://$pharFilename/$entrypoint';
__HALT_COMPILER();
STUB;
$phar = new Phar($pharFilename);
$phar->startBuffering();
// 添加入口文件
$phpCode = '<?php echo "Hello, World!";';
$phar->addFromString($entrypoint, $phpCode);
// 设置 stub(入口文件)
$phar->setStub($stub);
$phar->stopBuffering();
echo "成功生成 $pharFilename\n";
?>
phpcode就是包含的文件内容。
ps:我用php7.3.4版本复现了一晚上都没成功,真要自杀了。换成5.6.9就可以了。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。