文件解析漏洞总结
ssooking Lv5

解析漏洞总结

IIS解析漏洞

  • IIS特殊后缀解析:IIS默认配置下有一些特殊后缀名的可执行文件,如IIS6.0 默认的可执行文件除了asp还包含.asa.cer.cdx。这些后缀名可能被用于绕过黑名单策略。

  • IIS6.0

    • 目录解析:.asp.asa目录下的所有文件会被当成asp文件执行,如:/xx.asp/xx.jpg
    • 文件解析:IIS6.0下分号后面的不被解析,如:shell.asp;.jpg
  • IIS7/7.5 PHP-CGI解析漏洞

    • 在Fast-CGI运行模式下,由于cgi.fix_pathinfo参数得递归向前修正,在URL后面加上不存在的路径/xx.php ,如:/1.jpg/xx.php,会将1.jpg解析为php 文件。Nginx也有类似CGI漏洞。

      注:php5.3.9及以上版本增加了security.limit_extensions参数,该参数配置项限制了fastcgi解析文件的类型,配置为“.php”代表仅允许执行.php后缀的文件,可防止Web服务的错误配置带来的代码执行。

Apache解析漏洞

  • 多后缀解析:Apache 根据配置文件mime.types中定义的内容把后缀名文件交给对应的应用程序处理,且从右到左开始解析后缀名,如果不识别就再往左判断。攻击者可能会在文件后缀末尾添加Apache无法识别的后缀,导致绕过黑名单策略。如shell.php.rar.rar 这两种后缀apache不可识别解析,就会继续往左解析成 shell.php
  • 特殊后缀解析:Apache PHP配置文件中的默认正则匹配规则可匹配到特殊后缀名并将其作为php执行。如php5.6的正则表达式.+\.ph(p[3457]?|t|tml)$可匹配执行php、php3、php4、php5、php7、pht、phtml后缀名。
  • .htaccess解析:.htaccess是Apache提供的一种可作用于当前目录及其子目录的特殊配置文件,如果网站开启了.htaccess功能,攻击者可能上传.htaccess文件覆盖apache文件解析规则,从而导致解析漏洞产生。
  • 错误配置文件解析:配置文件配置错误导致的解析漏洞
    • mime.types配置不当:mime.types可以把文件后缀名映射到对应的MIME类型,使文件被正常解析处理,如果在该文件中错误配置了解析规则,则会导致解析漏洞。
    • 站点文件配置不当:Apache具有多个配置文件,由于配置文件加载顺序不同,可能导致重复或冲突的规则被覆盖而不起作用,从而导致解析漏洞

Nginx解析漏洞

  • 空字节代码执行漏洞

    • 低版本Nginx(0.5.x0.6.x 0.7 <= 0.7.650.8 <= 0.8.37)在遇到%00空字节时因为与后端FastCGI处理不一致,导致末尾包含空字节%00的文件时也能被按照php后缀解析执行。攻击者可以Nginx在图片中嵌入PHP代码 ,通过访问xxx.jpg%00.php来执行其中的代码。
  • URI检查逻辑绕过漏洞(CVE-2013-4547)

    • Nginx(0.8.411.4.3,1.5.x1.5.6)在处理HTTP请求时会进行URI安全检查防止产生截断问题,正常URI检查逻辑下遇到“\0”字符会认为是非法请求,但nginx 0.8.41之后的一些版本出于兼容性考虑允许路径中存在空格,且当路径中出现空格字符时会进入其他URI检查逻辑,但该逻辑中没有对“\0”字符进行判断,导致攻击者利用非编码空格字符0x20可绕过黑名单策略上传文件,并利用\0截断执行任意代码。

      举例,Linux环境下,服务器使用黑名单策略限制上传php后缀文件,在上传文件时使用BurpSuite修改文件名为1.jpg[0x20],文件名后是一个十六进制的空格字符,上传成功后访问1.jpg[0x20][0x00].php即可执行代码。

      该漏洞是利用空格字符的检查逻辑进行绕过,因此需要上传带空格的文件到服务器然后进行访问,但通常网站会将文件重命名或去除特殊字符,导致在Linux环境下该漏洞利用条件较为苛刻,而Windows默认会去掉文件名后的空格,在Windows上利用时该漏洞时只需要上传任意文件,访问时在URL后添加[0x20][0x00]字符即可。

