白名单验证的突破有以下几种情况:
- MIME绕过(content-type验证)
- 00截断
- 配合解析漏洞(iis解析漏洞和apache的双重拓展名)
- 大小写
修改MIME类型绕过白名单限制(content-type验证):
MIME(Multipurpose Internet Mail Extensions)多⽤途互联⽹邮件扩展类型。是设定某种扩展名的⽂件⽤⼀种应⽤程序来打 开的⽅式类型,当该扩展名⽂件被访问的时候,浏览器会⾃动使⽤指定应⽤程序来打开。多⽤于指定⼀些客户端⾃定义的⽂ 件名,以及⼀些媒体⽂件打开⽅式。
id 后缀名 MIME 0 gif image/gif 1 jpg image/jpeg 2 png image/png 3 bmp image/bmp 4 psd application/octet-stream 5 ico image/x-icon 6 rar application/octet-stream 7 zip application/zip 8 7z application/octet-stream 9 exe application/octet-stream 10 avi video/avi 11 rmvb application/vnd.rn-realmedia-vbr 12 3gp application/octet-stream 13 flv application/octet-stream 14 mp3 audio/mpeg 15 wav audio/wav 16 krc application/octet-stream 17 lrc application/octet-stream 18 txt text/plain 19 doc application/msword 20 xls application/vnd.ms-excel 21 ppt application/vnd.ms-powerpoint 22 pdf application/pdf 23 chm application/octet-stream 24 mdb application/msaccess 25 sql application/octet-stream 26 con application/octet-stream 27 log text/plain 28 dat application/octet-stream 29 ini application/octet-stream 30 php application/octet-stream 31 html text/html 32 ttf application/octet-stream 33 fon application/octet-stream 34 js application/x-javascript 35 xml text/xml 36 dll application/octet-stream 37 dll application/octet-stream
00截断绕过白名单限制:
截断格式:1.php%001.jpg 00截断会导致后面的%001.jpg被截断不再读取 但.jpg仍可以被网站抓取用来判断格式,虽然我们真正要用的是1.php
当遇到路径和文件名要进行拼接时,我们可以这样拼接 ../upload/1.php%00filename=1.jpg
当没有路径参数时,可以这样尝试 filename=1.php%001.jpg
注意,所有跟路径和文件名有关的地方都有可能发生阶段,所以我们对此得一点点去尝试。
条件:
- php版本⼩于5.3.4 详情关注CVE-2006-7243
- php的magic_quotes_gpc为OFF状态
- 我们对某一个或多个路径或文件名可控
当正常操作以上方法却还是行不通,就要考虑是不是POST请求或GET请求导致的。
GET和POST请求进行截断时的区别:
post不会像get那样对%00进行解码,所以需要在十六进制中手动修改。
1.php (注意后面有一个空格符)空格在16进制里是20,我们要手动把他修改成00,再forward
解析漏洞绕过白名单限制:
双重拓展名:
apache ⽂件名解析时,是从后⾯开始检查后缀,按最后⼀个合法后缀执⾏。如: shell.php.xxx 因为 xxx 不被apache解析,所以apache会跳过 .xxx ,⽽解析最后⼀个后缀名,即.php,从⽽把这个⽂件当php⽂件解析了。
比如,我们上传1.php.src 当apache服务器对文件进行解析的时候如果它不认识.src,那么它会把.src去掉只保留.php,那么我们就成功绕过了。
iis解析漏洞:
iis6.0
通过抓包修改文件名为如下格式:
*.asp;1.jpg
分号后面的是不会读取的,但.jpg是在白名单中的,所以可以绕过。
iis7.0/7.5/Nginx<8.03
php.ini⾥默认cgi.fix_pathinfo=1,对其进⾏访问的时候,在URL路径后添加.php后缀名会当做php⽂件进⾏解析,漏 洞由此产⽣。
上传1.jpg,访问http://www.xxx.com/1.jpg/.php,此时1.JPG会被当做PHP脚本⽂件来解析。
大小写:
有的会对后缀名的大小写进行区分。
用字典fuzz一遍,试一试。