phar反序列化个人总结
tips:phar在php中一般都是只读状态,需要在php.ini中修改权限
一、PHAR文件结构
主要分为3-4个部分:
1.a stub
stub的基本结构:xxx<?php xxx;__HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件
2.a manifest describing the contents
Phar文件中被压缩的文件的一些信息,其中Meta-data部分的信息会以序列化的形式储存,这里就是漏洞利用的关键点
3.the files contents
被压缩的文件内容,在没有特殊要求的情况下,这个被压缩的文件内容可以随便写的,因为我们利用这个漏洞主要是为了触发它的反序列化
4.a signature for verifying Phar integrity
签名格式,一般就随便写点什么就好了
二、生成phar的固定代码
$phar = new Phar("exp.phar"); //.phar文件
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ? >'); //固定的
$phar->setMetadata($a); //触发的头是a类,所以传入a对象
$phar->addFromString("exp.txt", "test"); //随便写点什么生成个签名
$phar->stopBuffering();
三、常见题目分析
一般题目多为文件上传,但是题中没有明确的序列化函数,所以需要通过目录穿越(…/…/index.php)或是文件泄露等方法拿到该题的源代码,主要要拿到其中对文件读取的php方法,后续便是代码分析,需要通过给出的方法得出pop链,此处可以注意一些比较常见的方法,如:close()、__destruct()、__construct()、__call(),这些一般都容易产生输出