通常一个文件以HTTP协议进行上传时,将以POST请求发送WEB服务器,WEB服务器接收到请求并同意后,用户与WEB服务器将建立连接,并传输data。
常见上传检测规则
A. 客户端javascript检测(通常为检测文件拓展名)
B. 服务端MIME类型检测(检测Content-Type内容)
C. 服务端目录路径检测(检测跟path参数相关的内容)
D. 服务端文件名拓展名检测(检测跟文件estension相关的内容)
E. 服务器文件内容检测(检测内容是否合法或含有恶意代码)
客户端检测通常在上传页面里含有专门检测文件上传的JavaScript代码。最常见的就是检测拓展名是否合法。
判断方式:
在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
绕过办法
服务端MIME检测服务端MIME类型检测也就是检测Content-Type的内容。下面是一段测试模拟代码:
我们将request包的Content-Type修改:
图片类型:
绕过办法
通过抓包截断将 eval.php.jpg 换成 eval.php_jpg(下划线为0x00)。在上传文件时系统文件遇到0x00。会认为文件已经结束。从而将eval.php.jpg的内容写入到eval.php中。
$FilePath = C:/wamp/www/uploadfile/eval.php_.jpgmove_uploaded_file($_FILES[“upload_file”][“tmp_name”], $FilePath)
在执行move_uploaded_file的这个函数时底层操作调用类似于C语言。遇到0x00会自动截断,真实写入的地址应该是C:/wamp/www/uploadfile/eval.php
基于黑名单检测:
黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多。一般有个专门的blacklist,里面包含常见的危险脚本文件。
绕过办法
文件名后缀就一个%00字节,可以截断某些函数对文件名的判断。在许多语言函数中,处理字符串的函数中0x00被认为是终止符。
例如:
网站上传函数处理xxx.php%00.jpg时,首先后缀名是合法的jpg格式,可以上传,在保存文件时,遇到%00字符丢弃后面的jpg,文件后缀最终保存的后缀名为xxx.php
.htaccess文件攻击即结合黑名单攻击服务器的 .htaccess文件 。
通过move_uploaded_file函数把自己写的 .htaccess文件覆盖掉服务器上的这样就可以解析定义名单了。
.htaccess文件用处:
通过.htaccess文件调用php解释器去解析一个文件名中只要包含“haha”这个字符串的任意文件,无论你文件名是什么样子,只要包含”haha”这个字符串,都可以被以php的方式来解析。
.htaccess文件内容:
SetHandler application/x-httpd-php
如果文件内容检测设置得比较严格,那么上传攻击将变得非常困难。也可以说它是在代码层检测的最后一道关卡。如果它被突破了,就算代码层的漏洞,也可以结合解析漏洞进行攻击。
文件幻数检测绕过
主要是检测文件内容开始处的文件幻数,比如图片类型的文件幻数如下:要绕过jpg文件幻数检测就要在文件开头写上下图的值:
gif文件:GIF89a
png文件:%PNG
制作图片马
cmd下执行:
copy /b 1.jpg+2.php=3.jpg
Apache解析漏洞
test.php.aaa.bbb.ccc任意不属于黑名单且不属于Apache解析白名单之内的后缀名。
说明
一个文件名为test.php.aaa.bbb.ccc的文件,Apache会从ccc的位置往php的位置开始尝试解析 ,如果ccc不属于Apache能解析的后缀名,那么Apache就会尝试去解析bbb,这样一直往前尝试,直到遇到一个能解析的拓展名为止。
WampServer2.0All Version (WampServer2.0i / Apache 2.2.11) [Success]
WampServer2.1All Version (WampServer2.1e-x32 / Apache 2.2.17) [Success]
Wamp5 All Version (Wamp5_1.7.4 /Apache 2.2.6) [Success]
AppServ 2.4All Version (AppServ - 2.4.9 /Apache 2.0.59) [Success]
AppServ 2.5All Version (AppServ - 2.5.10 /Apache 2.2.8) [Success]
AppServ 2.6All Version (AppServ - 2.6.0 /Apache 2.2.8) [Success]
IIS 解析漏洞
IIS6.0 在解析 asp 格式的时候有两个解析漏洞.
IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞, 对任意文件名只要在URL后面追加上字符串"/任意文件名.php"就会按照 php 的方式去解析
eg:”http://www.target.com/upload/1.jpg/1.php”
Nginx 解析漏洞
任意文件名/任意文件名.php | 任意文件名%00.php
目前 Nginx 主要有这两种漏洞:
一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是 test.jpg,可以添加为 test.jpg/x.php 进行解析攻击。
eg: “http://www.target.com/upload/1.jpg/1.php”
一种是对低版本的 Nginx 可以在任意文件名后面添加%00.php进行解析攻击。
• Nginx 0.5.*
• Nginx 0.6.*
• Nginx 0.7 <= 0.7.65
• Nginx 0.8 <= 0.8.37
• 以上Nginx容器器的版本下,上传⼀一个在waf白名单之内扩展名的⽂文件1.jpg,然后以1.jpg%00.php进行请求。
• Nginx 0.8.41 – 1.5.6:
• 以上Nginx容器器的版本下,上传⼀一个在waf白名单之内扩展名的⽂文1.jpg,然后以1.jpg%20%00.php进行请求
轻量级的检测绕过攻击
路径/拓展名检绕过
1. 黑名单绕过
2. 白名单绕过