V3D4's Blog

安全技术记录/分享/交流

0%

phar反序列化的一些理解

1.为什么要利用phar

1

一些题目需要用到反序列化去读取文件,但是却没有提供unserialize()时就可以利用phar

2.利用php生成phar文件

1
2
3
4
5
6
7
8
9
10
11
12
class TestObject {
}
@unlink("phar.phar");//删除文件,确保phar.phar不存在
$phar = new Phar("phar.phar");//新建一个phar包
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");//设置stub
$o = new TestObject();
$phar->setMetadata($o);//将自定义的meta-data存入mainfest,也就是需要被序列化的对象,这一步最重要
$phar->addFromString("test.txt","test");//添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>

通过上述代码生成的文件如图,可以看到已经将TestObject类序列化了,此时上传再去用phar协议读取就会触发反序列化

2

3.受影响的函数

3

当看到这些函数时就表明可以用phar这种方法了

例子如下,当去用file_get_contents去读取phar包中的test.txt文件时,就会触发反序列化 ,调

用TestObject类,于是TestObject中的的魔术方法就被调用了,会输出Destruct called

4

5

4.总结

总算是对phar有了一定的了解,关于如何去构造pop链,提高代码审计能力才是最关键的一点,努力去学php吧,接下来应该还会做几道关于反序列化的题