今天看到一篇文章介绍php反序列化漏洞利用,里面讲到了phar文件进行反序列化,原来也了解过,现在又看了一遍,感觉这个漏洞还是挺实用的,记录一下 文章链接: php反序列化利用方式
1 phar反序列化
1.1phar文件结构
我们可以把phar文件看成一个压缩包格式的文件,它包括以下几个结构
1.a stub 可以理解为一个标志,格式为xxx<?php xxx; __HALT_COMPILER();?> ,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件。
2.a manifest describing the contents phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。
3.the file contents 被压缩文件的内容。
4.a signature 签名,放在文件末尾
2.如何生成phar文件 我们可以利用php自带的phar类来生成phar文件,举个例子
<?php
class TestObject {
}
@unlink("phar.phar");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$o = new TestObject();
$phar->setMetadata($o);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
生成的文件格式 我们可以看到Metadata被序列化存储了。当我们用一些php函数尝试对该phar文件进行读写操作时,便会对Metadata数据进行反序列化,如果找到了合适的魔术方法,便可以触发反序列化漏洞。
1.2受影响的函数
1.3成功触发反序列化漏洞所需的条件:
1.phar文件要能够上传到服务器端。
2. 要有可用的魔术方法作为“跳板”。
3.文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。
由于php识别phar文件是通过其文件头的stub,更确切一点来说是__HALT_COMPILER();?> 这段代码,对前面的内容或者后缀名是没有要求的。那么我们就可以通过添加任意的文件头+修改后缀名的方式将phar文件伪装成其他格式的文件。
这样可以绕过大多数的白名单检测,非常使用
参考链接: phar利用
2.反序列化字符逃逸
这个反序列化的利用方法也是很有意思 参考下面这篇文章: php反序列化字符逃逸 字符串逃逸分变长和变短, 原理都差不多的, 遇到了灵活处理
3.构造pop链
构造pop链主要是找对应的魔术方法和理清各个类魔术方法的调用,然后写对应的exp。
|