文件解析漏洞主要由于网站管理员操作不当或者Web容器自身的漏洞,导致一些特殊构造的其他格式文件被 IIS、apache、nginx 或其他 Web容器在某种情况下解释成脚本文件执行,导致黑客可以利用该漏洞实现非法文件的解析。
本文总结一些常见Web中间件的文件解析漏洞。
一、IIS 6.0
使用6.x版本的服务器,大多为Windows server 2003,网站比较古老,开发语言一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件。
1、目录解析:/x.asp/x.jpg
x.jpg可替换为任意文本文件(如x.txt),文本内容为后门代码。IIS 6.0 默认会把.asp,.asa目录下的文件都解析成asp文件。
2、后缀解析:/x.asp;.jpg
IIS 6.0 默认不解析;号后面的内容,因此x.asp;.jpg便被解析成asp文件。
3、默认解析:/x.asa,/x.cer,/x.cdx
IIS 6.0 默认配置中,可执行文件除了.asp还包含这三种.asa .cer .cdx,这几个后缀默认由 asp.dll 来解析,所以执行权限和.asp后缀一样,可在配置中自行删除该后缀,以防止安全隐患。可结合目录解析漏洞利用,如 /x.asa/x.jpg 或 /x.cer/x.jpg 或 /x.asa;.jpg。
4、修复方案
1、目前尚无微软官方的补丁,可以通过自己编写正则,阻止上传x.asp;.jpg类型的文件名。
二、IIS 7.0、IIS 7.5、Nginx <8.03
1、PHP解析漏洞
php的配置文件 php.ini 文件中开启了 cgi.fix_pathinfo,/etc/php5/fpm/pool.d/www.conf中不正确的配置security.limit_extensions,导致允许将其他格式文件作为php解析执行。在本地环境中,新建一个文件phpinfo.jpg,内容为:<?php phpinfo() ?>,通过访问http://127.0.0.1/phpinfo.jpg/.php,会正常执行恶意代码。
但在nginx<8.03环境中,新建一个文件test.jpg,直接访问显示图片解析错误。在浏览器中访问/test.jpg/test.php ,则显示Access denied.。问题来了,test.jpg是文件不是目录,test.php更是根本就不存在的文件,访问/test.jpg/test.php没有报404,而是显示Access denied.。原因在于,Nginx拿到URI(/test.jpg/test.php) 后,识别后缀是.php,直接转交给php去处理。php判断/test.jpg/test.php不存在,便删去最后的/test.php,继续判断/test.jpg存在,便把/test.jpg当成要执行的文件,又因为后缀为.jpg,php认为这不是php文件,于是返回Access denied.。这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项后PHP对文件路径采用从右向左的判断逻辑进行处理。以/为分隔逐层判断文件是否存在,直到判断到存在的那个路径。所以导致php会去尝试解析test.jpg。该选项在配置文件php.ini中。若是关闭该选项,访问 /test.jpg/test.php 只会返回找不到文件。但关闭该选项很可能会导致一些其他错误,所以一般默认是开启的。另外一种利用方式是上传一个名字为test.jpg,以下是文件的内容:<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>然后访问 test.jpg/.php,在这个目录下就会生成一句话木马shell.php。图片马利用方法:
将恶意文本写入图片的二进制代码之后,避免破坏图片文件头和尾。
例:copy xx.jpg/b + yy.txt/a xy.jpg
/b 即二进制[binary]模式
/a 即ascii模式 xx.jpg正常图片文件
新版本的php引入了security.limit_extensions ,限制了可执行文件的后缀,默认只允许执行.php文件。这一漏洞是由于Nginx中php配置不当而造成的,与Nginx版本无关,但在高版本的php中,由于security.limit_extensions 的引入,使得该漏洞难以被成功利用。IIS在这一点和Nginx是一样的,同样存在这一问题。而如Apache等,会先看该文件是否存在,若存在则再决定该如何处理。cgi.fix_pathinfo是php具有的,若在php前便已正确判断了文件是否存在,cgi.fix_pathinfo便派不上用场了,这一问题自然也就不存在了。
2、IIS相关的解析漏洞
IIS7.5 的漏洞与 nginx 的类似,都是由于 php 配置文件中,开启了 cgi.fix_pathinfo,而这并不是 nginx 或者 iis7.5 本身的漏洞。跟 nginx 解析漏洞一样,利用的条件是 php.ini => cgi.fix_pathinfo=1 开启的情况才会产生。可以配合操作系统文件命名规则,上传不符合 windows 文件命名规则的文件名。
会被 windows 系统自动去掉不符合规则符号后面的内容,然后再配合这个解析漏洞来执行文件。
修复方案
1、修改php.ini文件,将cgi.fix_pathinfo的值设置为0;if ( $fastcgi_script_name ~ ..*/.*php ) {
return 403;
}
这行代码的意思是当匹配到类似test.jpg/a.php的URL时,将返回403错误代码。
三、Nginx
1、%00空字节代码解析漏洞
Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码。3、文件包含时,00截断后面限制(主要是本地包含时)
二、CVE-2013-4547(%20%00)
非法字符空格和截止符(%00)会导致Nginx解析URI时的有限状态机混乱,危害是允许攻击者通过一个非编码空格绕过后缀名限制。影响nginx版本:nginx 0.8.41 ~ 1.5.6http://127.0.0.1/file.jpg \0.php这样会让Nginx认为文件“file.jpg ”的后缀为“.php”。在Nginx/1.0.15的环境中,准备文件“test.jpg ”(注意文件名的最后一个字符是空格),文件内容为:<?php phpinfo(); ?>。用Burp Suite抓包并修改,原本的URL是:http://*.*.*.*/test.jpg...php,将jpg后的第一个“.”改为20,第二个“.”改为00。修改完毕后 Forword 该请求,在浏览器中看到返回phpinfo的结果。
四、Apache
1、后缀解析:test.php.x1.x2.x3
Apache的文件解析规则是从右至左判断后缀是否可以解析,若x3非可识别后缀,再判断x2,直到找到可识别后缀为止,然后将该可识别后缀进解析。
修复方案
后缀验证尽量使用白名单的方式,这样即使使用不存在的后缀名,也无法绕过。
2、配置问题导致漏洞
1、如果在Apache的conf里有这样一行配置 AddHandler php5-script.php这时只要文件名里包含.php即使文件名是xx.php.jpg也会以php来执行。2、如果在Apache的conf里有这样一行配置 AddType application/x-httpd-php .jpg
修复方案
1、apache配置文件,禁止.php.这样的文件执行,配置文件里面加入<Files~“.(php.|php3.)”>
Order Allow,Deny
Deny from all
</Files>
2、用伪静态能解决这个问题,重写类似.php.*这类文件,打开apache的httpd.conf找到 LoadModule rewrite_module modules/mod_rewrite.so把#号去掉,重启apache,在网站根目录下建立.htaccess文件,代码如下:<IfModulemod_rewrite.c>
RewriteEngine On
RewriteRule .(php.|php3.) /index.php
RewriteRule .(pHp.|pHp3.) /index.php
RewriteRule .(phP.|phP3.) /index.php
RewriteRule .(Php.|Php3.) /index.php
RewriteRule .(PHp.|PHp3.) /index.php
RewriteRule .(PhP.|PhP3.) /index.php
RewriteRule .(pHP.|pHP3.) /index.php
RewriteRule .(PHP.|PHP3.) /index.php
</IfModule>
3、罕见后缀
还记得mime.types文件吗?在该文件中搜索“php”这三个字母,结果如下所示::~$ cat /etc/mime.types | grep php
#application/x-httpd-php phtml pht php
#application/x-httpd-php-source phps
#application/x-httpd-php3 php3
#application/x-httpd-php3-preprocessed php3p
#application/x-httpd-php4 php4
#application/x-httpd-php5 php5
Apache 配置文件中会有.+.ph(p[345]?|t|tml)此类的正则表达式,被当php程序执行的文件名要符合正则表达式,也就是说php3,php4,php5,pht,phtml也是可以被解析的。
4、.htaccess文件
一般来说,配置文件的作用范围都是全局的,但 Apache 提供了一种很方便的、可作用于当前目录及其子目录的配置文件—— .htaccess(分布式配置文件)。一是在Apache的配置文件httpd.conf中写上:二是 Apache 要加载mod_Rewrite 模块。加载该模块,需要在Apache的配置文件中写上:LoadModulerewrite_module/usr/lib/apache2/modules/mod_rewrite.so
.htaccess 文件可以配置很多事情,如是否开启站点的图片缓存、自定义错误页面、自定义默认文档、设置WWW域名重定向、设置网页重定向、设置图片防盗链和访问权限控制。但我们这里只关心.htaccess 文件的一个作用—— MIME 类型修改。
AddType application/x-httpd-php .xxx
该.htaccess文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件。<FilesMatch"shell.jpg">
SetHandlerapplication/x-httpd-php
</FilesMatch>
该语句会让 Apache 把shell.jpg 文件当作 php 文件来解析。
五、lighttpd
六、其他解析漏洞
在Windows环境下,x.jpg[空格] 或x.jpg. 这两类文件都是不允许存在的,若这样命名,Windows会默认除去空格或点,黑客可以抓包修改文件名,在后面加个空格或点,试图绕过黑名单,若上传成功,最后的点或空格都会被消除,成为可以解析的恶意文件。
该文章在 2024/11/26 12:09:47 编辑过