文件上传漏洞
写在前面
已经好久没更新博客了,可能每个人都会遇到瓶颈期吧。这次我想写一个关于文件上传漏洞的简要概述,共勉。声明:以下大多数表述都是来自《白帽子讲 Web 安全》
00x0 原理概述
文件上传漏洞是指用户上传一个可执行的脚本文件,并通过此脚本获得了执行服务器端的命令的能力。
00x1 FCKEditor 文件上传漏洞
FCKEditor 是一款非常流行的富文本编辑器,为了方便用户,它自带了一个文件上传功能。
00x2 绕过文件上传检查功能
针对上传文件的检查中,很多应用都是通过判断文件的后缀名来验证文件的安全性。如果攻击者手动修改了上传过程中的 POST 包,在文件名后面添加一个 %00 字节,则可以截断某些函数对文件名的判断。因为在很多语言的函数中,比如 C 、Php 等语言的常用字符串处理函数中,0x00 被认为是终止符。比如原本应该只允许上传 JPG 图片,则可以构造文件名为 xxx.php[\0].jpg,其中 [\0] 为十六进制的 00x0 字符。
除了常见的检查文件名后缀的方法外,有的应用还会通过判断上传文件的文件头来验证文件的类型。浏览器的 MIMF Sniff 功能实际上也是通过读取文件的前 256 个字节,来判断文件类型的。
00x3 Apache 文件解析漏洞
比如在 Apache 1.x 、2.x 中,对文件名的解析就存在以下特点。Apache 对于文件名的解析是从后往前解析的,知道遇见一个 Apache 认识的文件类型为止。比如 Phpshell.php.rar.rar ,会被当做 php 文件执行。
00x4 IIS 6.0 解析漏洞
IIS 6.0 在处理文件解析时,会把分号 “;” 当做截断字符。比如 xxx.asp;xx.jpg 会被解析为 asp 文件。
00x5 安全策略
- 文件上传的目录设置为不可执行
只要 Web 容器无法解析该目录下的文件,其实攻击者上传了脚本文件,服务器本身也不会受到影响,因此这点至关重要。在实际应用中,很多大型网站的上传应用,文件上传后会放到独立存储上,做静态文件处理,一方面方便使用缓存加速,降低性能损耗;另一方面也杜绝了脚本执行的可能。
- 判断文件类型
在判断文件类型时,可以结合使用 MIME Type 、后缀检查等方式。在文件类型检查中,强烈推荐白名单的方式,黑名单的方式被无数次证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者 resize 函数,在处理图片的同时破坏图片中可能包含的 HTML 代码。
- 使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些情况下,用户能上传,但不能访问。如果应用使用随机数改写了文件名和路径,将极大地增加攻击的成本。与此同时,像 shell.php.rar.rar 这种文件,或者是 crossdomain.xml 这种文件,都将因为文件名被改写而无法成功实施攻击。