【新东网安全大咖带您走进应用安全】中木马了?别捉急,我来拯救你!
发布时间: 2016-10-31 15:25:51
文/ 邵元明 信息安全部
新东网自2001年成立以来,掌握大数据、云计算、通信、物联网及区块链等信息技术,拥有一支逾16年经验的强大IT团队。为沉淀企业技术实力,继续发挥行业优势,《东网快讯》特邀新东网技术大咖带您走进这些先进信息技术,揭秘新东网16年来的技术成果,每周五发布。
在WEB2.0时代,随着WEB应用与用户的交互逐渐增多,文件上传功能作为WEB应用的基本功能也在越来越多的网站中被普遍使用。例如,许多网站都允许用户自行上传头像、一些社交类网站允许用户上传照片、一些服务类网站需要用户上传证明材料的电子档、电商类网站允许用户上传图片展示商品情况等。然而,看似不起眼的文件上传功能如果没有做好安全防护措施,就存在巨大的安全风险,黑客可以通过上传WEBSHELL文件来对服务器进行控制。
WEBSHELL又称网页木马文件,根据开发语言的不同又分为ASP木马、PHP木马、JSP木马等。如果该类木马利用脚本语言中的系统命令执行、文件读写等函数功能,一旦上传到服务器被脚本引擎解析,攻击者就可以实现对服务器的控制。
稍有经验的开发者都知道对文件上传功能进行一些限制,防止用户上传网页木马文件。但是如果开发者没有使用有效的限制手段,就往往不能很好地阻止攻击者上传木马文件。下面,我们对一些常见的限制手段进行分析:
一、JavaScript检测
JavaScript检测是在客户端浏览器上使用JavaScript脚本对上传的文件进行检测。由于JavaScript是在客户端运行的,攻击者可以通过禁用JavaScript脚本、修改JavaScript脚本、在上传过程中拦截修改数据包等方式轻易地绕过JavaScript检测。
二、MIME类型和文件内容检测
一些开发者会在服务端通过上传文件的MIME类型和文件内容对文件进行检查,如只允许MIME类型为图片或文件内容中包含图片类型文件头的文件上传,以此阻止用户上传网页木马文件。这种方式也存在缺陷。因为MIME类型是由客户端提交的可以被篡改,而在网页木马文件中添加图片类型的文件头并不会影响网页木马文件正常执行,因此攻击者可以通过篡改或伪造请求包,发送MIME类型和文件头符合要求的木马文件。
三、文件扩展名检测
相比较前面两种检测模式,在服务端针对文件扩展名的检测会更加有效。因为正常情况下,如果用户上传的网页木马文件不是以响应的脚本文件扩展名上传的,则无法正常运行,达不到控制网站服务器的目的。然而,如果对文件扩展名检测的实现方式不当的话仍然存在风险。文件扩展名检测通常分为黑名单检测和白名单检测两种:
黑名单检测:黑名单定义了一系列不安全的扩展名。服务器端在接受文件后,与黑名单扩展名对比,如果文件扩展名与黑名单里的扩展名匹配,则认为文件不合法。例如,可以将ASP、PHP、JSP等常见的脚本文件扩展名列入黑名单禁止上传。黑名单主要存在的问题是黑名单的完整性问题,如asa、cer、cdx、php3等一些不常用的扩展名可能没有加入黑名单;在进行黑名单匹配前没有文件扩展名进行大小写转换操作,且黑名单扩展名全部为小写,那就意味着php、asp这样的扩展名,只要换成PHP、ASP就能正常上传;在Windows系统下,如果文件名以小数点、下划线或空格作为结尾,系统保存文件时会自动去除将这些字符,因此如果黑名单中没有包括类似“asp.”或者“asp_”这样的扩展名,攻击者可以通过上传这些扩展名的网页木马文件绕过黑名单检测实现上传木马。
白名单检测的机制恰恰相反,通常是根据业务实际需要事先定义好上传的文件扩展名只能为JPG、PNG、GIF、7Z等无安全风险的扩展名,当攻击者上传其他扩展名的文件就会被拒绝。相比之下,白名单检测机制的可靠性会更强一些,不像黑名单检测机制一样容易被绕过,但在一些特殊情况下攻击者仍有一些方法可以绕过检测机制进行攻击:
1、对于IIS6.0而言,若文件目录名以.ASP或.ASA等脚本文件扩展名形式结尾,则该文件目录下的所有文件都会被当做ASP文件解析。因此,如果上传功能允许用户自定义上传的文件路径,则可以通过将文件路径设置为以.ASP结尾的形式进行攻击,此时即使上传的网页木马文件符合扩展名白名单仍会被作为脚本解析。此外,在IIS6.0的环境下如果上传类似于1.php;1.jpg形式的网页木马文件,也会被当做脚本解析。
2、在windows环境下,/x00是终止符,如果文件路径或文件名包含/x00则在保存文件的时候系统会自动将/x00后的内容略去,因此可以上传类似于1.php/x001.jpg这样的文件或将文件上传目录设置为1.php/x00。系统在保存文件时都会将文件保存为1.php这样的脚本文件,从而达到攻击目的。
3、Apache在解析文件时如果遇到无法识别的扩展名,将会从后向前解析,直到碰到认识的扩展名为止。如果扩展名白名单中包含Apache无法解析的扩展名(以.7z为例),则可以构造类似于:1.php.7z这样的文件名进行上传。由于7z文件Apache无法解析,Apache最终会将该文件作为PHP脚本解析。
4、Nginx在早期的版本中,如果用户在URL后加上类似于/1.php这样的字符串进行访问,URL中的文件就会被按照字符串中的脚本类型进行解析。因此可以通过上传一个扩展名符合白名单要求的网页木马文件,访问时在URL后加上上述字符串将该文件解析为网页木马。
综上所述,要保障文件上传功能的安全性就需要限制用户上传的文件类型,防止用户上传网页木马文件。在服务端对扩展名进行白名单检测是相对安全的做法,但如果处理不当仍然存在风险。建议对文件上传功能进行如下处置,可以避免本文中各种文件上传漏洞:
1、在服务端对扩展名进行白名单校验,扩展名不符合白名单的不允许上传;
2、上传过程不允许用户直接设置文件路径,必要时可以使用预先设置路径列表中的匹配索引值,严禁泄露文件绝对路径;
3、对文件进行重命名,使用随机性好的文件目录和文件名进行保存;
4、对文件的上传目录和临时文件目录设置不解析和执行;
5、有条件时可以将文件以数据的形式保存和读取。