首页 > 代码库 > 文件上传漏洞

文件上传漏洞

文件上传漏洞

用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。

文件上传可能存在的安全问题:

(1)上传文件为 Web 脚本,服务器的 Web 容器解释并执行了该脚本,导致代码执行——webshell

(2)上传文件是 Flash 的策略文件 crossdomain.xml,攻击者可以控制 Flash 在该域下的行为;

(3)上传文件是病毒、木马文件,攻击者用以诱骗用户或者管理员下载执行;

(4)上传文件是钓鱼图片或包含了脚本的图片,在某些版本的浏览器中被作为脚本执行,进而被用于欺诈。

webshell 形成的条件:

(1)上传的文件位于 Web 容器能够覆盖的目录,从而能够被 Web 容器解释执行;

(2)用户能够从 Web 上访问这个文件,从而触发 Web 容器解释执行上传的脚本;

另外,上传的文件内容不被破坏,比如安全检查、格式化、图片压缩等,确保上传的脚本可用。

在防御文件上传漏洞的时候切忌使用黑名单机制,因为该方法不全面、不可靠。

文件上传中的防与攻:

(1)防:上传时检测文件名后缀;攻:① 构造文件名 “filename.php.合法后缀”(原理:有些服务器端从左至右检测文件,将遇到的第一个 “.???” 作为文件后缀;有些 Web Server 对文件名的解析时从右往左解析的,直到遇见一个它认识的文件类型为止,比如 Apache);② 构造文件名 “filename.php[\0].合法后缀”(原理:在大多语言中 “0x00” 或 “\0” 是终止符(0字节截断),这种形式的文件名可以绕过应用的上传文件类型判断,但对于服务器端,此文件会因为 0字节截断的问题,最终变成 filename.php);③ 在 IIS 提供 web 服务的站点中,构造文件名 “filename1.php;filename2.合法后缀”(原理:在 IIS 和 Windows 环境下,字符 “;” 常被用作截断字符);

(2)防:上传时检测文件头;攻:伪造合法的文件头,当 Web Server 将该文件当做脚本文件解析时攻击成功。

(3)用户配置未妥当配置 Web 服务系统的一些功能带来的安全隐患:① IIS 的 WebDav 中定义的 PUT、MOVE 方法。攻击者可以通过 OPTIONS 方法探测服务器支持的 HTTP 方法类型,如果支持 PUT,则使用 PUT 上传一个指定的文本文件,最后通过 MOVE 改写为脚本文件。② PHP 的 CGI 路劲解析问题:当访问 http://www.xxx.com/path/test.jpg/notexist.php 时,会将 test.jpg 当做 PHP 进行解析,其中 notexist.php 是不存在的文件。原因是,当 PHP 的配置选项 cgi.fix_pathinfo=1 时,在映射 URI 的时候将递归查询路径确认文件的合法性。notexist.php 是不存在的,所以将往前递归查询路径,直到检测到存在的 test.jpg 文件。此时 SCRIPT_FILENAME 为 /path/test.jpg,而 PATH_INFO 为 notexist.php,最终 test.jpg 被当做 PHP 文件进行解析。

(4)利用上传文件钓鱼:低版本的 IE 浏览器(IE6/7)会将图片文件当做 HTML 进行解析,不怀好意者可以将网页跳转的代码藏在图片里,然后将图片上传,然后传播该图片。查看该图片的用户将被跳转到一个恶意站点,掉进坏人的陷阱。

避免文件上传功能带来的安全问题

(1)文件上传的目录设置为不可执行;

(2)用白名单机制判断文件类型(文件后缀、文件头);

(3)对上传的文件做更改文件名、压缩、格式化等预处理;

(4)单独设置文件服务器的域名。

文件上传漏洞