系统特性导致的解析问题

  • Windows没有对扩展名进行大小写转换,可以大小写绕过

  • Windows下以.或者空格结尾的文件系统会自动去除.与空格,可上传.asp..asp(空格)的文件绕过黑名单

  • linux下文件拓展名大小写敏感,如果上传php不被解析,可以试试上传pHp后缀的文件名

0x00截断

  • 原因:0x00是十六进制表示方法,是ascii码为0的字符(不是空(Null)、空字符(“”)、空格0x20)。某些编程语言的相关函数处理时,会把该字符当做结束符,可以用于绕过文件名黑名单绕过。如:
    • php解释器是C语言开发(Zend引擎:编译、执行),在C语言中,0x00是字符串的结束标识符;
    • Java( < JDK1.7.0_40)使用FileOutputStream来实现对上传内容的保存,对象的构造方法又调用了open函数,open函数是一个native method。它的实现体是由C语言实现的。
      • JDK1.7.0_40(7u40)开始加上了对文件名是否存在\00字符的检查。
  • 限制条件:PHP<5.3.29,且GPC关闭。在php版本为5.3.29之后,就没有这种漏洞了。并且即使在5.3之前,这个%00截断也受限于GPC、addslashes过滤
  • 利用:burp上传文件名修改为1.php a,在raw中把20(对应空格)改成 00

IIS解析漏洞

特殊后缀名解析

除了.asp.aspx,IIS默认配置下有一些特殊后缀名的可执行文件.cer .asa .cdx。以IIS6.0为例,默认可执行的文件拓展名有.cer、.asa、.cdx等,可在IIS管理器的拓展映射中查看:“IIS管理器”-“网站”-右键-“属性”,在属性对话栏中点击“主目录”-“配置”

image-20210727152325552

特殊后缀名解析是IIS本身的一个功能特性,但该功能特性被滥用可导致解析漏洞。如果网站进行了黑名单限制,攻击者可以上传这些特殊后缀名的文件,从而绕过黑名单限制执行Webshell代码。

实际后缀可执行测试对比情况:

Win2003+IIS6.0 Win2008R2+IIS7.5
.cer 可执行 可执行
.asa 可执行 无法执行,浏览器访问404
.cdx 无法执行,浏览器访问直接被下载 无法执行,浏览器访问404

PS:查看应用拓展:

IIS6.0:IIS管理器–网站–右键–属性,在属性对话栏中点击主目录–配置。

IIS7.0及以上:IIS管理器–主页–处理程序映射

image-20210727152621621

文件/目录解析漏洞

IIS 5.x/IIS 6.x在解析文件类型的代码设计部分存在安全缺陷,通过逆向分析核心处理库文件asp.dll可以知道,IIS 6.x在识别和处理文件类型时仅通过文件拓展名进行判断,识别拓展名时从左向右查找“.”符号,且遇到“;”、“/”时会产生内存截断,截断后便不会继续向后解析。因此,该漏洞具有两种利用方法:

1.文件解析

构造包含“;”的文件名,例如up.asp;1.jpg,解析拓展名时因为被;截断,于是文件被解析成asp文件执行。上传此类名称的文件可以绕过上传的黑名单限制。

image-20210727152811250

**2.目录解析 **

因为IIS6.0解析文件时遇到/时进行截断,不解析/号后面的内容,所以如果构造a.asp/xx.jpg形式的文件,解析时获取结果为a.asp,是asp类型,因此a.asp/xx.jpg 会被当作asp文件执行。

但是正常情况下我们不能直接新建这样的文件,因为文件名里不能包含/符号,如果构造这种URL的话,可以提前建一个a.asp的目录,然后在这个目录里上传xx.jpg形式的文件,这样访问文件时a.asp/xx.jpg就会被解析成asp文件执行。

利用场景:在目标网站创建.asp、.asp、.asa、.cer等名称的目录,然后向该目录上传任意拓展名的文件

