upload-labs关卡记录

web安全基础系列之文件上传漏洞–学习输出
upload-labs关卡记录_第1张图片

目录

    • 1(前端验证)
    • 2(MIME验证)
    • 3(黑名单验证/特殊后缀)
    • 4(黑名单验证.htaccess)
    • 5(黑名单验证,.user.ini.)
    • 6(黑名单验证,大小写绕过)
    • 7(黑名单验证,空格绕过)
    • 8(黑名单验证,点号绕过)
    • 9(黑名单验证,特殊字符::$DATA绕过)
    • 10(黑名单验证,路径拼接绕过)
    • 11(黑名单验证,双写绕过)
    • 12(白名单验证,0x00截断)
    • 13(白名单验证,0x00截断)
    • 14-16(白名单验证,图片webshell)
    • 18-19(白名单验证,竞争条件)
    • 20
    • 21
    • 遗漏
    • 防御

1(前端验证)

直接抓包改包
upload-labs关卡记录_第2张图片
upload-labs关卡记录_第3张图片

upload-labs关卡记录_第4张图片

2(MIME验证)

源码分析
upload-labs关卡记录_第5张图片抓包
把Content-Type改为image/jpeg
upload-labs关卡记录_第6张图片
upload-labs关卡记录_第7张图片

3(黑名单验证/特殊后缀)

分析源码,在黑名单列表的后缀为asp,aspx,php,jsp
upload-labs关卡记录_第8张图片
抓包修改特殊后缀phtml
upload-labs关卡记录_第9张图片成功上传
在这里插入图片描述

4(黑名单验证.htaccess)

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".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",".ini");
        $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)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

查看源码,可以看到,黑名单里php、php5等这种后缀全部不允许上传,但并没有限制.htaccsess文件。故可以上传.htaccsess文件绕过

SetHandler application/x-httpd-php

设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。
upload-labs关卡记录_第10张图片然后上传
接下来再上传图片马,就可以进行解析。
在这里插入图片描述

5(黑名单验证,.user.ini.)

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".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 = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

这里再过滤了.htaccess,但是还有个ini配置文件可以利用。
可以理解为在运行php文件时都会先运行的一个配置文件,他可以修改一些配置信息,而不用修改php.ini

auto_prepend_file=1.gif

所有的php文件都自动包含1.gif文件。.user.ini相当于一个用户自定义的php.ini。
upload-labs关卡记录_第11张图片然后上传
接下来再上传1.gif图片马,就可以进行解析
upload-labs关卡记录_第12张图片

6(黑名单验证,大小写绕过)

upload-labs关卡记录_第13张图片

发现没有将后缀进行大小写统一,于是可以通过大小写绕过。
用burp将后缀改为大写PHP即可。

7(黑名单验证,空格绕过)

upload-labs关卡记录_第14张图片没有对文件后缀名的空格过滤。

Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。

针对这样的情况需要使用Burpsuite截断HTTP请求之后,修改对应的文件名 添加空格,即可成功绕过。

8(黑名单验证,点号绕过)

upload-labs关卡记录_第15张图片
查看源码,发现没有删除文件名末尾的点。
针对这样的情况需要使用Burpsuite截断HTTP请求之后,在对应的文件名后面添加. 即可成功绕过。

9(黑名单验证,特殊字符::$DATA绕过)

upload-labs关卡记录_第16张图片查看源码,发现没有过滤掉 :: D A T A 。 使 用 B u r p s u i t e 截 断 H T T P 请 求 之 后 , 在 对 应 的 文 件 名 后 面 增 加 : : DATA。 使用Burpsuite截断HTTP请求之后,在对应的文件名后面增加:: DATA使BurpsuiteHTTP::DATA,上传成功。
upload-labs关卡记录_第17张图片
在这里插入图片描述

10(黑名单验证,路径拼接绕过)

upload-labs关卡记录_第18张图片分析源码,可以看出上传后的文件没有经过随机化重命名,而是直接拼接,然后保存在服务器上,这就给了我们机会绕过黑名单。

选择10.php文件进行上传,抓包后构造文件后缀为php. .(去点号再去空格,windows再去一个点号),成功绕过。
upload-labs关卡记录_第19张图片在这里插入图片描述

11(黑名单验证,双写绕过)

upload-labs关卡记录_第20张图片查看源码后,发现其对存在黑名单中的字符进行替换,但str_ireplace()函数只替换一次,因此修改文件名为11.pphphp后成功绕过。

12(白名单验证,0x00截断)

0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。

系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。

在PHP5.3之后的版本中完全修复了00截断。并且00截断受限与GPC,addslashes函数。

upload-labs关卡记录_第21张图片查看源码和提示,上传路径可控,并且是最终文件的存放位置是以拼接的方式,可以使用%00截断。
upload-labs关卡记录_第22张图片将1.jpg上传,抓包后修改URL,成功上传。

13(白名单验证,0x00截断)

post型的00截断
在post请求中,%00不会被自动解码,需要在16进制中修改00
upload-labs关卡记录_第23张图片

upload-labs关卡记录_第24张图片

14-16(白名单验证,图片webshell)

上传webshell.jpg
在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。


GIF98A

	phpinfo();

?>


在这里插入图片描述无法显示。

接下来结合文件包含漏洞进行测试
upload-labs中提供了一个include.php文件
upload-labs关卡记录_第25张图片利用include.php再文件包含pass14.gif
upload-labs关卡记录_第26张图片成功绕过

18-19(白名单验证,竞争条件)

分析源码,这里对文件先进行上传,后进行判断与删除。
利用时间差在它删除之前进行webshell上传。
为了使实验效果更加明显,在源码加入sleep(2),让它等待2秒
upload-labs关卡记录_第27张图片
用python提前不断访问代码文件
upload-labs关卡记录_第28张图片
在这里插入图片描述
上传文件代码,把一句话木马写进一个shell.php的新文件里
upload-labs关卡记录_第29张图片
upload-labs关卡记录_第30张图片成功上传
在这里插入图片描述upload-labs关卡记录_第31张图片

20

同样是上传路径可控,可以使用和Pass-13同样的方式绕过。不同的是这里的黑名单,可以文件名称保存的时候,加上.,最末的.号使得pathinfo()获取到的PATHINFO_EXTENSION为空,从而绕过黑名单.

21

参考添加链接描述

遗漏

1.Apache解析漏洞介绍

因为Apache认为一个文件可以拥有多个扩展名,哪怕没有文件名,也可以拥有多个扩展名。Apache认为应该从右到左开始判断解析方法的。如果最右侧的扩展名为不可识别的,就继续往左判断,直到判断到文件名为止。

2.还有IIS6.0这个历史坑的漏洞

防御

1.黑白名单;
2.对上传的文件重命名,不易被猜测;
3.对上传的内容进行读取检查;
4.不要暴露上传文件的位置;
5.禁用上传文件的执行权限;

你可能感兴趣的:(upload-labs关卡记录)