1. Phar file stub

<?php __HALT_COMPILER(); //最短

2.Phar file format

Serialized Phar Meta-data, stored in serialize() format

需要把readonly = Off

<?php
class TestObject
{    
    function __destruct(){
        
    }
}

@unlink("phar.phar");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->addFromString("test.txt","test");
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$o = new TestObject();
$phar->setMetadata($o);
$phar->stopBuffering();

?>

其实phar 也相当于一个 php 文件 可编译,metaDate 会有反序列化的过程,__destruct / __wakeup 时候触发

在 __destruct 里面cwd = / ,即当前工作目录为 /,所以如果要文件操作 必须要绝对路径

常用的工具phpggc 可以构造攻击链

若需要伪造,只要在stub <?php 前面家文件头就行。

触发函数 :

fileatime / filectime / filemtime
stat / fileinode / fileowner / filegroup / fileperms
file / file_get_contents / readfile / fopen`
file_exists / is_dir / is_executable / is_file / is_link / is_readable / is_writeable / is_writable
parse_ini_file
unlink
copy

exif

exif_thumbnail
exif_imagetype

gd

imageloadfont
imagecreatefrom***

hash

hash_hmac_file
hash_file
hash_update_file
md5_file
sha1_file

file / url

get_meta_tags
get_headers

standard

getimagesize
getimagesizefromstring

zip

$zip = new ZipArchive();
$res = $zip->open('c.zip');
$zip->extractTo('phar://test.phar/test');

姿势:

$z = 'compress.bzip2://phar:///home/sx/test.phar/test.txt';

phar 是一种 stream_wrapper 中注册的伪协议,php 读写都是这种方式。很显然只要有读写功能的函数其实都是可以的。

标签: none

添加新评论