最近接手了一个渗透测试项目,做了两周,最后拿到shell利用的是文件上传漏洞,就想着再总结一下这个漏洞吧QAQ
漏洞原理:
绝大部分的网站或应用系统都有上传文件功能,如果开发网站的程序员开放任意文件上传功能,即没有考虑文件的格式或者后缀再或者是只在前端通过js对上传的文件进行了后缀检验。
这时攻击者就可以上传一个恶意代码执行脚本到目标服务器(需要与网站脚本语言相对应),常见的恶意脚本后缀有jsp、asp、php、aspx等,这时攻击者就可以访问这些脚本中的恶意代码,进行动态解析恶意代码,达到一些恶意的攻击操作。
危害
文件上传漏洞较其他类型漏洞(SQL注入、XSS、CSRF)相比,其风险更大,造成的危害也可能更高。例如:
1.攻击者可以直接上传一个webshell到服务器,取得系统控制权,后续就可以进行任何破坏操作。
2.如果上传的文件是钓鱼图片或者是包含了恶意代码的图片,在某些版本的浏览器中将会被作为脚本执行,常被用于钓鱼或者欺诈。
3.如果上传的是病毒、木马文件,可以诱骗用户或者管理员下载并执行,从而取得目标主机控制权或者窃取敏感信息。
4.如果上传的是Flash的策略文件——crossdomain.xml,攻击者就可以控制Flash在该域下的行为。
绕过检测技巧
1.客户端js检测绕过
使用burpsuite代理,抓取上传文件的数据包,修改文件名后缀为允许上传的类型例如jpg、png等
或者直接简单粗暴的使用firebug禁用js也能达到绕过的目的
2.服务器端MIME检测绕过
同样可以使用burpsuite代理,修改Content-Type的参数达到绕过的目的
常见的允许上传的参数类型有
① application/x-www-form-urlencoded
浏览器的原生form表单,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key和val都进行了URL转码
② multipart/form-data
常见的 POST 数据提交的方式,在使用表单上传文件时,必须让 form 的 enctype 等于这个值
③ application/json
消息主体是序列化后的 JSON 字符串
④ text/xml
是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范
⑤ image/jpeg
常见的提交jpg格式图片所需的Type类型
⑥ image/png
常见的提交png格式图片所需的Type类型
3.服务器端拓展名检测绕过
①大小写绕过
例如:Php PhP Asp AsP Aspx等
②双写嵌套绕过
例如:phphpp pphphp aaspsp等
③利用asp程序漏洞,使用截断字符绕过
例如 nc.exe .bmp burpsuite抓包后,修改空格的十六进制字符为00即可截断空格后的内容,上传一个可执行的exe文件
④服务器端内容检测
可在文件头中添加正常文件的标识符或其他关键字绕过
⑤可以利用解析、包含漏洞配合上传一个有恶意代码的白名单文件绕过
解析漏洞
在利用上传漏洞时,通常会与Web容器的解析漏洞结合使用,常见的Web容器有IIS、Apache、Nginx、Tomcat等,下面说下常见的解析漏洞
1.IIS解析漏洞
IIS 6.0在解析文件时存在以下两个解析漏洞
①当建立以.asp、.asa为后缀的文件夹时,其目录下的任意文件都会被IIS当做asp文件来解析
例如:建立一个文件夹——test.asp,在文件夹内新建一个文本文档new.txt,内容为<%NOW()%>,在浏览器中访问后会出现什么结果呢?
正常情况下,txt格式的文档,IIS是不会去解析的,应该直接显示其内容,而在test.asp中,却被IIS当做asp脚本来执行,NOW()函数的作用是ASP提供的用来获取当前时间,因此被当做asp脚本来执行后,就会在浏览器上显示当前时间。
这个解析漏洞配合文件上传,即可实现很多恶意目的。
②当文件名为*.asp;test.jpg这类畸形文件名时,分号后面的会直接被忽略,因此会被当成asp文件来执行
IIS6.0 默认的可执行文件有asp、asa、cer、cdx四种
2.Apache解析漏洞
Apache解析漏洞出现的原因是其解析文件名的方向为从右到左,例如test.php.rar.owf,因为rar和owf这两个后缀apache是不能解析的,所以apache会把这个文件解析成php。
攻击者在上传文件时,构造合法后缀,绕过上传检测,并配合解析漏洞,获取webshell。
其余配置问题导致漏洞
(1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。
(2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行。
使用.htaccess将任意文件作为可执行脚本解析
如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:
<FilesMatch “.(jpg)$”> SetHandler application/x-httpd-php
这将把目录下的所有后缀为jpg的文件当做可执行的php脚本进行解析并执行。
3.Nginx <8.03 空字节代码执行漏洞
影响范围:Nginx0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
访问以下网址,服务器将把xx.jpg文件当做php解析并执行。
http://www.xxx.com/xx.jpg%00.php
漏洞造成原因:
Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码
文件上传漏洞防御:
系统运行时的防御:
①文件上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
②判断文件类型。在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
③使用随机数改写文件名和文件路径。文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
④单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
⑤使用安全设备防御。文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。
系统开发阶段的防御
①系统开发人员应有较强的安全意识,尤其是采用PHP语言开发系统。在系统开发阶段应充分考虑系统的安全性。
②对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。
客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。
服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00截断符进行检测,对HTTP包头的content-type也和上传文件的大小也需要进行检查。
系统维护阶段的防御
①系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。
②定时查看系统日志,web服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。
③对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。