upload-labs通关教程

一.第一关(前端绕过)

首先准备一个php小马

  <?php phpinfo();?>

这是调用phpinfo这个函数,查看php的配置信息

首先上传1.php发现

使用BP抓不到包,猜测被前端验证了,查看网页源代码

可以看到下面有一段js代码过滤了,只能传.jpg/.png/.gif,进行了白名单过滤,所以我们需要禁用前端的js代码

使用这个扩展可以禁用前端代码的执行,也可以直接按F12进入开发者模式,在按F1进入设置

这里可以禁用js代码

右键在新窗口打开,出现下面的页面就成功了

二.第二关(后端绕过)

上传1.php发现不行,看看源码

可以看到这段php代码进行了后端的验证,我们进行BP抓包

修改Content-Type: image/jpeg、image/png、image/gif(上述三种任选其一),重新发包

进来可以发现成功了,右键新窗口打开

三.第三关(后缀名绕过)

上传1.php,发现进行了黑名单过滤

在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。

看看源代码

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

四.第四关(.htaccess绕过)

尝试上传4.php、4.php5、4.phtml以及各种大小写后缀均绕过失败,查看提示

发现有一个文件是没有过滤的,即上传中常用到的 .htaccess文件、

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
.htaccess的用途范围主要针对当前目录。

.htaccess文件的内容

​
<FilesMatch "4.png">
SetHandler application/x-httpd-php
</FilesMatch>

​

在上传4.png即可,小编没尝试成功,不理解

但是还有办法 windows特性后缀xxx.php. .上传文件之后会自动去掉后面的内容

上传成功了

五.第五关(.user.ini.绕过)

和第四关一样了

六.第六关(大小写绕过)

发现没有使用

strtolower($file_ext)

所以采用大小写绕过

大小写绕过原理:
Windows系统下,对于文件名中的大小写不敏感。例如:test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感。例如:test.php和 TesT.php就是不一样的。

七.第七关(空格绕过)

发现这段没有使用trim去掉空格,所以我们进行空格绕过

成功

八.第八关(.绕过)

Windows系统下,文件后缀名最后一个点会被自动去除。上传 1.php.

九.第九关(特殊字符::$DATA绕过)

补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。

成功上传

十.第十关(黑名单)

补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来

和第五关一样

十一.第十一关(双写绕过)

 $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","ini");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name;        

发现他把array数组里的都给进行了替换但是只进行了一次

成功上传

十二.第十二关(get00截断)

这一关白名单,最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4

原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

上传zoe.php用BP抓包修改参数,把upload/后面加上zoe.php%00(即图二),下面的filename=”zoe.php”改为zoe.png

十三.第十三关(post 00截断)

这一关白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单

补充知识:POST不会对里面的数据自动解码,需要在Hex中修改。

十四.第十四关(图片马unpack)

补充知识:
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。

cmd使用 copy 777.png/b + zoe.php pass14.png 制作图片马,上传图片马

因为上传图片马之后会被重命名图片所以下面的payload的图片名字可以在上传之后复制图片链接就可以了

构造的URL为include.php?file=upload/3420210320172751.png

十五.第十五关(getimagesize图片马)

通过使用getimagesize()检查是否为图片文件,所以还是可以用第十四关的图片马绕过,并使用文件包含漏洞解析图片马

构造的URL为include.php?file=upload/8620210320174003.png

如果出现如下图情况代表图片马是成功解析了

十六.第十六关(exif_imagetype图片马)

和14一样

十七.第十七关(二次渲染绕过)

这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接

补充知识:
二次渲染:后端重写文件内容
basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名
strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像

这里有个小提示,对于做文件上传之二次渲染建议用GIF图片,相对于简单一点

上传正常的GIF图片下载回显的图片,用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,上传带有PHP一句话木马的GIF图片

为了方便大家测试,这里提供一张网上某个大佬提供的GIF图片,当时我也找了很久,大家可以保存一下https://wwe.lanzoui.com/iFSwwn53jaf

利用文件包含漏洞


构造的URL为include.php?file=upload/31608.gif

十八,十九(条件竞争)

二十.第二十关

没有对上传的文件做判断,只对用户输入的文件名做判断
后缀名黑名单
上传的文件名用户可控
黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.

先准备PHP一句话木马,并把后缀名改为PNG再上传

二十一.第二十一关

upload-labs第21关分析与答案 - Ling-X5 - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Smile灬凉城666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值