image-20210727153221843

IIS7.x PHP CGI解析漏洞

IIS7.x支持以FastCGI模式解析PHP请求,但此模式下存在路径解析漏洞。IIS将请求传递给PHP解析器处理,但由于PHP配置默认开启了cgi.fix_pathinfo参数,其作用是对路径进行修正使其符合CGI规范,如果不存在该路径就去掉这个路径继续解析,例如/admin/abcd/,如果abcd不存在,就会继续向前解析到/admin/。

因此,该漏洞的利用方式是上传其他拓展名的文件,访问时在路径后添加任意以“.php”结尾的路径名即可将该文件以php格式解析执行,如“s.jpg/1.php”。因为php解析器在解析路径时发现1.php不存在,于是修正路径继续向前解析,所以s.jpg会作为php文件类型执行。该漏洞可以绕过文件上传时的黑白名单策略执行Webshell代码。

image-20210727153425213

一种常用的技巧是上传一个1.jpg或图片马文件,内容为下图所示代码。上传后访问路径1.jpg/x.php,通过路径解析漏洞执行1.jpg中的php代码后,会在网站当前目录下创建一句话webshell文件s.php,连接密码为1。

1
<?PHP fputs(fopen('s.php','w'),'<?php eval($_POST[1])?>');?>

然后访问1.jpg/.php,在当前路径下就会生成一句话木马shell.php,菜刀连接即可,密码为1.

这种只要看到URL中路径名以.php结尾,便不检测路径是否存在就直接交给php处理的逻辑,导致了这种漏洞的出现,不仅是IIS7,Nginx部分版本也存在这种路径解析漏洞。Apache在解析时,会先判断路径或文件是否存在,如果存在才传给php处理,避免了cgi.fix_pathinfo去解析,因此不存在这个漏洞。

解决该漏洞的方法之一是在php.ini配置文件中,将cgi_pathinfo=1取消注释并设置值为0,但修改该值可能会让应用程序可用性受到影响。

php5.3.9及以上版本增加了security.limit_extensions参数,该参数配置项限制了fastcgi解析文件的类型,配置为“.php”代表仅允许执行.php后缀的文件,可防止Web服务的错误配置带来的代码执行。

Apache解析漏洞

多后缀名解析

Apache 能够解析包含有多个后缀名的文件,因为在配置文件mime.types里定义了Apache能够处理的所有文件后缀名及其对应的处理程序。当客户端请求一个文件时,若匹配到后缀名在该列表中,便将该文件交给对应的程序处理并向前端返回对应的Content-type值,否则把该文件当做默认类型text/plain处理,即直接返回文件内容。

image-20210727154039031

Apache 在解析文件后缀名时的特性是:从右向左判断,当遇到无法识别的扩展名时会继续向左解析,直到找到可识别的后缀名为止。

该特性会产生一定的安全风险,如果网站使用了黑名单策略不允许上传某类后缀结尾的文件,攻击者可在文件名后添加Apache无法识别的后缀名,从而绕过限制上传文件。解决该风险的有效方法是升级Apache版本至最新版,如果无法升级Apache,后端可使用白名单策略对上传文件的后缀进行校验。

利用场景:可绕过黑名单策略,比如网站不允许上传.php后缀的文件,把名字改为.php.123后上传,这样apache从右往左解析时,解析到.php时文件执行,从而绕过了黑名单检测。

特殊后缀解析

针对Apache+PHP架构的网站,在apache的php配置文件中可以看到使用了正则表达式匹配文件后缀名。以php5.6为例:

image-20210727154657033

正则表达式".+\.ph(p[3457]?|t|tml)$"匹配到以php、php3、php4、php5、php7、pht、phtml后缀名结尾的文件时会把文件交给php解析器执行,因此存在一些特殊的可执行文件后缀名,如图4-46所示:

image-20210727154552765

同理,对于php7.4,默认可匹配的后缀名有:phar、php、phtml。

如果网站使用了黑名单策略禁止上传某些后缀名文件,攻击者可以尝试上传php3、php4、php5、php7、pht、phtml等特殊后缀名的文件绕过上传策略执行恶意代码。

