Contents
前提:
理解本篇内容:我的建议是先学习php面向对象部分的知识,对序列化和反序列化及其漏洞有一定了解,理解起来能事倍功半
正题
可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞。(其实就是不使用unserialize函数,从而进行反序列化)
phar原理
a stub(必须理解)
可以理解为一个标志,格式为xxx<?php xxx;__HALT_COMPILER();?>
,前面内容不限,但必须以__HALT_COMPILER();?>
来结尾,否则phar扩展将无法识别这个文件为phar文件。(这部分仔细看下,其实识别phar文件的也主要是根据__HALT_COMPILER();?>
这部分)
将phar伪造成其他格式的文件(重点)
在前面分析phar的文件结构时可能会注意到,php识别phar文件是通过其文件头的stub,更确切一点来说是__HALT_COMPILER();?>这段代码,对前面的内容或者后缀名是没有要求的。那么我们就可以通过添加任意的文件头+修改后缀名的方式将phar文件伪装成其他格式的文件
生成phar文件,打开phpstudy确定好对应版本,在php.ini中找到phar.readonly把On改成Off,前面;去掉,这样运行的时候才能生成phar文件
下面运行一个demo,深入理解
<?php
class TestObject {
}
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$o = new TestObject();
$o -> data='purplet';
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>
可以看到生成如图所示的phar文件,接下来我们从winhex中看一下
利用方式即:phar://加phar文件
我们返回去看下上面的demo,从第一个$o前面开始都是套路,后面的$o则是一个对象了,我们通过对这个对象的调用赋值,最后将其作为phar文件的meta-data
部分传入到这个phar文件,后面三行也是固定格式,最后生成phar文件。
参考文章