PRELOADER

当前文章 : 《服务器解析漏洞》

12/2/2019 —— 

服务器解析漏洞

服务器解析漏洞算是历史比较悠久了,但如今依然广泛存在。在此记录汇总一些常见服务器的解析漏洞,比如IIS6.0、IIS7.5、apache、nginx等方便以后回顾温习。

一、IIS文件解析漏洞

IIS文件解析漏洞存在于两个版本,一个是IIS6.0的文件解析漏洞,一个是IIS7.5的文件解析漏洞,IIS7.5的文件解析漏洞原理和IIS6.0类似,均因为存在逻辑问题,在此仅对IIS6.0的文件解析漏洞进行分析。在补充中将对IIS7.5文件解析漏洞差异性部分进行额外说明。

(一)漏洞原理

IIS6.0在处理含有特殊符号的文件路径时会出现逻辑错误(文件目录名称为test.asp,目录中的文件会被当做asp执行;后缀名为.asp;.jpg时,当作asp文件执行),从而造成文件解析漏洞。

(二)漏洞演示及利用

当网站上传点限制后缀名时(IIS主要和asp搭配),可以利用文件解析漏洞上传如test.asp;.jpg的文件,绕过后执行。如图1.1

当允许新建目录而未对目录名做限制时,可利用文件解析漏洞新建名为test.asp的文件夹,并在其中构造需执行文件iisstart.jpg进行绕过。如图1.2

(三)漏洞修复

1、对新建目录文件名进行过滤,不允许新建包含.的文件夹甚至禁止新建目录

2、限制上传文件的执行权限,不允许执行

3、过滤.asp/xm.jpg等,在httpd.ini中加入过滤规则(此方法为网络上的解决办法,但在server2003中未搜索到该文件)。

4、升级IIS版本

(四)补充

IIS6.0的解析漏洞同样存在于IIS 5.x的版本,而IIS7.5的畸形解析漏洞的攻击方法同样适用于IIS7.0和Nginx<8.03版本。

IIS7.5文件解析漏洞出现是因为url中只要看到后缀.php,无论存在与否均交给php处理,而php又默认开启“cgi.fix_pathinfo”,会对文件路径进行整理(从后向前判定是否存在,不存在则删减,存在则当作php文件执行。)

二、IIS命令执行漏洞

IIS6.0命令执行漏洞,编号CVE-2017-7269,在开启WebDav服务的情况下存在可远程执行漏洞。

(一)漏洞原理

在IIS6.0处理PROPFIND指令的时候,由于对url的长度没有进行有效的长度控制和检查,导致执行memcpy对虚拟路径进行构造的时候,引发栈溢出,该漏洞可以导致远程代码执行。如图2.1

(二)漏洞演示及利用

Github上的一个开源exp:https://github.com/edwardz246003/IIS_exploit

修改IP地址未对应的目标机地址,如图2.2

运行脚本,攻击目标机。如图2.3

(三)漏洞修复

将IIS管理器中,web服务扩展下,webDAV禁用,即可修复,修复后再此运行脚本,未出现弹窗。如图2.4

(四)补充

若能弹出计算器(calc),则权限已经足以完成getshell的全部操作。

三、IIS短文件名

IIS短文件名漏洞,通过IIS短文件名机制,暴力列举短文件名,尝试猜解后台地址、敏感文件甚至直接下载对应的文件。

但局限于只能猜解长文件名前6位和扩展名前3位,同时需要IIS和.net两个条件都满足。

(一)漏洞原理

利用了IIS短文件名机制,即为了兼容16位MS-DOS程序,Windows为文件名较长的(计算后缀后文件名长度大于9)

文件(和文件夹)生成了对应的windows 8.3 短文件名。可以通过此漏洞猜解后台地址、敏感文件等。如图3.1

(二)漏洞演示及利用

开启winserver2003虚拟机,在c:/Inetpub/wwwroot目录下新建对比文件夹12345678,123456789,对比文件aaaaaa.asp。在主机上打开虚拟机IP下的URL

尝试10.10.10.132/122~1**/a.asp10.10.10.132/123~1/a.asp;得到不同的结果如图3.2,图3.3。

通过如上两图我们可以看出,根据返回结果的不同可以逐个猜解短文件名。

而后再尝试10.10.10.132/aaaaaa~1/a.asp(猜解无后缀,正常返回则为文件夹)和10.10.10.132/aaaaaa~1/a.asp(猜解为文件)。如图3.4,图3.5。

根据不同的回显我们可以判断正在猜解的对象是文件还是文件夹。

(三)漏洞修复

目前几种修复方式,可选择升级.net framework或者将在注册表HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem中修改NtfsDisable8dot3NameCreation为1,但修改方法尝试多次,不易成功。

除去上述方式,较易成功的方式为将web文件夹内容拷贝到其他区域,将原文件夹删除后,再将拷贝的文件夹移动回来。修复如图3.6,结果如图3.7

(四)补充

目前有比较好的IIS短文件名检查工具,下载地址为:

https://github.com/lijiejie/IIS_shortname_Scanner

四、Nginx文件解析

Nginx文件解析漏洞,精心构造的恶意请求经过nginx中间件处理后,被合法的执行。php有一个选项cgi.fix_pathinfo,默认值为1,表示开启。

(一)漏洞原理

Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。

当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,

然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。

如果开启了这个选项,那么就会触发在PHP中的如下逻辑:

PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了。

