文件解析常见漏洞总结

文件解析常见漏洞总结

unic0rn 篝火信安 2024-11-25 02:00

文件解析漏洞主要由于网站管理员操作不当或者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类型的文件名。

2、做好权限设置,限制用户创建文件夹。

二、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,内容为:,通过访问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 只会返回找不到文件。但关闭该选项很可能会导致一些其他错误,所以一般默认是开启的。

漏洞形式:/x.jpg/x.php

另外一种利用方式是上传一个名字为test.jpg,以下是文件的内容:

‘);?>

然后访问 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 文件命名规则的文件名。

如:
– test.asp.

  • test.asp(空格)

  • test.php:1.jpg

  • test.php:: $DATA

会被 windows 系统自动去掉不符合规则符号后面的内容,然后再配合这个解析漏洞来执行文件。

修复方案

1、修改php.ini文件,将cgi.fix_pathinfo的值设置为0;

2、在Nginx配置文件中添加以下代码:

if ( $fastcgi_script_name ~ ..*/.*php ) {
  return 403;
}

这行代码的意思是当匹配到类似test.jpg/a.php的URL时,将返回403错误代码。

三、Nginx

1、%00空字节代码解析漏洞

Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码。

环境要求:

php < 5.3.4

Nginx 0.5.*

Nginx 0.6.*

Nginx 0.7 <= 0.7.65

Nginx 0.8 <= 0.8.37

漏洞形式:

filename=test.php%00.txt

1、上传时路径可控,使用00截断

2、文件下载时,00截断绕过白名单检查

3、文件包含时,00截断后面限制(主要是本地包含时)

4、其它与文件操作有关的地方都可能使用00截断。

二、CVE-2013-4547(%20%00)

非法字符空格和截止符(%00)会导致Nginx解析URI时的有限状态机混乱,危害是允许攻击者通过一个非编码空格绕过后缀名限制。

影响nginx版本:nginx
0.8.41 ~ 1.5.6

漏洞形式

http://127.0.0.1/file.jpg \0.php

这样会让Nginx认为文件“file.jpg ”的后缀为“.php”。

做个测试

在Nginx/1.0.15的环境中,准备文件“test.jpg ”(注意文件名的最后一个字符是空格),文件内容为:

用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

即使扩展名是jpg,一样能以php来执行。

修复方案

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(分布式配置文件)。

要想使.htaccess文件生效,需要两个条件:

一是在Apache的配置文件httpd.conf中写上:

AllowOverrideAll

若这样写则.htaccess不会生效:

AllowOverrideNone

二是 Apache 要加载mod_Rewrite 模块。加载该模块,需要在Apache的配置文件中写上:

LoadModulerewrite_module/usr/lib/apache2/modules/mod_rewrite.so

若是在Ubuntu中,可能还需要执行命令:

sudoa2enmod rewrite

配置完后需要重启 Apache。

.htaccess 文件可以配置很多事情,如是否开启站点的图片缓存、自定义错误页面、自定义默认文档、设置WWW域名重定向、设置网页重定向、设置图片防盗链和访问权限控制。但我们这里只关心.htaccess 文件的一个作用—— MIME 类型修改。

如在 .htaccess 文件中写入:

AddType application/x-httpd-php .xxx

该.htaccess文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件。

另一种写法是:

<FilesMatch"shell.jpg">
SetHandlerapplication/x-httpd-php
</FilesMatch>

该语句会让 Apache 把shell.jpg 文件当作 php 文件来解析。

五、lighttpd

类似于最上面的Nginx的解析漏洞;

漏洞形式:x.jpg/x.php

六、其他解析漏洞

在Windows环境下,x.jpg[空格] 或x.jpg. 这两类文件都是不允许存在的,若这样命名,Windows会默认除去空格或点,黑客可以抓包修改文件名,在后面加个空格或点,试图绕过黑名单,若上传成功,最后的点或空格都会被消除,成为可以解析的恶意文件。

PS:以上信息收集于互联网并不保证写的全对哦,如果有错的或遗漏的,欢迎各位师傅帮忙纠正,谢谢!

如果您觉得内容还不错的话,请关注我吧!

建议把公众号“篝火信安”设为星标,否则可能就看不到啦!因为公众号现在只对常读和星标的公众号才能展示大图推送。

操作方法:点击公众号页面右上角的【…】,然后点击【设为星标】即可。