upload-labs通关手册

文件上传靶场,搭建了很长时间了,一直没做,刚好最近闲来无事。学习一下

靶场环境

因为环境的不同导致上传的绕过方法也会不同,在这里说明我搭建的环境信息:操作系统为windows,使用的phpstudy的集成环境,php版本为5.2.17,因为1有些题目涉及到00截断上传。apache配置文件没有修改过,是默认的配置文件

闯关笔记

Pass-01

  1. 直接观察源代码,发现不允许上传.php类型文件
 //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
  1. 可以直接抓包就可以绕过上传


    1.1.png
  2. 查看


    1.2.png

Pass-02

  1. 查看源码
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 = '上传出错!';
  1. Content-Type绕过,直接把Content-Type改为图片类型即可


    2.1.png
  2. 上传成功,截图不在赘述

Pass-03

  1. 这一关是另类的文件名的绕过,可以尝试phtml,php3,php4, php5, pht后缀名都可以绕过,但是前提是要在配置文件里面有这样的一句话
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
3.1.png
  1. 源码黑名单
$deny_ext = array('.asp','.aspx','.php','.jsp');

Pass-04

1.看一下他过滤的名单,上面的方法已经不行了

$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");
  1. 但是.htaccess还是没有过滤,可以重写文件解析规则绕过,上传一个.htaccess,文件内容如下,就是在upload目录下匹配gg.jpg的文件并以php文件执行
<FilesMatch "gg.jpg">
SetHandler application/x-httpd-php
</FilesMatch>   
4.1.png
  1. 然后再上传一个名字为gg.jpg的脚本


    4.2.png
  2. 访问,成功上传

Pass-05

  1. 这一题里面多过滤了.htaccess,如何绕过呢?
  2. 对比代码发现去掉了转换为小写,部分代码
 $file_ext = strtolower($file_ext); //转换为小写
  1. 文件后缀大小写混合过滤


    5.1.png

Pass-06

  1. 这一关比第五关少了这样的一句代码
 $file_ext = trim($file_ext); //首尾去空
  1. 后缀名+空格的形式去绕过


    6.1.png

Pass-07

  1. 对比第6题的代码可以发现少了下面一句代码
 $file_name = deldot($file_name);//删除文件名末尾的点
1
  1. 既然没有对文件最后的点做过滤,可以尝试以后缀名加上点的形式去绕过


    7.1.png
  1. 这一题的代码比上一次少了下面这一段代码
 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  1. 文件后缀 + ::$DATA 绕过


    8.1.png

Pass-09

  1. 这一关像是前几关的组合拳
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); //首尾去空
  1. 可以遵循着他的步骤去实现自己的payload,可以这样设置
09.phP. .
9.1.png

Pass-10

  1. 关键过滤的代码就这两句
 $file_name = trim($_FILES['upload_file']['name']);
    $file_name = str_ireplace($deny_ext,"", $file_name);
  1. 双写绕过


    10.1.png

Pass-11

  1. 关键的代码在于这里的’save_path’是一个可控的变量,但是后面还拼接上一个后缀名,也需要绕过
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
  1. 这个时候可以使用%00截断,但这东西有点过气了,因为需要两个条件
php版本小于5.3.4
php的magic_quotes_gpc为OFF状态
  1. 如果要完成这一个题目就必须要实现上面的两个条件,但是现在都PHP7了,这东西也就很少见了,满足上面的条件的时候php就是把它当成结束符,后面的数据直接忽略,这也导致了很多的问题,文件包含也可以利用这一点

  2. 所以如果要绕过,我们可以这样去实现,另save_path等于../upload/11.php%00

11.1.png

Pass-12

  1. 这里的源代码就改了一点点,就是把get改为post类型,一样的方式绕过,只不过这里需要在二进制里面修改%00,因为post不会像get对%00进行自动解码。
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

12.1.png

Pass-13

  1. 这里可以发现源代码只是用了unpack这一个函数去实现对于php前两个字节的检测,也就是只是对文件头做检测。。。
$bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    

  1. 直接上传 在bp中构造 shell


    13.1.png
  2. 把该图片上传上去,尝试文件包含,成功回显

http://192.168.3.8/bachang/shangchuan/include.php?file=./upload/9920190725190903.gif

Pass-14

  1. 用了getimagesize函数来对文件类型做判断
    14.1.png

Pass-15

  1. 同理

Pass-16

  1. 具体针对二次渲染的上传绕过可以看这篇文章upload-labs之pass 16详细分析,我试了下gif文件的绕过

  2. 先上传一个gif文件,修改没有二次渲染后没有变动的地方。插入shell


    16.1.png
  3. 利用文件包含成功执行php语句


    16.2.png

Pass-17和18

  1. 条件竞争上传

Less-19

  1. 这一关正常做法应该是CVE-2015-2348 move_uploaded_file()00截断,上传webshell,同时自定义保存名称,上传的文件名用0x00绕过。改成xx.php【二进制00】jpg
  2. move_uploaded_file()函数中的_img_path_是由post参数save_name控制的,因此可以在save_name利用00截断绕过
    19.1.png

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 = "请选择要上传的文件!";
}

首先end函数取所post参数数组中的最后一个值,_$file_name = reset($file) . '.' . $file[count($file) - 1]_我们可以post一个参数名为一个[0]一个[2],然后file[count(file) - 1]就为空,file_name最终就为reset(file)即$file[0],就可以绕过判断

20.1.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • title: upload-labsdate: 2019-04-17 09:20:52tags:- 文件上传cat...
    Miracle778阅读 11,507评论 0 7
  • 文件上传漏洞 常见的漏洞分类服务器配置不当导致文件上传开源编辑器存在上传漏洞本地文件上传限制可以上传被绕过服务器端...
    二潘阅读 17,118评论 2 3
  • Pass-01(前端JS绕过) 方法一:前端检测。js的检测只能位于client,可以禁用js,在浏览器设置中修改...
    简言之_阅读 2,344评论 0 2
  • 文件上传的目的是通过上传.php文件,从而植入木马,然后通过菜刀进行连接,最终get shell 0x01 Pas...
    Hf1dw阅读 1,193评论 0 0
  • (源自摘抄整理)https://www.91ri.org/11494.html Webshell实现与隐藏探究 一...
    JackyTsuuuy阅读 20,750评论 2 13