同时配置文件/etc/php5/fpm/pool.d/www.conf中security.limit_extensions允许解析其他格式文件为php,如图4.2,二者共同作用造成了文件解析漏洞。

(二)漏洞演示及利用

一是因为对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名时test.jpg,都可以添加为test.jpg/x.php进行解析攻击。如图4.3.二是对低版本的Nginx可以在任意文件名后添加%00.php进行解析攻击。

(三)漏洞修复

1、将php.ini文件中的cgi.fix_pathinfo的值设为0。这样php在解析1.php/1.jpg这样的目录时,只要1.jpg不存在就会显示404。

2、将/etc/php5/fpm/pool.d/www.conf中security.limit_extensions后面的值设为.php。

修复结果如图4.4

(四)补充

Nginx文件解析漏洞的本质原因时配置文件错误。网站上线前需要确认相关配置正确。

五、Nginx配置不当

Nginx配置不当除了造成文件解析漏洞,还可能造成两种后果:

1、可以进行目录遍历(或目录穿越);

2、存在CRLF注入,CRLF是”回车+换行”(rn)的简称。

目录穿越将在补充内容中进行介绍。

(一)漏洞原理

Nginx目录遍历漏洞和apache一样,属于配置方面的问题。错误的配置可能导致目录遍历与源码泄露。如图5.1

CRLF利用了HTTP包Header与Body是用两个CRLF分隔的这一特性,通过控制HTTP消息头中的字符。若采用解码跳转,攻击者就可以注入一些恶意的换行来注入一些会话Cookie或者HTML代码。如图5.2。任何可设置HTTP头的场景都会出现CRLF注入问题。

(二)漏洞演示及利用

1、目录遍历

当autoindex on;存在时,可直接访问目录。如图5.3

2、CRLF注入

开启burp,刷新页面,抓包,修改数据包。结果如图5.4

可以看到,经过恶意修改,攻击者构造的url中的JSPSEEID值被服务器读取成了请求头中的cookie值,达到了会话固定的目的。

出去会话固定,通过两次CRLF可将URL中编写的恶意脚本(如反射型XSS)被服务器识别成请求体,从而达成攻击。如图5.5。如未弹窗可能是因为浏览器Filter对XSS特征进行了过滤,并且进行了跳转。

(三)漏洞修复

1、针对目录遍历,只需在配置文件中删除autoindex on即可。修复结果如图5.6

2、针对CRLF注入,修改配置文件使用不解码的url跳转。

将return 302 https://$host$uri; 修改为return 302 https://$host$request_uri; 修复结果如图5.7

(四)补充

关于Nginx配置不当造成目录穿越,其成因除去目录遍历漏洞中开启的autoindex on;选项,同时在配置文件/etc/nginx/conf.d/error2.conf中,没有闭合跳转目录如图5.8,造成目录穿越如图5.9

修复方法也很简单,将/files闭合,变为/files/即可,效果如图5.10

六、apache文件解析漏洞

文件解析与文件上传漏洞往往伴生存在。apache解析文件时逻辑存在问题,造成请求某一个精心编辑过的非法文件时被当作正常的php文件来执行,造成被getshell。

(一)漏洞原理

Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php。

漏洞形式

www.xxxx.xxx.com/test.php.php123

其余配置问题导致漏洞

(1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。

(2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行。

(二)漏洞演示及利用

当上传1.php时,由于存在上传后缀名限制,无法完成上传如图6.1,一般情况下,若上传允许的类型则无法利用,但存在文件解析漏洞时,可以绕过。

此时上传1.php.aaa文件,则可以上传成功。同时因存在解析问题,1.php.aaa文件可以被访问。如图6.2

(三)漏洞修复

1.apache配置文件,禁止.php.这样的文件执行,配置文件里面加入

1. <Files ~ “.(php.|php3.)”>
1. Order Allow,Deny
1. Deny from all
1. </Files>

2.用伪静态能解决这个问题,重写类似.php.*这类文件,打开apache的httpd.conf找到LoadModule rewrite_module modules/mod_rewrite.so
把#号去掉,重启apache,在网站根目录下建立.htaccess文件,代码如下:

1. <IfModule mod_rewrite.c>
1. RewriteEngine On
1. RewriteRule .(php.|php3.) /index.php
1. RewriteRule .(pHp.|pHp3.) /index.php
1. RewriteRule .(phP.|phP3.) /index.php
1. RewriteRule .(Php.|Php3.) /index.php
1. RewriteRule .(PHp.|PHp3.) /index.php
1. RewriteRule .(PhP.|PhP3.) /index.php
1. RewriteRule .(pHP.|pHP3.) /index.php
1. RewriteRule .(PHP.|PHP3.) /index.php
1. </IfModule>

(四)补充

此漏洞爆出后,官方进行了一次修复,采用了黑名单,如图6.3

但之后又爆出了同类型的漏洞(编号:CVE-2017-15715),可通过上传一个包含换行符(x0A)的文件绕过检测,如图6.4、图6.5,Apache2.4.0-2.4.29均受到此漏洞影响。在后续版本中官方已经修复了此漏洞,及时更新即可修复。

传送门

更多精彩内容可以查看:部分中间件漏洞总结(不定时更新)/)

参考资料:

https://www.anquanke.com/post/id/166616#h3-37

https://thief.one/2016/09/21/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E/

http://www.voidcn.com/article/p-fwwpryyo-bpd.html

http://www.voidcn.com/article/p-odsszfoq-eh.html