文件上传及验证绕过
文件上传及验证绕过
文件上传常见点
上传头像
上传相册
上传附件
添加文章图片
前台留言资料上传
编辑器文件上传
......
客户端—JS绕过
docker pull cuer/upload-labs
docker run -d -p 8082:80 cuer/upload-labs
43.136.41.84:8082 Pass-01
Upload-labs(Pass-01)源码分析,通过验证发现是前端JS验证。而前端验证,几乎没有什么防护作用
禁用JS
浏览器直接禁用JS,先按F12,然后按F1,找到禁用JS
phpinfo
<?php phpinfo();?>
PHP一句话木马
<?php eval(@$_GET['a']);?>
直接上传php木马,上传成功
浏览器访问shell
<?php eval(@$_POST['a']);?>
后缀名绕过
修改前端代码
服务端黑名单绕过
特殊可解析后缀
Upload-labs(Pass-03)根据源码可以看出,只是做了个简单的后缀名黑名单,识别上传文件的类型是 否为 '.asp','.aspx','.php','.jsp' 中的一个,若是其中的一个,则不允许上传。
但是可以上传其他任意后缀。比如说:. phtml .phps .php5 .pht ,但如果上传的是.php5这种类型文 件,想要被当成php执行的话,需要有个前提条件:即Apache的httpd.conf有如下配置代码(靶场环境 未配置好,仅做上传测试)。
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
所以由于服务端采用黑名单的过滤方式,这里可以使用php3或者php5后缀上传,直接修改后缀名,上 传成功
右键“复制图像链接”则为shell的链接(此靶机环境测试未解析,仅作上传测试即可)
http://43.136.41.84:8082/upload/202302201306229890.php3
大小写绕过(√)
http://43.136.41.84:8082/upload/202302201312386311.Php
Upload-labs(Pass-06)通过查看源码可以发现,虽然设置了黑名单对常见的后缀进行过滤,但并未对 后缀名大小写进行统一。可以利用大小写进行绕过。例如:.PHp
点绕过(√)
Upload-labs(Pass-08)分析代码没有去除点,直接在文件后面加上点
空格绕过
Upload-labs(Pass-07)通过代码分析没有去空格,在文件后缀加空格后上传
配合解析绕过
Upload-labs(Pass-10)
这一关的思路是它没有循环验证,也就是说这些首尾去空,删除末尾的点,去除字符串:$SDATA,转换 为小写这些东西只是验证了一次,所以绕过思路也很简单:在数据包中把后缀名改为.php. .(两个点之 间有个空格)
验证过程:首先系统发现最后有一个点,这时会把它去掉,又发现有一个空格,也会把它去掉,这时还 有一个点,也就是.php. 由于系统只验证一次,所以不会再去掉剩下的点,这时就可以上传成功。
.htaccess文件绕过(√)
在利用.htaccess文件之前,我们先来了解一下什么是.htaccess规则文件。
.htaccess文件(或者"分布式配置文件")全称是Hypertext Access(超文本入口)。
提供了针对目录改变配置的方法, 即 在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可
以帮我们实现:
网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列
表、配置默认文档等功能。上传.htaccess文件,来绕过黑名单。
前提条件
1.mod_rewrite模块开启。
2.AllowOverride All
Upload-labs(Pass-04)源码分析,这个比03增加了黑名单量。但是,中间件为Apache的情况下,黑 名单未校验htaccess文件,导致可上传htaccess文件,绕过黑名单检测。
::$DATA绕过
在Windows中,如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且 保持::$DATA之前的文件名。使用它的目的就是不检查后缀名,例如:
phpinfo.php::$DATA
Windows会自动去掉末尾的::$DATA变成 phpinfo.php Upload-labs(Pass-09)抓包修改文件后缀
双写后缀名绕过(√)
Upload-labs(Pass-11)从源码中可以发现,源码中定义了黑名单列表,我们上传文件的后缀名凡是符 合黑名单中任意一个后缀都会被替换为空,那么我们可以利用双写后缀的方式进行绕过。例如:
phpinfo.pphphp 替换后变成 phpinfo.php
服务端白名单绕过
MIME类型检测绕过(√)
pass02
%00截断绕过(√)
截断条件: 1、php版本小于5.3.4 2、php.ini的magic_quotes_gpc为OFF状态
在windows系统中搭建环境,选择php版本为5.2,打开php.ini 文件,设置 magic_quotes_gpc = OFF
http://192.168.226.134/upload-labs/
docker pass12
/
php pass11
将%00解码
注意: %00的使用是在路径上! %00的使用是在路径上! %00的使用是在路径上! 重要的话说三遍。如果在文件名上使用,就无法正常截断了。 %00只能用在路径上,这个路径可能在post数据包中,也可能在url中,所以在这些地方使用%00进行截 断处理,这样服务器在对文件名进行检测之后,就会把路径跟文件名拼接在一起,这时候%00就开始发 挥作用了。
服务端内容检查绕过
文件头检查(√)
.jpg FF D8 FF E0 00 10 4A 46 49 46
.gif 47 49 46 38 39 61
.png 89 50 4E 47
突破getimagesize及exif_imagetype(√)
pass15 pass16
二次渲染绕过(√)
???
二次渲染:就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像
Upload-labs(Pass-17)这一关比较综合,判断了后缀名、content-type,以及利用 imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染。可以看到,这里先是判断 Content-Type,然后再用imagecreatefrom[gif|png|jpg]函数判断是否是图片格式,如果是图片的话 再用image[gif|png|jpg]函数对其进行二次渲染。我们可以上传一个正常的图片文件,观察其上传前和 上传后图片的二进制流是否发生变化
GIF
渲染前后的两张 GIF,没有发生变化的数据块部分直接插入 Webshell 即可
PNG
没有 GIF 那么简单,需要将数据写入到 PLTE 数据块 或者 IDAT 数据块
JPG
需要使用脚本将数据插入到特定的数据块,而且可能会不成功,所以需要多次尝试
无法上传,经过比较发现,要将木马代码写在蓝色区域
include.php?file=
代码逻辑(条件竞争)
pass18
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["magedu"])?>');?>
总结
**文件上传漏洞安全防御 **
三个关键条件:能不能上传上去,传到哪,能不能运行
1、文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。
2、判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单 方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者 resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访 问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar 和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、使用安全设备防御
文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过 对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出 新,对普通的系统管理员来说可以通过部署安全设备来帮助防御