文件上传漏洞学习总结

  • A+
所属分类:颓废's Blog
摘要

<对文件进行代码注入再配合任意解析调用/漏洞> 作者:0kami

上传检测流程
客户端javascript检测(检测文件扩展名为主)
服务端MIME类型检测(检测Content-type内容)
服务端目录路劲检测(检测跟path相关的内容)
服务端文件扩展名检测(检测跟文件后缀相关的内容)
服务端文件内容检测(检测内容是否合法或含有恶意代码)
客户端javascript检测
通常此类检测会在js文件中有一个检测的函数,一般对上传的文件后缀名做检测,例如仅允许上传png,jpg,gif等类型的文件,如果检测到的文件后缀名不是在这些名单内,则不向服务器端传输文件内容。
这类检测也是最容易绕过的检测,可以使用firebug之类的插件把它禁掉或者通过burp之类的代理工具进行绕过提交。
使用burp,上传时提供一个白名单内的后缀,通过burp拦包,并修改后缀后提交

服务端检测绕过(MIME类型检测)

<?php if($_FILES['userfile']['type'] != "image/gif") { //检测Content-type echo "Sorry, we only allow uploading GIF images"; exit; } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))  { echo "File is valid, and was successfully uploaded./n"; } else { echo "File uploading failed./n"; } ?>

上面为php后端检测MIME类型的一个例子
通过判断$_FILES['userfile']['type'] != "image/gif"来保证上传的类型为gif类型的文件。
绕过这一类型的检测,可以通过burp拦包,将原Content-Type类型该为符合要求的image/gif类型。

服务端检测绕过(目录路劲检测)
有一些web应用程序有多个文件夹用来存储图片文件,所以为了标识上传的图片是属于哪个文件夹的,上传文件时会带上文件存储路劲。而此时如果对文件目录路劲检测不够完全,可以通过截断攻击。(如%00,windows下%80-%90)
如上传时提供存储路劲为image/20160704/可以通过修改为image/20160704/evil.php%00来达到截断目的。后端程序会将该路劲连接为image/20160704/evil.php%00filename.gif00截断导致最终存储的文件名为evil.php

服务器端检测绕过(文件扩展名检测)
黑名单检测
黑名单检测通常会有一个文件后缀名黑名单(例如html|htm|php|php2|php3|php4|php5…)
但是通常黑名单检测不能包含所有的恶意脚本后缀,防护难度会比较大,推荐使用白名单
绕过的方法:
文件名大小写绕过(例如用Php,Asp等)
名单列表绕过(用黑名单中未提及的文件后缀来绕过,如asa,cer等不常见的文件后缀)
0x00截断(asp下可以尝试使用,asp为从后往前扫描扩展名,evil.asp%00.jpg,会被识别为jpg,只要检测方式如这种可以通过这种方式绕过)
特殊文件名绕过(只适用windows,将文件名改为evil.php.或evil.php (注意这里有一个空格),在windows下,不允许这样的命名,所以会将.和空格自动去掉)
.htaccess文件攻击(配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测)
.htaccess文件攻击

如果黑名单中未包含.htaccess后缀的可以通过重写解析配置来达到解析的效果
针对php,上传自定义.htaccess

<FilesMatch "0dayhack"> SetHandler application/x-httpd-php

同目录有个我们上传一个只有文件名并包含字符串”0dayhack”,但是却无任何扩展名的文件
里面的内容是 php 一句话木马,通过菜刀连接可以解析php
成因:
在 PHP manual 中提到了下面一段话
move_uploaded_file section, there is a warning which states ‘If the destination file already exists, it will be overwritten.’
如果 PHP 安全没配置好
就可以通过 move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务器上的
这样就能任意定义解析名单了

解析漏洞(apache解析漏洞,iis6.0解析漏洞,nginx解析漏洞)
apache解析漏洞

apache是从右到左开始判断解析,如果最右的后缀无法解析,则尝试解析后一个后缀

iis6.0解析漏洞

成因为iis6.0不解析;后面的,所以提交evil.asp;.html解析为asp类型
还有一个为IIS6.0的00截断攻击
IIS6.0双文件上传
文件夹的名字包含.asp则这个文件夹下的文件都以asp的形式来解析
iis7.0/7.5解析漏洞

对于php有一个类似Nginx的解析漏洞evil.jpg/evil.php 解析evil.jpg中的php代码,这个漏洞成因在于php-cgi的漏洞

nginx解析漏洞

将php文件换成其他可以通过的文件后缀,访问的时候在后面加上/.php,即evil.jpg/.php,evil.jpg会解析为php的格式
%00截断
其他方式
提交前将filename=”evil.php”该为”evil.php”.jpg”
白名单检测
0x00截断绕过
解析漏洞绕过(文件名不被重写)
服务器端检测绕过(文件内容检测)
图像类的文件内容检测

文件幻数检测(图片头格式检测)
jpg内容头value= FF D8 FF E0 00 10 4A 46 49 46
gif内容头value= 47 49 46 38 39 61
png内容头value= 89 50 4E 47
在文件头后加上一句话木马就能绕过

文件相关信息检测
图像文件相关信息检测常用的就是php的getimagesize()函数,可以通过修改图片的注释区(data区)插入一句话代码,如下:

GIF89a (...some binary data for image...) <?php phpinfo(); ?> (... skipping the rest of binary data ...)

文件加载检测
调用API或函数去进行文件加载测试,常见的是图像渲染测试,二次渲染,可以通过上传恶意文件,再下载下来,diff一下找到不变的位置插入一句话木马,但成功率不高

总结

轻量级检测绕过攻击

绕过 javascript 对扩展名的检测
<用 burp 之类的反向代理工具直接 POST 数据包到服务端,绕过前端检测>
绕过服务端对 http request 包 MIME 类型检测
<用 burp 之类的反向代理工具伪造 POST 数据包到服务端,绕过 MIME 检测>
路径/扩展名检测绕过攻击

黑名单绕过
文件名大小写绕过
名单列表绕过
特殊文件名绕过
0x00 截断绕过
.htaccess 文件攻击
本地包含漏洞
Apache 解析漏洞
IIS 解析漏洞
Nginx 解析漏洞

白名单绕过
0x00 截断绕过
本地文件包含漏洞
IIS 解析漏洞
Nginx 解析漏洞

文件内容检测绕过攻击
文件加载测试绕过

<对文件进行代码注入再配合任意解析调用/漏洞>

作者:0kami

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: