upload_labs靶场练习

纯纯小白练手

靶场链接:

我用夸克网盘分享了「upload-labs-env-win-0.1.7z」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/7393137310c3

pass-01

上传图片正常

尝试上传bw.php,出现js弹窗,对文件类型进行了限制

前端js验证

1)先写一句话木马,bw.php,修改后缀为.jpg,上传抓包,在bp里面修改为.php,上传成功

2)禁用浏览器js

谷歌:

设置-隐私设置和安全性-网站设置-内容-JavaScript-禁用

火狐:

浏览器输入about:config搜索javascript,javascript.enabled改为false

pass-02

这关是前端js+MIME类型验证

MIME类型

MIME 类型

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。

MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理URL,因此 We b服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会无法解析文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。

语法

MIME 类型通用结构:

type/subtype

MIME 的组成结构非常简单,由类型与子类型两个字符串中间用 / 分隔而组成,不允许有空格。type 表示可以被分多个子类的独立类别,subtype 表示细分后的每个类型。

MIME类型对大小写不敏感,但是传统写法都是小写。

两种主要的 MIME 类型在默认类型中扮演了重要的角色:

  • text/plain 表示文本文件的默认值。
  • application/octet-stream 表示所有其他情况的默认值。

常见的 MIME 类型

  • 超文本标记语言文本 .html、.htmltext/html
  • 普通文本 .txttext/plain
  • RTF 文本 .rtfapplication/rtf
  • GIF 图形 .gifimage/gif
  • JPEG 图形 .jpeg、.jpgimage/jpeg
  • au 声音文件 .auaudio/basic
  • MIDI 音乐文件 mid、.midiaudio/midi、audio/x-midi
  • RealAudio 音乐文件 .ra、.ramaudio/x-pn-realaudio
  • MPEG 文件 .mpg、.mpegvideo/mpeg
  • AVI 文件 .avivideo/x-msvideo
  • GZIP 文件 .gzapplication/x-gzip
  • TAR 文件 .tarapplication/x-tar

Content-Type 和 MIME 的关系

ContentType 和 MIME 的关系

contentType 是 HTTP 请求或响应中的一个头部字段,用于指定主体数据的媒体类型。而 MIME 类型是一种标准化的表示方式,用于标识文档、文件或数据的性质和格式。

contentType 和 MIME 类型之间存在密切的关系。实际上,contentType 用于传输的数据类型通常使用 MIME 类型来表示。在 HTTP 头部中,contentType 字段的值通常是一个有效的 MIME 类型。

例如,当你在 HTTP 请求中使用 Content-Type 头部来指定请求主体的数据类型时,你会设置类似于 application/json、text/html、image/jpeg 等有效的 MIME 类型作为 contentType 的值。

同样地,当你在 HTTP 响应中使用 Content-Type 头部来指定响应主体的数据类型时,你也会设置一个有效的 MIME 类型作为 contentType 的值。

因此,可以说 contentType 是 MIME 类型在 HTTP 请求和响应中的具体体现。它提供了一个标准化的方式来描述传输数据的类型和格式,以便发送方和接收方能够正确地处理和解析数据。

总结起来,contentType 是 HTTP 请求或响应中的一个头部字段,用于指定主体数据的媒体类型。而 MIME 类型是一种标准化的表示方式,用于标识文档、文件或数据的性质和格式。contentType 的值通常使用有效的 MIME 类型来表示传输的数据类型。

1)同样的上传正常图片,修改后缀,写入一句话木马,上传成功

pass-03

同样的上传图片,修改后缀和文件内容,发现回显,黑名单绕过

沾沾:

这个关考的是脚本格外的扩展名,就拿PHP的扩展名不只有.php还有.php3、.php5、.phtml等

Apache服务器是能解析PHP的.php5和.phtml扩展名的,但也不是绝对的这就看Apache服务器是否开启了解析这两个扩展名的配置了

