[NISACTF 2022]bingdundun~

文章目录

        • 本题考点
        • 做题过程

本题考点

phar伪协议实现文件包含

做题过程
  1. 注意观察,首先给出了一个链接,点进去后可以发现两个页面都存在//index.php,而且 url 多了一个参数bingdundun,疑似文件包含,改成?bingdundun=index试试
    [NISACTF 2022]bingdundun~_第1张图片
    [NISACTF 2022]bingdundun~_第2张图片

[NISACTF 2022]bingdundun~_第3张图片

  1. 可以发现直接套娃起来了,那么可以推测出是在后面加上.php,然后进行文件包含。

  2. 接着上传 shell 文件试试,bp 抓包 fuzz 后可以发现对文件后缀名有严格限制,而且也不能上传配置文件,那么既不能上传 php 文件,也不能包含非 php 文件( \x00 的截断在 php>5.3.4 就没用了,而且还要考虑 GPC ,所以是比较鸡肋的方法)。其实我们可以通过 zip 协议和 phar 协议来包含文件。这道题似乎 zip 协议包含不成功。

  3. zip 应该很多人都知道,但 phar 是什么?phar ( php archive ) 是 PHP 里类似于 jar ( java archive ) 的一种打包文件。如果你使用的是 PHP 5.3 或更高版本,那么 .phar 后缀文件是默认开启支持的,你不需要任何其他的安装就可以使用它。而phar://的伪协议,可以将任意后缀名的压缩包(原来是 .phar 或 .zip,注意:PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行 ) 解包,从而可以通过上传压缩包绕过对后缀名的限制,再利用伪协议实现文件包含。

  4. 因此先要生成一个压缩包文件,这里就有两个方向,一是生成zip文件,可以直接将一句话木马压缩为 .zip 文件;二是生成 phar 文件

    注意:默认phar扩展是只读模式,需要手动配置php.ini中phar.readonly= Off

    且无法用ini_set修改

  5. 先了解一手 phar 文件格式

    • stub是phar文件的文件头,格式为......可以是任意字符,包括留空,且 php 闭合符与最后一个分号之间不能有多于一个的空格符。另外 php 闭合符也可省略。包含在 php 代码块中的语句在 phar 文件被包含时被执行。最短省略闭合符的stub是__HALT_COMPILER();?>。前面的内容是没有限制的,也就是说我们可以构造一个图片文件或者 pdf 文件来绕过上传的限制,将这个phar文件上传上去。

      
      	$phar = new Phar('demo.phar');
      	$phar->setStub('');
      	include('phar://demo.phar');
      ?>
      // in stub!
      
    • manifest describing the contents存放着压缩文件的信息,每个被压缩文件的权限,属性等信息都放在这里,这里还会以序列化的形式存储着用户自定义的meta-dataphar文件存储meta-data时会先将内容序列化后再存入进去,当文件操作函数通过phar://伪协议解析phar文件时就会先将数据反序列化,这样就可以构成反序列化攻击。这里是phar反序列化攻击最核心的地方,但对这道题没有帮助。

    • the file contents:被压缩文件的内容,这里写入一句话木马,但对 phar 反序列化攻击没有帮助

    • signature:可选,phar文件的签名,允许的有MD5, SHA1, SHA256, SHA512和OPENSSL

  6. 如何生成一个 phar 文件?phar类提供对phar文件的操作,具体可以参考这篇博客

  7. 这里给出参考代码,运行后可在目录下发现生成的 shell.phar 文件,为了绕过上传文件后缀名限制,需要修改文件名为 shell.jpg

    
        $payload = '';  // 一句话木马
        $phar = new Phar("shell.phar");  // 后缀名必须为phar
        $phar->startBuffering();
        $phar->setStub("");  // 设置stub
        $phar->addFromString("1.php", "$payload");  // 添加要压缩的文件
        // $phar->setMetadata(...);  // 在metadata添加内容,可参考 phar反序列化,此处用不着,故注释
        $phar->stopBuffering();
    ?>
    
  8. 上传后利用phar://伪协议读取文件,因为phar伪协议不看后缀名,主要看标识来判定,因此可以改成任意后缀。
    [NISACTF 2022]bingdundun~_第4张图片
    [NISACTF 2022]bingdundun~_第5张图片

  9. phar文件同理,都要注意后缀名会自动加上.php

你可能感兴趣的:(CTF,php,网络安全)