0
点赞
收藏
分享

微信扫一扫

Web框架开发-Django-model进阶

古月无语 04-10 19:00 阅读 0

漏洞描述

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。

漏洞原理

大部分的网站和应用系统都有上传功能,一些文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过web访问的目录上传任意PHP文件,并能够将这些文件传递给PHP解释器,就可以在 进程服务器上执行任意PHP脚本。

当系统存在文件上传漏洞时攻击者可以将病毒,木马,WebShell,其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。根据具体漏洞的差异,此处上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本,也可以是篡改后缀后的这几类脚本。

漏洞产生原因

一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过 url 去 访问以执行代码.

造成文件上传漏洞的原因是:

  1. 服务器配置不当
  2. 开源编辑器上传漏洞
  3. 本地文件上传限制被绕过
  4. 过滤不严格被绕过
  5. 文件解析漏洞导致文件执行
  6. 文件路径截断

漏洞场景

存在文件上传功能的地方都有可能存在文件上传漏洞,比如相册头像上传,视频、照片分享。论坛发帖和邮箱等可以上传附件的地方也是上传漏阔的高危地带,另外像文件管理器这样的功能也有可能被攻击者所利用。

值得注意的是,如果移动端也存在类似的操作的话,那么相同的原理,也存在文件上传漏洞的风险。

风险等级

高危!

恶意文件上传后可能导致严重的安全问题,如远程代码执行、服务器完全控制、数据库注入等。

漏洞危害

  1. 上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行。
  2. 上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接 自劢运行;
  3. 上传文件是Flash的策略文件 crossdomain.xml,黑客用以控制Flash在该域 下的行为(其他通过类似方式控制策略文件的情况类似);
  4. 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
  5. 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。 除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢 出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件,其内容包含了PHP脚本,再通过"本地文件包含漏洞(Local File Include)"执行此脚本。

漏洞验证

  1. 首先确认漏洞点,看是否存在文件上传功能点。
  2. 上传验证:通过上传一些常用的恶意文件,如.php、.bat、.exe等可执行文件,还有一些包含恶意脚本的HTML、JS文件等。如果直接上传成功证明存在文件上传漏洞,如果上传失败证明网站做了一些防护,可以尝试进行绕过。
  3. 如果上传成功了,则执行上传的文件,执行成功证明存在严重的安全风险

漏洞利用

文件上传漏洞绕过技巧:

一般来说文件上传过程中检测部分由客户端javascript检测、服务端Content-Type类型检测、服务端path参数检测、服务端文件扩展名检测、服务端内容检测组成。但这些检测并不完善,且都有绕过方法。

  • 客户端检测绕过(js检测): 利用firebug禁用js或使用burp代理工具可轻易突破。
  • 服务端MIME检测绕过(Content-Type检测): 使用burp代理,修改Content-Type的参数
  • 服务端扩展名检测绕过: 文件名大小写绕过,例如Php,AsP等类似的文件名 后缀名字双写嵌套,例如pphphp,asaspp等
  • 可以利用系统会对一些特殊文件名做默认修改的系统特性绕过
  • 可以利用asp程序中的漏洞,使用截断字符绕过
  • 可以利用不再黑名单列表中却能够成功执行的同义后缀名绕过黑名单的限制
  • 可以利用解析/包含漏洞配合上传一个代码注入过的白名单文件绕过
  • 服务端内容检测绕过: 通过在文件中添加正常文件的标识或其他关键字符绕过
  • 文件加载检测绕过,针对渲染加载测试
  • 代码注入绕过,针对二次渲染测试

客户端绕过

(1)客户端校验:

一般都是在网页上写一段 javascript 脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。

(2)绕过方法:

1.通过火狐插件 NOscript 插件或者禁用 IE 中 JS 脚本;

2.通过 firbug 插件元素审核修改代码(如删除 οnsubmit=”return checkFile()” 事件);

3.通过 firbug 元素审核 javascirpt 脚本中添加上传文件类型;