类似的:

1
2
3
4
5
php: .phtml, .php, .php3, .php4, .php5, and .inc
asp: .aspx
perl: .pl, .pm, .cgi, .lib
jsp: .jsp, .jspx, .jsw, .jsv, and .jspf
Coldfusion: .cfm, .cfml, .cfc, .dbm

错误配置解析

Apache相关配置文件中可以自定义文件的解析规则,但如果管理员配置不当,可能会产生解析漏洞。

mime.types配置不当

mime.types可以把文件后缀名映射到对应的MIME类型,使文件被正常解析处理。通常Linux下路径为/etc/mime.types,Windows下路径为C:/apache/conf/mime.types。查看/etc/mime.types/mime.types对PHP的定义:

1
2
3
4
5
6
7
$ 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

如果在该文件中错误配置了类似规则如application/x-httpd-php ssoo,则会导致ssoo后缀名结尾的文件被当做php程序执行。该特性适合用于隐藏webshell后门。

image-20210727155143669

站点文件配置不当

Apache具有多个配置文件,由于配置文件加载顺序不同,可能导致重复或冲突的规则被覆盖而不起作用。常见配置文件如httpd.conf、apache2.conf、000-default.conf 、php.conf等。以/etc/apache2/apache2.conf为例,常见错误配置有以下几种情况:

1
2
3
<FilesMatch "info.ookk">
SetHandler application/x-httpd-php
</FilesMatch>

如果配置了该规则,会将文件info.ookk文件当做php执行。

image-20210727155456608

除此以外,还有其他常见错误配置代码如:

1
2
AddType application/x-httpd-php jpg
AddHandler application/x-httpd-php php

前者可造成所有的jpg文件被当做php解析;若错误配置了后者的代码示例,当文件名任意部分出现php时都会被作为php文件解析,如1.php.jpg。

.htaccess文件覆盖

.htaccess是Apache提供的一种可作用于当前目录及其子目录的特殊配置文件,用户可以通过该文件控制Web服务的自定义错误页面、自定义默认文档、设置域名重定向、设置网页重定向等。该文件可配置MIME类型映射,定义文件后缀的解析方式。如果网站启用了该功能且未限制上传.htaccess文件,攻击者可自定义解析规则并上传覆盖.htaccess文件,从而解析执行webshell代码。这种情况也属于错误配置问题,区别是对于攻击者来说.htaccess文件是可控的。

利用场景:上传.htaccess配置文件,定义解析规则,把图片马解析成php文件执行。

测试环境下开启.htaccess功能,需要在apache配置文件中将AllowOverride参数设置为all并加载mod_Rewrite模块(默认已加载)。

开启.htaccess:Apache配置文件AllowOverride的值设置为all并开启rewrite_mod(默认开启状态)。

1、修改Apache配置文件/etc/apache2/apache2.conf,设置AllowOverride的值为All。其他版本配置文件位置可能有变化

1
2
3
4
5
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

2、Apache加载mod_Rewrite模块(默认已开启)。加载该模块,需要在Apache的配置文件中写上:

1
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

rewrite默认是开启状态

1
2
cat /etc/apache2/mods-available/rewrite.load 
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

Ubuntu可能还需要执行命令加载生效:

1
sudo a2enmod rewrite

注意:Apache可能有多个配置文件,后加载的配置文件会覆盖先加载的配置文件中的配置。所以在某个配置文件中将AllowOverride设置成All,若是其后加载的某个配置文件中AllowOverride的设置是None,则会不生效。一般来说,先加载httpd.conf,再加载conf.d/中的配置文件,最后加载sites-enabled/中的配置文件。

假设攻击者在网站当前目录下上传了.htaccess文件,其中中写入自定义解析规则:

1
2
3
<FilesMatch "info.123123ookk">
SetHandler application/x-httpd-php
</FilesMatch>

该规则的作用是将info.123123ookk文件作为php执行,在访问info.123123ookk文件时,可以看到文件被执行:

image-20210727160206559

同理,如果攻击者在.htaccess文件中写入其他影响范围更大或更隐蔽的规则,如将某类特殊后缀名全部解析成php执行,则会给网站带来巨大的危害。

