文件上传 upload-labs

这个靶场环境在BUUCTF的Basci => Upload-Labs-Linux 1

思维导图

客户端 检查

Pass-1 js检查

1.浏览器(FireFox)禁用js

about:config

2.F12删除掉检查函数
文件上传 upload-labs

文件上传 upload-labs

服务端 黑名单

Pass-2 MIME-Type类型

这关只对Content-Type:进行了验证

if (($_FILES[‘upload_file‘][‘type‘] == ‘image/jpeg‘) || ($_FILES[‘upload_file‘][‘type‘] == ‘image/png‘) || ($_FILES[‘upload_file‘][‘type‘] == ‘image/gif‘)) {
           ......
        } else {
            $msg = ‘文件类型不正确,请重新上传!‘;
        }

1.修改Content-Type

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

文件上传 upload-labs
2.Burp改包shell.png =>shell.php

Pass-3 可解析特殊后缀

$deny_ext = array(‘.asp‘,‘.aspx‘,‘.php‘,‘.jsp‘);
......
$img_path = UPLOAD_PATH.‘/‘.date("YmdHis").rand(1000,9999).$file_ext; 

上传特殊后缀文件,能被php解析,但文件名被改了
文件上传 upload-labs
1.Proxy->Repater->raw记着改过后的文件名
2.直接就拖图片到搜索框(图片的href就是它保存的位置)

Pass-4 分布式配置文件 .htaccess

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

虽然没有过滤pphhpp但它解析出来是文本形式,怎么把它解析成php呢

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
Unix、Linux系统或者是任何版本的Apache Web服务器都是支持.htaccess的,但是有的主机服务商可能不允许你自定义自己的.htaccess文件。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。

.htaccess

<FilesMatch "任意后缀木马文件名"
SetHandler application/x-httpd-php
</FilesMatch>

上传shell.hugboy马,蚁剑连接
文件上传 upload-labs

Pass-5 大小写绕过

这关删去了此行代码

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

Pass-6 空格绕过 (windows)

if (!in_array($file_ext, $deny_ext)) {
            ......
        } else {
            $msg = ‘此文件不允许上传‘;
        }

代码比较时会带上空格去和黑名单匹配,burp改包文件名shell.php windows会自动忽略后面的空格
识别为shell.php

Pass-7 点号绕过

这关删去了此行代码

$file_name = deldot($file_name);//删除文件名末尾的点

Burp改包shell.php=>shell.php.

Pass-8 ::$DATA绕过 (windows)

这关删去了此行代码

$file_ext = str_ireplace(‘::$DATA‘, ‘‘, $file_ext);//去除字符串::$DATA

在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,
且保持::$DATA之前的文件名,他的目的就是不检查后缀名
例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"

Burp改包shell.php=>shell.php::$DATA

Pass-9 点+空格+点 (windows)

虽然有以下检查

        $file_name = deldot($file_name);//删除文件名末尾的点
        ......
        $file_ext = trim($file_ext); //首尾去空

但我们Burp改包shell.php=>shell.php. .相当于Pass-7 点号绕过

Pass-10 双写绕过

$file_name = str_ireplace($deny_ext,"", $file_name);

上传shell.pphphp,shell.phphpp。。。

服务端 白名单

文件上传 upload-labs

上一篇:浏览器输入 URL 之后发生了什么


下一篇:微信小程序 - 更改radio和checkbox选中样式