4.通过利用 burp 抓包改包,先上传一个 gif 类型的木马,然后通过 burp 将其改为asp/php/jsp 后缀名即可 注意:这里修改文件名字后,请求头中的 Content-Length 的值也要改。

服务端绕过

(1)黑名单扩展名绕过

黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。绕过方法:(1)找黑名单扩展名的漏网之鱼 - 比如 iis6.0 中的 asa 和 cer (2)可能存在大小写绕过漏洞 - 比如 aSp(iis6.0 中可以)和 pHp(只能在 小于 php5.3.39 中的 linux 中)之中 (3)能被web容器解析的文件其他扩展名列表:

jsp, jspx ,jspf

asp asa cer cdx,htr,xml,html

aspx,ashx,asmx,asax,ascx

(2)黑名单特殊后缀名绕过(利用难度高)

将Burpsuite截获的数据包中sev1n.php名字改为 baclion.php4(php1,php2,php3,php4,php5), 前提条件是 http.conf 中设置 AddType application/x-httpd-php .php1(php 的版本小于等于 5.3.29 以下)

(3)单双重后缀名绕过

上传时将 Burpsuite 截的数据包中文件名 sev1n.php(sev1n.asa)改 为 sev1n.pphphph(sev1n.asasaa),那么过滤了第一个"php"字符串"后, 开头的'p'和结尾的'hp'就组合又形成了 php

(4)服务端 MIME 文件类型(Content-Type)绕过

MIME 的作用:

使客户端软件,区分不同种类的数据,例如web浏览器就是通过 MIME 类 型来判断文件是GIF图片,还是可打印的 PostScript 文件。web服务器使用 MIME 来说明发送数据的种类,web客户端使用 MIME 来说明希望接收到的数据种类,它是服务器用来判断浏览器传递文件格式的重要标记项。

常用的文件上传类型的 MIME 表: text/plain(纯文本) text/html(HTML 文档) text/javascript(js 代码) application/xhtml+xml(XHTML 文档) image/gif(GIF 图像) image/jpeg(JPEG 图像) image/png(PNG 图像) video/mpeg(MPEG 劢画) application/octet-stream(二迚制数据) application/pdf(PDF 文档) application/(编程语言) 该种语言的代码 application/msword(Microsoft Word 文件) message/rfc822(RFC 822 形式) multipart/alternative(HTML 邮件的 HTML 形式和纯文本形式,相同内容使 用不同形式表示) application/x-www-form-urlencoded(POST 方法提交的表单)multipart/form-data(POST 提交时伴随文件上传的表单)

绕过方法:上传对文件类型做了限制,可通过 burpsuit 将其他类文件类型 修改为如:Content-Type:image/gif 和 image/jpeg 等运行的文件类型。

白名单绕过:

(1)配合web容器的解析漏洞:

IIS中的目录解析漏洞和分号解析漏洞 :

将一句话木马的文件名 sev1n.php,改成 sev1n.php.abc(奇怪的不被解析的后缀名都 行)。首先, 服务器验证文件扩展名的时候,验证的是.abc,只要该扩展名符合服务器端黑白名单觃则,即可上传。

nginx 空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行。

apache 的解析漏洞,上传如 a.php.rar a.php.gif 类型的文件名,可以避免 对于php文件的过滤机制,但是由于 apache 在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar 等扩展名是 apache 不能识别的, 因此就会直接将类型识别为 php,从而达到了注入php代码的目的。

(2)%00 截断上传绕过

通过抓包截断将 sev1n.asp.jpg 后面的一个.换成%00 在上传的时候即 sev1n.asp%00.jpg,当文件系统读到%00 时,会认为文件已经结束,从而将 sev1n.asp.jpg 的内容写入到 sev1n.asp 中,从而达到攻击的目的。%00 不是针对所有基于白名单的后缀名检查都能绕过,代码的实现过程中必须存在截 断上传漏洞,上传格式如下:bk.asp%00.jpg

