----先bb背景----
记录下时间,2020年7月13日18:21,又是一个愉快的周一。一只刚下班的单身狗不想回家。
作为刚接触渗透测试2年不到的小白,自学到现在也算是入门了。。吧。为什么没底气,是因为和大佬差距还是很明显。希望通过坚持写【每周一洞】专题,总结之前学习的内容,巩固知识,向大佬看齐!
----正文开始----
先问一个问题,你觉得文件上传漏洞在OWASP TOP10中吗?
以前没有好好学习理论知识,不过这次度娘告诉我,没有包含文件上传漏洞。不过仔细想了下,也确实,OWASP TOP10列表总结的是Web应用程序最可能、最常见、最危险的十大漏洞,结合安全行业所说的“进不来,拿不走,看不懂,改不了,跑不掉”,攻击者都进不来,也就谈不上文件上传了。但我决定总结这个漏洞,是因为“shell在手,天下我有”。
文件上传,漏洞起因在于程序员(2年前的我)偷懒,没有对上传的文件内容、格式、类型进行校验,或仅做了前端校验导致的,攻击者可上传可执行脚本文件,肆意妄为。遇到这种程序员,攻击者也就乐呵呵了。
总结下文件上传漏洞的大致利用方法(以PHP环境为例):
绕过客户端校验
绕过前端js脚本校验
绕过服务端校验
绕过文件后缀校验
上传特殊的后缀
上传.htaccess文件
后缀大小写绕过
点绕过
空格绕过
::$DATA绕过
配合解析漏洞绕过
双后缀名绕过
MIME类型绕过
%00截断
0x0a截断
0x00截断
绕过文件内容校验
绕过文件头检查
绕过文件大小检查
绕过文件内容类型检查
二次渲染
其它绕过方式
条件竞争
emmm也太多了吧,不过把这些文件上传绕过方法吃透了,也就成长了。来搭个环境吧,这里利用github开源项目upload-labs作为环境。
Github源码:
https://github.com/c0ny1/upload-labs
搭建步骤在作者项目里写的很清楚了,这里就不赘述了。
搭建好以后是这样滴:
Pass-01:
漏洞点:仅在前端校验文件格式,通过抓包修改即可上传任意格式文件。
直接上传php格式,提示:
更换为jpg格式后,抓包修改:
成功上传:
Pass-02:
漏洞点:仅校验MIME类型,修改MIME类型即可绕过。
上传后,抓包修改MIME类型:
修改为image/jpeg 后成功上传文件:
Pass-03:
漏洞点:仅校验了部分文件类型后缀,通过其它可解析的可执行文件格式即可绕过,例如.php3
抓包修改文件后缀:
成功上传,并能执行:
Pass-04:
漏洞点:基于黑名单过滤,可利用重写.htaccess文件进行绕过
抓包,上传黑名单之外格式的文件jpg:
同时,上传一个能把jpg格式当作php来执行的.htaccess文件,.htaccess内容为:
SetHandler application/x-httpd-php
上传成功:
尝试菜刀链接,成功读取文件:
Pass-05:
漏洞点:黑名单中有.access文件,但可通过PHP和windows的叠加特性,利用截断上传。
PHP+Windows环境会将以下符号正则匹配相等:
双引号" = 点号.大于符号> = 问号?小于符号< = 星号*
上传后抓包修改后缀:
成功上传,并解析为.php:
Pass-06:
漏洞点:基于黑名单识别,并过滤".",但未对其它特殊字符进行过滤,例如" "空格
抓包后,修改后缀,增加空格进行绕过:
成功上传并解析:
Pass-07:
漏洞点:查看源码,识别了点,但是没有删除,所以直接改包,加点绕过,这里就不操作了,可参考06
Pass-08:
漏洞点:删除了末尾的点,首尾去空,但是没有去除字符串::$DATA,利用此漏洞可绕过。
--》Windows文件流特性可将.php::$DATA 保存为.php
抓包修改后缀,并成功上传:
Pass-09:
漏洞点:查看源码,会删除末尾的点,并去除::$DATA以及首尾空格,并基于黑名单过滤,这种情况可考虑Pass-06的加空格,加点号,直接构造可绕过的后缀。
此种类型不再赘述,都是根据代码进行绕过的。
Pass-10:
漏洞点:代码会替换黑名单字符,这种时候可进行双写的方式绕过,例如:利用phphpp,当代码过滤php后会被解析成php。
抓包修改后成功上传文件:
Pass-11:
漏洞点:上传的路径可控,利用00截断,可直接绕过文件类型校验
PS:php5.3.4以上版本此漏洞已经被修复
抓包修改,并成功上传文件:
Pass-12:
漏洞点:与11一样,但是可以通过另一种方式绕过,即0x00截断
抓包修改,在后缀处利用0x00截断实现绕过。(修改后缀处16进制为0x00)
成功上传:
Pass-13:
漏洞点:校验了图片16进制文件头,抓包后增加16进制图片格式文件头即可绕过
法一:直接在包中增加图片文件头
法二:修改16进制,增加图片类型文件头
改为:
上传后效果和法一一样。
成功上传文件:
Pass-14:
漏洞点:代码中利用getimagesize来检查是否为图片文件,获取图片图像大小信息,成功获取后会返回一个数组,失败则返回FALSE并产生一条E_WARNING级别的错误信息。
通过构造图片马可以绕过此种类型的校验。
图片马构造命令:
copy 1.jpg /b + 1.php 2.jpg#参数/b指定以二进制格式复制、合并文件; 用于图像类/声音类文件 #意思是将1.jpg以二进制与1.php合并成2.jpg 2.jpg就是图片马
可看到图片马的16进制数据,末尾为木马数据:
Pass-15:
漏洞点:与Pass-14相似,利用exif_imagetype函数对图片类型进行校验,同样可以通过上传图片马的方式进行绕过。
Pass-16:
漏洞点:查看代码,本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片并且会对上传的图片进行二次渲染,即会生成新图片,然后删除用户上传的图片
修改php文件后缀为图片后缀,修改Centent-type为图片格式,增加图片头字节即可绕过:
成功上传:
Pass-17:
漏洞点:代码审计后看到,rename函数会删除上传的php文件,那么我们可以想到,如果利用条件竞争的方式,在删除文件的间隙去请求文件是否能够实现绕过?
只要我够快,你就抓不到我?嘿嘿嘿
利用burp不断发送上传文件的请求:
成功实现条件竞争!看来你还追不上我~条件竞争后连接,显示404:
Pass-18:
漏洞点:通过代码审计看到,对后缀做了白名单,检查了文件大小、文件是否存在,并将上传的文件重命名,但是仍然存在条件竞争漏洞。利用重复发包,能够成功绕过。
代码仅列举一部分,不过多展示了。
Pass-19:
漏洞点:CVE-2015-2348。
可以看到代码中有明显的“move_uploaded_file”函数,此函数就是CVE-2015-2348漏洞的特征,可使用00截断绕过。
即在save_name利用00截断或"."绕过:
成功上传文件:
----结束咯----
写完了,以上对经典的文件上传漏洞进行了复现,枚举了多种情况的文件上传漏洞,在实际操作过程中,还是要一个一个试,通过反馈和响应来判断该用什么方法去绕过,毕竟魔高一尺道高一丈!
下班下班,回家吃饭。。。