- 文件上传验证绕过技术总结
-
1.客户端验证绕过
很简单啦,直接使用webscarab或者burp修改一下后缀名就行。
2.服务端验证绕过-Content-type检测
若服务端检测文件类型时是检测Content-type的值,也很简单,在webscarab或者burp中修改Content-type。
如php中 if($_FILES['userfile']['type'] != “image/gif”) 即是检测Content-type值。
3.服务端验证绕过-扩展名检测
a. 寻找漏网之鱼,如fckeditor 2.4.3 或之前版本的黑名单中就可以上传诸如asa,cer之类的文件。
b. 大小写绕过,如aSp,pHp。
c. 特别文件名构造。
比如发送的http 包里把文件名改成help.asp. 或help.asp_(下划线为空
格),这种命名方式在windows 系统里是不被允许的,所以需要在burp 之类里进行修改,然
后绕过验证后,会被windows 系统自动去掉后面的点和空格。d. IIS或者nginx文件解析漏洞。比如比如help.asp;.jpg 或http://www.xx.com/help.jpg/2.php。
e. 0×00截断绕过。例如:help.asp .jpg(asp后面为0×00),在判断时,大多函数取后缀名是从后往前取,故能够通过,但是在保存时,却被保存为help.asp。
f. 双扩展名解析绕过攻击(1)
如果上传一个文件名为help.php.123首先扩展名123 并没有在扩展名blacklist 里,然后扩展名123 也没在Apache 可解析扩展名
list 里,这个时候它会向前搜寻下一个可解析扩展名,或搜寻到.php,最后会以php 执行。g. 双扩展名解析绕过攻击(2)
如果在Apache 的conf 里有这样一行配置
AddHandler php5-script .php
这时只要文件名里包含.php,即使文件名是test2.php.jpg 也会以php 来执行。
h. 危险解析绕过攻击- 基于web 服务的解析方式
如果在Apache 的conf 里有这样一行配置
AddType application/x-httpd-php .jpg
即使扩展名是jpg,一样能以php 方式执行a. 特别文件名构造(同黑名单攻击 列c)
b.IIS或者ngnix文件解析漏洞(同黑名单攻击 列d)
c. 0×00截断绕过 (同黑名单攻击 列e)
无论是黑名单还是白名单,再直接点就是直接攻击.htaccess 文件,在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 文件覆盖掉服务上的这样就能任意定义解析名单了。4 服务端验证绕过(文件完整性检测)
(1)文件头检测
(2)文件大小及相关信息检测
常用的就是getimagesize()函数只需要把文件头部分伪造好就ok 了,就是在幻数的基础上还加了一些文件信息有点像下面的结构
GIF89a(…some binary data…)(… skipping the rest of binary data …)(3)文件加载检测
该方法是比较变态的检测方法,一般是调用API函数去进行文件加载测试,常见的是文件渲染测试,再变态是二次渲染。针对这种类型,一般是进行渲染测试绕过,或者攻击加载器本身。
a. 渲染测试绕过
先用GIMP 对一张图片进行代码注入用winhex 看数据可以分析出这类工具的原理是在不破坏文件本身的渲染情况下找一个空白区进行填充代码一般是图片的注释区对于渲染测试基本上都能绕过。
b. 但如果碰到变态的二次渲染基本上就没法绕过了,估计就只能对文件加载器进行攻击了,比如上传文件前,文件的数据如下。
然后上传这个jpg 但把它重新下载回本地发现了奇怪的地方
上传后图片被二次渲染过新的JPG 图片内容里含有这个 CREATOR: gd-jpeg v1.0 (using IJG JPEG v62) 貌似是调用的GD php 的gd 库。
一般进行过二次渲染再想绕过个人经验是几乎不可能了。如果要对文件加载器进行攻击,常见的就是溢出攻击,上传自己的恶意文件后,服务上的文件加载器进行加载测试时,被触发攻击执行shellcode比如access/mdb 溢出大家可以参考下 http://lcx.cc/?FoxNews=1542.html。
4 各种攻击方式的相互关系及组合
首先客户端端验证和服务端验证是相互独立的,所以分开绕过就行了,主要难点是在服务端验证的组合上。
文件完整性检测已经包含文件头检测和图像大小及相关信息检测,但不包含文件扩展名检测。它是以加载来作为检测的方式,比如用图像渲染函数去渲染一张图片。文件扩展名检测和文件头检测都是同级的,相互独立,所以如果是文件扩展名+文件头检测可以同时分开绕过。
5 图像代码注入后的攻击
代码注入到图片中,如果无法正常解析,也无法执行。
大家可以参考下http://hi.baidu.com/hackercasper/blog/item/38aa658ee1ca00f6f11f3649.html
常见的是结合LocalFileInclude 漏洞来解析我们的图片
(RemoteFileInclude 和RemoteCodeExecution 在这里就有点大才小用了哈)比如某个站有这样一个URL
www.website.com/view.php?page=contact.php
我们替换contact.php 为../
www.website.com/view.php?page=../
得到一个报错
Warning: include(../) [function.include]: failed to open stream: No such file or directory in
/home/sirgod/public_html/website.com/view.php on line 1337
就说明存在LFI 漏洞,这个时候找到我们的图片文件路径
用一句话client 去连接www.website.com/view.php?page=../upload/help.jpg
就可以成功的得到shell 了
还有像nginx(php-fpm)解析漏洞,也可以直接解析图片里的代码
所以大家要了解哪些环境下才能对图片里的代码进行解析
这样才能结合上传绕过最后得到webshell