(3)文件头内容检测绕过

文件头简介

不同的图片文件都有不同文件头,如: PNG:文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A JPEG: 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识) GIF:文件头标识 (6 bytes) 47 49 46 38 39(37) 61 上传文件的时候会检查上传文件是否合法,如图片文件是否文件头含有 gif89, 这里可以通过一句话图片木马生成工具 edjpgcom 戒者通过编辑器在木马内容基础上再加了一些文件信息,有点像下面的结构:

GIF89a <?php phpinfo(); ?>

带WAF的文件上传绕过

对于WAF,可以尝试使用脏数据进行绕过

上传文件 WAF 检查的位置

文件名:解析文件名,判断是否在黑名单内。文件内容:解析文件内容,判断是否为 webshell 文件目录权限 请求的 url Boundary 边界 MIME 文件类型 目前,市面上常见的是解析文件名,少数 WAF 是解析文件内容,比如长亭。

文件上传存在的上传特征

http 请求 Header 头部中的 Content-Type 存在以下特征:

multipart/form-data:表示该请求是一个文件上传请求 存在 boundary 字符串:作用为分隔符,以区分 POST 数据 POST 的内容存在以下特征: Content-Disposition name filename POST 中的 boundary 的值就是 Content-Type 的值在最前面加了两个--,除了 最后 标识结束的 boundary 最后标识结束的 boundary 最后默认会多出两个--(测试时,最后一行的 boundary 删掉也能成功上传)。

漏洞防御

系统运行时的防御:

  1. 文件上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
  2. 判断文件类型。在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文 件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
  3. 使用随机数改写文件名和文件路径。文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
  4. 单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
  5. 使用安全设备防御。文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。

系统开发阶段的防御

  1. 系统开发人员应有较强的安全意识,尤其是采用PHP语言开发系统。在系统开发阶段应充分考虑系统的安全性。
  2. 对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00截断符进行检测,对HTTP包头的content-type也和上传文件的大小也需要进行检查。

系统维护阶段的防御

  1. 系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。
  2. 定时查看系统日志,web服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。
  3. 对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。

典型案例

2016年的PHPMailer漏洞(CVE-2016-10033),该漏洞允许攻击者通过邮件发送过程中的文件上传功能来执行任意代码。

案例描述

在2016年12月,一个严重的漏洞被发现在PHPMailer邮件库中,该库用于发送电子邮件。该漏洞使得攻击者可以通过构造恶意邮件来触发远程代码执行,从而导致服务器被入侵。

攻击者可以利用这个漏洞构造一个恶意的邮件,其中包含了一个恶意的附件,该附件实际上是一个 PHP 脚本。当服务器尝试处理这个恶意邮件时,PHPMailer 将会尝试解析附件,并将其保存到服务器的临时目录中。由于 PHPMailer 没有对上传的附件进行充分验证和过滤,攻击者可以通过上传一个恶意的 PHP 脚本来执行任意代码。

攻击者可以构造一封包含恶意附件的邮件,并将其发送到受影响的服务器。当服务器尝试处理这封邮件时,恶意附件将会被保存到服务器的临时目录中,并执行其中的恶意代码。攻击者可以通过这种方式获得对服务器的控制权,执行任意操作,包括窃取敏感信息、篡改数据、部署后门等。

这个漏洞的影响非常严重,因为它可以被广泛利用,并且攻击者可以通过发送恶意邮件的方式来触发漏洞,而无需直接访问受影响的服务器。因此,修复漏洞并及时更新受影响的 PHPMailer 版本是非常重要的。

一些参考文档

文件上传漏洞详解 - FreeBuf网络安全行业门户

文件上传漏洞攻击与防范方法[通俗易懂]-腾讯云开发者社区-腾讯云

超详细文件上传漏洞总结分析-腾讯云开发者社区-腾讯云

举报

相关推荐

0 条评论