Apache HTTPD换行符解析漏洞

Apache HTTPD是一个HTTP服务器,它可以通过mod_php来运行PHP网页。Apache HTTPD 2.4.0~2.4.29版本中存在一个解析漏洞(CVE-2017-15715),它使用正则表达式来匹配文件结尾的后缀名,但该正则表达式存在缺陷,FilesMatch中的”$”实际上可以匹配到末尾的换行符,导致在遇到末尾包含换行符x0a的文件时也能被按照php后缀解析执行,利用该特性攻击者可以绕过网站的黑名单策略上传文件。如:

1
2
3
<FilesMatch \.(php|php4|phtml)$>
SetHandler application/x-httpd-php
</FilesMatch>

上传文件时使用Burp Suite拦截请求包,在hex模式下的文件后缀名尾部插入一个换行符0a。

换行符解析漏洞hex 0a

上传成功后在文件尾部添加%0a,访问即可执行代码。

image-20210727161047411

该漏洞利用条件较苛刻,如果网站开发者使用$_FILES['file']['name']获取文件名时,会自动把换行符去掉,导致该漏洞失效。并且security.limit_extensions`配置如果设置了.php,则默认只解析php后缀的文件,多一个换行符也不行。

Nginx解析漏洞

Nginx PHP CGI 解析漏洞

与IIS7.x FastCGI解析漏洞类似,Nginx以FastCGI模式解析PHP,PHP-FPM是FastCGI的进程管理器,Nginx将请求内容按照FastCGI协议格式封装,通过TCP报文传输给PHP-FPM解析。PHP-FPM将数据还原,执行SCRIPT_FILENAME变量值指向的PHP文件。但由于默认php配置文件中cgi.fix_pathinfo参数的作用,文件不存在时会修正路径向前递归解析,因此导致访问文件时在路径后添加任意以“.php”结尾的路径名即可将该文件以php格式执行。如访问“/shell.jpg/123.php”时,123.php实际上并不存在,此时PHP-FPM解析到不存在的路径/123.php,cgi.fix_pathinfo参数生效,修正路径继续向前解析,因此会将shell.jpg作为PHP文件执行。

空字节代码执行漏洞

低版本Nginx(0.5.x,0.6.x, 0.7<= 0.7.65,0.8<= 0.8.37)在遇到%00空字节时因为与后端FastCGI处理不一致,导致末尾包含空字节%00的文件时也能被按照php后缀解析执行,利用该特性攻击者可绕过网站的黑白名单策略上传文件并执行文件中的恶意代码。如在图片中嵌入PHP代码,上传图片1.jpg后访问1.jpg%00.php即可执行图片中的恶意代码。

Nginx URI检查逻辑绕过漏洞(CVE-2013-4547)

Nginx(0.8.411.4.3,1.5.x1.5.6)在处理HTTP请求时会进行URI安全检查防止产生截断问题,正常URI检查逻辑下遇到“\0”字符会认为是非法请求,但nginx 0.8.41之后的一些版本出于兼容性考虑允许路径中存在空格,且当路径中出现空格字符时会进入其他URI检查逻辑,但该逻辑中没有对“\0”字符进行判断,导致攻击者利用非编码空格字符0x20可绕过黑名单策略上传文件,并利用\0截断执行任意代码。

nginx CVE-2013-4547

该漏洞是利用空格字符的检查逻辑进行绕过,因此需要上传带空格的文件到服务器然后进行访问,但通常网站会将文件重命名或去除特殊字符,导致在Linux环境下该漏洞利用条件较为苛刻,而Windows默认会去掉文件名后的空格,在Windows上利用时该漏洞时只需要上传任意文件,访问时在URL后添加[0x20][0x00]字符即可。常见请求格式:

1
2
www.xxxx.com/1.jpg%00.php
www.xxxx.com/1.jpg/%20\0.php

参考

  • Post title:文件解析漏洞总结
  • Post author:ssooking
  • Create time:2019-05-08 00:00:00
  • Post link:https://ssooking.github.io/2019/05/文件解析漏洞总结/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.