upload-labs题解

目录

         一、pass-01(js前端验证)

二、pass-02(ContentTpye头检测文件类型绕过)

三 、pass-03(文件后缀的判断(黑名单绕过)

四、pass-04(重写解析规则绕过)

五、pass-05(大小写绕过)

六、pass-06(后缀名加空格绕过) 

七、pass-07(后缀名加点绕过) 

 八、pass-08(后缀名加::$DATA绕过)

九、pass-09(利用函数依次执行来绕过)(. .)

十、pass-10(双写绕过替换规则)

十一、pass-11(白名单GET的%00绕过) 

十二、POST的00截断

十三、pass-13(文件头检测,图片马文件包含) 

十四、(文件头检测,图片马文件包含)

​十五、pass-15(文件头检测,图片马文件包含) 

十六、pass-16(二次渲染绕过)

十七、条件竞争绕过文件删除


一、pass-01(js前端验证)

直接跳出弹幕框--前端认证(在前端已经被拦截了,没有上传到后端,所以无法第一时间进行抓包)

查看源码

发现前端对文件类型进行了过滤

解决方法:

  1. 在本地客户端禁用js.(用户点击上传按钮(submit)后,会触发js事件--οnsubmit='return checkfile()";)
  2. 通过浏览器审查元素对网页代码的查看,删除onsubmit事件

作者采用了第二种方法,删除后,复制图像信息进行访问。

上传成功:

二、pass-02(ContentTpye头检测文件类型绕过)

上传一个php文件

提示文件类型不正确--当浏览器上传文件到服务器的时候,服务器会对文件Content-Type类型进行检查,如果 白名单允许则上传成功,否则上传失败。

解决方法:利用burpsuite对Content-Type类型修改为符合上传类型

 改包:改content-type

三 、pass-03(文件后缀的判断(黑名单绕过)

 通过查询服务器核心源代码发现,服务端对文件后缀进行了判断,防止脚本文件的上传。

解决方法:

phpt,phtml,php3,php4,php5,php6为php扩展,这些文件名也是可以解析的,通过上传php扩展绕过黑名单检查。

环境配置:配置httpd-conf文件,添加php扩展,注意去掉注释符#,配置完后重启phpstudy

 用burpsuite抓包,修改后缀名(可以直接修改完后放包,也可使用重发器)

 复制图像信息进行访问验证

四、pass-04(重写解析规则绕过)

.htaccess文件是Apache 服务器中的一个配置文件,他负责相关目录下的网页配置。一般.htaccess可以用来留后门和针对黑名单绕过。

上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。.htaccess文件内容如下

用notepad++编写代码(和phpinfo验证或一句话木马在同一目录下)一般只用命名.htaccess然后在上传shell.php(phpinfo验证,或一句话木马)文件,把文件名称改包修改为.htaccess中设置的一样的名字01.png,这个时候01.png就会被当做php执行

五、pass-05(大小写绕过)

 漏掉了转换大小写

六、pass-06(后缀名加空格绕过) 

漏掉去除空格

七、pass-07(后缀名加点绕过) 

漏掉除去末尾的点,利用windows会制动处理文件末尾的点和空格,可在文件后缀加点绕过

 八、pass-08(后缀名加::$DATA绕过)

漏掉::$DATA

上传成功后,在upload目录下的文件名会自动的去掉::$DATA,之后访问直接访问php就行了

九、pass-09(利用函数依次执行来绕过)(. .)

之前所用到的方法均被限制,所以开辟新的思路,我们可以看到,上传时路径拼接的是$file_name(源文件名),利用代码执行一个漏洞,可以一个函数一个函数从上到下绕过 故可以构造1.php. .(点空格点)绕过,上传后,deldot先删除掉文件名最后一个".",再由trim出去空格,最后剩下了1.php.,结合Windows特性会自动去掉后缀的“.” 、“空格”和“::$DATA”,就变成了1.php,即可上传成功。

十、pass-10(双写绕过替换规则)

str_ireplace(find,replace,string,count)函数替换字符串中的一些字符(不区分大小写)。如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。上面代码中是,在上传的文件原名中,查找是否有包含在黑名单($deny_ext)中的,有的话就替换为空。对str_ireplace()函数的绕过可以用双写绕过替换规则。
上传文件1.php,抓包,修改文件名为1.pphphp,这样str_ireplace将后缀中的php删除了,但两边的"p"和"hp"拼起来又是一个“php”了

十一、pass-11(白名单GET的%00绕过) 

环境配置:(11,12都需要)配置php版本小于5.3.29且php.ini中的magic_quotes_gpc为OFF状态,配置好后记得重启。

 保存的时候是用get方式获取拼接的,所以说前面是可控的

  这样就$img_path =/upload/1.php%00/.rand(10, 99).date("YmdHis").".".$file_ext;(保存后的文件名),由于00截断,%00后面的全部忽略,就只剩下$img_path =/upload/01.php,并且01.png被保存为了01.php

十二、POST的00截断

GET传参的时候,会自动进行URL解码,POST不会,所以本题需要用hex进行修改

%00用来拦截和占位,将%00改为 00 00 00

 

 

 同样返回php文件即可

十三、pass-13(文件头检测,图片马文件包含) 

制作图片马

 利用文件包含漏洞访问图片马

十四、(文件头检测,图片马文件包含)

getimagesize()函数读取文件头检测是否为图片

也可利用13题类似方法绕过

问题采用添加文件幻数(文件开头两个字节)绕过

在原有的phpinfo验证带吗文件前加GIF89a

同样利用文件包含漏洞访问

 十五、pass-15(文件头检测,图片马文件包含) 

 同13方法

十六、pass-16(二次渲染绕过)

$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的图片文件!";
    }
}

 利用hex编辑器解码

上传图片马,将上传前后的图片马进行对比 

在不同的地方加上验证<?php phpinfo();?>上传访问

十七、条件竞争绕过文件删除

文件上传之竞争条件
在服务器删除我们上传的非法文件之前,访问这个文件,从而生成另一个木马文件,用这个木马文件getshell
 
文件上传过程
用户上传文件,服务器获取文件,然后保存临时文件,然后使用移动函数(比如php中的move_uploaded_file() ),才会将文件移动到站点的根目录下面
 
竞争条件原理
网站允许上传任意文件,然后检测文件中若有webshell,就删除文件;若不是指定类型文件,那么就使用unlink删除文件
 
在删除之前访问上传的php文件,从而执行上传文件中的php代码
 
 
(竞争条件攻击)
 
审计代码,发现这关是先允许上传任意文件,,然后用白名单对比检查上传的文件,,如果上传的文件后缀不被白名单包含,,则直接删除
 
方法:写一个php脚本(被访问时会创建另一个脚本,这个如果创建成功,不会被删除),,用burpsuite抓包,,多线程去一直上传,,再抓个访问包,,多线程一直访问,同时进行,总有一刻会在文件被删除之前访问到脚本,,创建shell成功 

创建webshell文件

本片博客参照如下文章学习,大部分方法知识来源于这篇文章 


Upload-labs通关总结_WHOAMIAnony的博客-CSDN博客_upload-labs通关

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

syy️️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值