原文 by wooyun wiki
使用了低版本的,存在漏洞的web服务器。解析漏洞有以下几种:
目录解析:在网站下建立文件夹的名称中带有.asp、.asa等可执行脚本文件后缀为后缀的文件夹,其目录内的任何扩展名的文件都被IIS当作可执行文件来解析并执行。
http://www.xxx.com/xx.asp/xx.jpg
文件解析:在IIS6.0下,分号后面的不被解析,也就是说6.0下,分号后面的不被解析,也就是说xx.asp;.jpg
将被当做xx.asp
解析并执行。http://www.xxx.com/xx.asp;.jpg
在文件改名时也可以尝试 xx.asp;jpg
IIS6.0 默认的可执行文件有asp、asa、cer、cdx四种。
注意:这两个漏洞,是需要在服务器的本地硬盘上确实存在这样的文件或者文件夹,若只是通过web应用映射出来的Url,则是无法触发的。
在默认Fast-CGI开启状况下,访问以下网址,服务器将把xx.jpg文件当做php解析并执行。可以根据请求 /xx.jpg 和 /xx.jpg/.php 时返回的 Content-type 是否不同来判断是否存在漏洞。
http://www.xxx.com/xx.jpg/notexist.php
修复: php 配置文件中 cgi.fix_pathinfo=0,将不再递归查询路径确认文件的合法性。这个往前递归的功能原本是想解决 /info.php/test 这种url,能够正确解析到 info.php 上。
影响范围:Nginx0.5.,0.6.,0.7 ⇐ 0.7.65, 0.8 ⇐ 0.8.37
访问以下网址,服务器将把xx.jpg文件当做php解析并执行。
http://www.xxx.com/xx.jpg%00.php
Apache对文件解析是从右到左开始判断解析,如果文件的后缀为不可识别(apache httpd server 的 mime.types 文件里面没有定义), 就再往左判断,解析。 如xx.php.owf.rar,由于Apache无法解析rar和owf后缀,但能够解析php后缀,因此Apache会将xx.php.owf.rar当做php格式的文件进行解析并执行。
访问以下网址,服务器将把xx.php.owf.rar文件当做php解析并执行。
http://www.xxx.com/xx.php.owf.rar
假设图片文件上传的校验逻辑是 先 explode by .
取文件后缀成一个数组,取最后一个 即 jpg, 通过后缀校验(默认不能上传 php 后缀的文件),接着调用 move_uploaded_file 进行文件上传。这样我们访问 www.test.ichunqiu/index.php.jpg
就能执行我们的php 代码。对此 可以在 apache conf 里面写上 <Files ~ "\.(p|P)(h|H)(p|P)."> deny from all <Files>
这样就禁止访问 非 php 后缀的文件。但还是有办法绕过,index.php%00.jpg
, 通过后缀判断后 php 5.3 版本以下的 move_uploaded_file 函数会把 %00 后面的截断,保存在服务器路径下的文件名是 index.php
访问以下网址,服务器将把xx.jpg文件当做php解析并执行。
http://www.xxx.com/xx.jpg(非编码空格)\0.php
http://127.0.0.1/a.jpg(非编码空格)\0.php
当我们这样请求的时候,最终导致nginx认为此次请求的后缀名为php,通过配置,会传给fastcgi进行处理,而fastcgi在查找文件的时候被\0截断,最终取到"a.jpg(非编码空格)"文件(注:Linux下php-fpm默认限制的后缀名为php,如未取消限制,访问将出现access denied。测试想要查看执行结果,需修改php-fpm.conf中的security.limit_extensions为空,即允许任意后缀名文件作为php解析。)
常规利用中如果想触发代码执行,条件为可上传带空格的文件到服务器,并且服务器存储的时候也需要保留空格,而大多数情况下,web应用在处理上传文件时,都会将文件重命名,通过应用自身添加后缀,或者对后缀名去掉特殊字符后,做类型判断。故在 linux 环境时是比较鸡肋的漏洞。但根据windows读取文件时的特点,即文件系统api创建文件名或查找文件名时,默认会去掉文件名后的空格,再执行操作。此时我们可以直接上传不带空格的文件,当 fast-cgi 调用windows api 查找文件时,最终去找的是不带空格的文件,漏洞就可以被成功触发。
如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:
<FilesMatch ".(jpg)$"> SetHandler application/x-httpd-php </FilesMatch>
这将把目录下的所有后缀为jpg的文件当做可执行的php脚本进行解析并执行。