Upload-labs文件上传漏洞练习(1-5)

文件上传漏洞练习

Upload-labs是一个帮你总结所有类型的上传漏洞的靶场,包括常见的文件上传漏洞:
项目地址:https://github.com/c0ny1/upload-labs
第一关
直接上传php木马,发现前端报错:
这里写图片描述

使用传统的抓包,修改后缀名。是可以上传成功的,但是不是这一关的目的,我们看看源代码分析一波。

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    //document.getElementsByName()方法可返回带有指定名称的对象的集合
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}

可以看到,只是在客户端使用js对不合法图片进行检查,我们可以尝试绕过。

如果是
前端验证我们可以选择火狐浏览器中的NoScript插件禁用js,这样我们就可以安全的上传。
这里写图片描述

安装后开启,对于前端上传的绕过就很愉快了!
这里写图片描述
对于前端的过滤没有必要这么复杂,只是介绍下那个工具,其实,是可以这样,直接把过滤的函数cheakfile()在上传前删掉,也可以上传成功。
这里写图片描述
或者修改参数。
这里写图片描述


第二关(对数据包的MIME进行检查)
第二关先进行黑盒测试,发现上传正常图片、修改后缀名的(dama.php改为dama.jpg)、抓包修改后缀名(上传dama.jpg抓包改为dama.php)、修改文件类型(上传dama.php,修改Content-Type: image/gif)成功上传木马。
这里写图片描述
这就说明只是服务器对后缀名进行验证,绕过问题不大。我们查看原代码分析下:



$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            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 = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

基础知识:

$_FILES["file"]["name"] – 被上传文件的名称
$_FILES["file"]["type"] – 被上传文件的类型
$_FILES["file"]["size"] – 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] – 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] – 由文件上传导致的错误代码
move_uploaded_file(file,newloc) 函数将上传的文件移动到新位置。
参数  描述
file    必需。规定要移动的文件。
newloc  必需。规定文件的新位置。
如果 file 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 false。
如果 file 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 false,此外还会发出一条警告。

发现只对文件类型进行过滤,比较简单。


第三关(禁止上传.asp|.aspx|.php|.jsp后缀文件)
用上面方法发现上传都不行,发现对.asp|.aspx|.php|.jsp后缀名进行了严格的限制。
这里写图片描述
所以我们只能上传别的类型的啦,比如尝试用php3,phtml绕过:
我们直接上传dama.phtml,或者其他文件可以上传成功。
这里写图片描述
我们上传成功后,尝试连接dama.phtml
这里写图片描述
发现是可以的,当然这个漏洞也是比较鸡肋,有些上传上去解析不来,这和服务组件相关配置有关,我使用的是Apache,不成功的话可以修改配置文件。在Apache的配置文件httpd.conf文件中少加了语句即可:AddType application搜索/x-httpd-php .php .html .phtml
分析下源代码吧:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $file_name = trim($_FILES['upload_file']['name']);//trim()去点文件的空格
        $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 . '文件夹不存在,请手工创建!';
    }
}

代码可以看到利用黑名单进行过滤,而且还过滤大小写等等。


第四关(禁止上传.asp|.aspx|.php|.jsp等常见后缀文件)
发现使用上面上传的phml或者其他类型的文件,都以失败告终。
但是发下有一个文件是没有过滤,也是我们上传过程中经常用到的.htaccess

.htaccess基础知识*重点内容*
.htaccess文件(或者”分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
它里面有这样一段代码:AllowOverride None,如果我们把None改成All
这里写图片描述
笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
好了,我们开始上传一个.htaccess内容如下的文件:

SetHandler application/x-httpd-php

上传成功,我们再上传一个图片马:
这里写图片描述
发现成功上传,可以访问一下,发现成功执行:
这里写图片描述
查看下源代码再分析下:

$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");

和上面比就多了这么一些限制条件,但是还是成功绕过。


第五关(禁止上传.asp|.aspx|.php|.jsp包括.htaccess等常见后缀文件)
现在这个.htaccess是上传不来。分析下代码发现,他少了这么一行比较出现比较严重的问题。

 $file_ext = strtolower($file_ext); //转换为小写

可以看到在第五关代码中没有这个

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

所以我们可以通过大小写进行绕过了:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29647709/article/details/81227084