服务器解析漏洞
服务器解析漏洞算是历史比较悠久了,但如今依然广泛存在。在此记录汇总一些常见服务器的解析漏洞,比如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.asp
和10.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/