在Apache服务器配置文件中找到:AddType application/x-httpd-php 将注释解除变更为:AddType application/x-httpd-php .php .phtml .phps .php5 .pht 就可以解析了

尝试修改后缀名为.php3,上传成功

pass-04

上传图片马,修改后缀,提示失败

查看源码,这黑名单黑的挺多的

$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");
        $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.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

没有.htaccess,我们可以上传.htaccess文件更改apache配置

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

<FilesMatch "wens.jpg(即将上传的文件名)">

  SetHandler application/x-httpd-php

</FilesMatch>

这段代码的意思是把wens.jpg文件当作php文件执行

上传.htaccess文件,然后再上传wens.jpg图片马

pass-05

大小写绕过

查看源码,发现.htaccess文件也被过滤了

$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 = 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.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

后缀名大小写,绕过

哦莫,有个.ini也没被过滤

先上传.ini文件

.ini

.user.ini文件控制的分为比.htaccess配置文件分为更广,只要使用PHP语言的网站都有影响
重要配置项:auto_prepend_file=文件名:在页面头部加载的文件
auto_append_file=文件名:在页面尾部加载的文件

接着上传wens.jpg,差不多就可以了

但是,上传后文件名是随机的,就没成功

酱酱酱,看看网上佬写的

pass-06

查看源码,发现有字符转换,说明只要后缀会统一转换成小写,大小写转换就不行了,

尝试在大小写后边加空格,发现成功了

$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 = $_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
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file,$img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

pass-07

查看源码:发现多了一句去除字符串,那么第六关的直接在后缀加空格的方法就不可行了,尝试加“.”

$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_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 . '文件夹不存在,请手工创建!';
    }
}

pass-08

查看源码:比较上一关,发现少了一句 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

本关没有对后缀名中的::$DATA进行过滤。在php+windows的情况下:如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名且保持::$DATA之前的文件名。利用windows特性,可在后缀名中加::$DATA绕过

什么是::$DATA

$DATA是window的一个特殊属性,解析时会自动省略掉。

::

$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 = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

pass-09

查看源码:

$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 . '文件夹不存在,请手工创建!';
    }
}

它只去掉一次空格,循环检查,如果末尾是点就向前移一位,知道不是点了就取该位置之前的字符串。

这里的漏洞在于,参数在进行层层过滤的最后没有再次使用deldot()函数来去除末尾的点。

所以可以构造文件名为wens.php. . ,也就是php后面加点空格点空格,这样经过上面代码层层过滤后变为.php.,可以成功绕过黑名单,并且利用windows特性,在保存文件时会自动去除后缀名末尾的点使得apache成功解析。

pass-10

查看源码:str_replace函数,这个函数它是不区分大小写的替换函数,由于str_ireplace只进行了一次删除,这题中是将后缀名字中在黑名单中的替换成空格,采取双写绕过

$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","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $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 = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

好奇怪

pass-11

查看源码:

可以看到这关没了str_replace函数,变成了白名单,只允许jpg,png,gif这三种类型上传

strrpos()函数查找字符串在另一字符串中最后一次出现的位置
move_uploaded_file()函数将上传的文件移动到新位置

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}


$_GET['sava_path']和随机时间函数拼接成文件存储路径。这里构造文件存储路径利用了GET传入,导致服务器最终存储的文件名可控。

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

如在wens.php文件名改为wens.php%00.jpg会被解析为1.php,这样就能绕过后缀限制,上传shell

不过需要满足两个条件:
1、php版本小于5.3.29(直接用5.2.17就行)
2、php.ini的magic_quotes_gpc为OFF状态
PS:网上大部分教程都说小于5.3.4就可以,亲测5.3.29不行,即使magic_quotes_gpc为OFF状态

在..upload/+想修改的文件名.php%00,发现上传成功

访问上传图片路径:

pass-12

查看源码:发现这关和上一关的区别是在路径的拼接方式有get变成了post,同样尝试%00截断

