Upload_labs by L0st

中间件漏洞

IIS

  1. IIS6.0文件解析 xx.asp;.jpg
  2. IIS6.0目录解析 xx.asp/1.jpg
  3. IIS 7.0畸形解析 xxx.jpg/x.asp

Apache

  1. %0a(CVE-2017-15715)
  2. 未知后缀 test.php.xxx

Nginx

  1. 访问连接加/xxx.php test.jpg/xxx.php
  2. 畸形解析漏洞 test.jpg%00xxx.php
  3. CVE-2013-4547 test.jpg(非编码空格)\0x.php

Tomcat

  1. xxx.jsp/
  2. xxx.jsp%20
  3. xxx.jsp::$DATA

Upload-Labs练习

pass-01

传一个php文件上去,点上传,弹窗说该文件不允许上传,根据处理的速度推断应该是前端判断文件是否合法,故查看源码,果然有一段javascript:

<script type="text/javascript">
    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;
        }
    }
</script>

我们直接在页面元素中将onsubmit事件删除,就可以上传了。
也可以修改文件名称为1.jpg,然后用burp suite抓包修改文件名为1.php,绕过前端检查。

pass-02

上传1.jpg然后burpsuite修改后缀即可。

    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists($UPLOAD_ADDR)) {
            if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
                if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                    $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                    $is_upload = true;

                }
            } else {
                $msg = '文件类型不正确,请重新上传!';
            }
        } else {
            $msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
        }
    }

可以看到,服务端通过检查MIME来确定文件类型

pass-03

上传一个.php文件,提示不允许上传asp,aspx,php,jsp后缀文件,那么我们就从后缀下手

Apache服务器有一个特性,会从右往左开始解析文件后缀,如果最右边的扩展名不可识别,就继续往左判断,直到遇到可以识别的后缀为止,所以这里我们上传 1.php.xxxxx 即可绕过

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
                 $img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
                 $is_upload = true;
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}

既然基于黑名单判断,那么我们需要知道Apache可以解析php,phtml后缀的文件,故上传 1.phtml直接绕过

pass-04

  1. 此处基于依旧可以通过上传 1.php.xxxx 绕过检查
  2. 上传.htaccess进行覆盖也可以:
    上传一个.htaccess文件含有以下内容:
SetHandler application/x-httpd-php 

或是

<FilesMatch ".jpg">
SetHandler application/x-httpd-php
</FilesMatch>

然后随便上传任意后缀的文件,apache均会当作php解析.
源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".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)) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}

pass-05

  1. 利用apache解析特性上传1.php.xxxx绕过
  2. 查看源码发现没有对文件名进行大小写统一,故1.PHP既可绕过验证

pass-06

  1. 利用apache解析特性上传1.php.xxxx绕过
  2. 用Burpsuite抓包修改文件名,后缀末尾加空格即可绕过

pass-07

  1. 直接上传1.php.xxxx
  2. 在文件后缀名加 . (Windows系统会自动去除文件名末尾的.和空格)

pass-08

看源码发现这里没有对文件名进行去 ::DATA 操作,故直接后缀末尾加 ::DATA 即可绕过。

pass-09

查看源码的过滤规则,将文件名设置为 '1.php. .' 即可绕过规则检查

pass-10

程序使用str_ireplace函数替换掉了文件名中的敏感字,但该函数只会匹配一次,
故我们双写后缀名来绕过: 1.pphphp

pass-11

查看源码发现使用白名单过滤,但通过url中通过get方式提交了 save_path 参数,并将其拼接到文件名中,
故我们修改 /?sava_path=../upload/1.php%00 使用%00将 $_GET('save_path') 后面的文件名截断。
然后上传1.jpg绕过

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

pass-12

与pass-11无异,只是将提交save_path参数的方法改成了POST,用burpsuite抓包修改即可。

pass-13

查看源码发现通过读取文件前两个字节判断文件类型,所以需要我们制作图片马:
copy normal.jpg/b+shell.php/a webshell.jpg

参数/b指定以二进制格式复制、合并文件; 用于图像类/声音类文件
参数/a指定以ASCII格式复制、合并文件。用于txt等文档类文件

pass-14

程序通过使用 getimagesize() 函数获取图片信息,故仍制作图片马绕过检查

pass-15

程序通过使用 exif_imagetype() 函数获取文件类型,故仍制作图片马绕过检查

pass-16

查看源码看到后端程序对图片进行了imagecreatefromgif()操作,即判断文件是否为合法gif文件,
这里我们上传图片马,然后用burpsuite抓包,在 Content-Type 下两行,即文件内容开头处添加
GIF89a ,即可绕过验证

绕过imagecreatefromgif()函数的方法
https://secgeek.net/bookfresh-vulnerability/

pass-17

竞争条件

pass-18

竞争条件

pass-19

在文件名处使用0x00截断符绕过

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

推荐阅读更多精彩内容

  • 最近刚出的一个用来练习文件上传漏洞的一个教程--------upload-labs;它的任务是上传一个webshe...
    不吃鱼的猫_de06阅读 3,063评论 0 0
  • 在upload-labs第四题中,我们查看源码会发现 它是一个黑名单,禁止了所有的黑名单后缀的绕过方式,这时你就可...
    不吃鱼的猫_de06阅读 2,978评论 0 0
  • (源自摘抄整理)https://www.91ri.org/11494.html Webshell实现与隐藏探究 一...
    JackyTsuuuy阅读 20,318评论 2 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 莫不是梨花带泪 便不会悉数珍藏 任它镂空,襟满风霜 是隆冬拿起麦克清唱 是一番番梦魇腿着远游 关内灯火通明的城不知...
    封城雪阅读 329评论 5 8