因为是十六进制所以这种截断叫做是0x00截断,其实是%00截断最终被url解码还是会变成0x00的。在url%00表示ascll码中的0,而ascii0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传失败";
        }
    } else {
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

ε=(´ο`*)))唉,直接在post数据中加%00没成功,看了网上佬分享的,原来%00在post数据中不会自动解析,需要url编码一下才可以

上传成功

pass-13

查看源码:

发现只对文件前两个字节识别

function getReailFileType($filename){
    $file = fopen($filename, "rb");//以字节流的形式打开上传的文件
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);   //unpack()解包,标识前两个字符按照c格式,数组索引chars1、chars2  
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); //将两个字节转换为十进制的字符串拼接起来    
    $fileType = '';    
    switch($typeCode){        //根据文件头前两个字节判断是哪种文件类型
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown'; //若不是jpg、png、gif中的任意一种,则设为unknown
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file); //获取文件类型

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}


从源码可以看出,这一关没有对后缀进行过滤,而是对上传文件内容的前两个字节进行校验,并且结合白名单过滤机制只允许jpg、png、gif文件上传。

1)用bp抓包,改包,在文件的前两个字节改为jpg,png,gif

1、用burp抓包,在文件内容的头部添加jpg、png或gif标识的字符串,然后放包来绕过检查。

常用文件头:详细

1、.JPEG; .JPE; .JPG “JPGGraphic File”

2、.gif “GIF 89A”

3、.zip “ZIP Compressed”

4、.doc; .xls; .xlt; .ppt; .apr “MS Compound Document v1 or Lotus Approach APRfile”

直接制作图片马:

首先准备一张正常图片和一句话木马

直接上传

烦!这种上传访问失败,(找到原因了,图片木马制作失败,巴拉巴拉试了好多,都不行,摆烂了今天

)尝试另一种直接上传正常图片,拦包,用bp将木马直接写入

分析代码可以知道它只读2字节,只需要将木马后缀改为图片格式,内容加个图片头部,然后在返回包中找到路径,然后写在file参数后,因为file参数include的原因都会直接执行

见上1)

pass-14

查看源码:

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

只要求索引[2],就是文件的类型的值大于0就可以,所以图片码也可以直接绕过,此函数通过mime也可以通过文件类型来判断是否为图片,这里就测试一个图片马吧,没什么区别,其实我想作者可能是要求我们手动的去伪造各种图片的特点吧。

getimagesize() 函数返回一个数组,数组的第三个元素是图像的类型, 而该函数会通过读取文件头部的几个字符串(即文件头), 来判断是否为正常图片的头部, 我们只需将头部内容修改成图片文件的头部, 例如添加文件头GIF89A, 就可以绕过此机制

随后使用 image_type_to_extension() 函数将图像的类型转换为扩展名

function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

pass-15

查看源码:

exif_imagetype()读取一个图像的第一个字节并检查其后缀名。

function isImage($filename){
    //需要开启php_exif模块
    $image_type = exif_imagetype($filename);
    switch ($image_type) {
        case IMAGETYPE_GIF:
            return "gif";
            break;
        case IMAGETYPE_JPEG:
            return "jpg";
            break;
        case IMAGETYPE_PNG:
            return "png";
            break;    
        default:
            return false;
            break;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

pass-16

查看源码:

绕过二次渲染

将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];

    $target_path=UPLOAD_PATH.'/'.basename($filename);

    // 获得上传文件的扩展名
    $fileext= substr(strrchr($filename,"."),1);

    //判断文件后缀与类型,合法才进行上传操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "png") && ($filetype=="image/png")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefrompng($target_path);

            if($im == false){
                $msg = "该文件不是png格式的图片!";
                @unlink($target_path);
            }else{
                 //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".png";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagepng($im,$img_path);

                @unlink($target_path);
                $is_upload = true;               
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "gif") && ($filetype=="image/gif")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromgif($target_path);
            if($im == false){
                $msg = "该文件不是gif格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".gif";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagegif($im,$img_path);

                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
    }else{
        $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值