基本概念

  1. 定义

    由于服务器对文件上传路径变量过滤不严,并且对用户上传的文件后缀以及文件类型限制不严,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。

  2. 攻击条件

    • 上传的文件能够被Web容器解释执行。上传后的目录是Web容器能覆盖的路径。
    • 用户能够在Web上访问这个文件
    • 上传的文件被安全检查、格式化、图片压缩等功能改变了内容,则攻击不成功
  3. 绕过文件上传检查功能

    1)通过判断文件后缀名完成上传文件安全检查:黑客可以手动修改上传过程的post包,在文件名后添加一个 %00 字节,截断某些函数对于文件名的判断。

    例子:假设一个web应用仅允许上传 JPG ,例如可以通过手工修改post包,构造文件 xxx.php[\0].jpg 。对于Web应用来说,只会检查文件名的后缀是否符合要求,但是当文件上传到服务器后,服务器端的某些函数在处理文件名时,会将空字节之后的部分截断,因此最终存储在服务器上的文件变成了 xxx.php。攻击者可以利用这个文件执行任意PHP代码,达到攻击目的。

    2)判断上传文件的文件头:黑客可以伪造一个合法的文件头,把真实的PHP代码附在合法的文件头之后。但是注意这里文件的后缀需要是 .php ,因为后续仍然需要php来解释该文件,如果文件后缀名不是 .php 的话web服务器不会解析。

Web服务器功能漏洞

web服务器本身存在很多的功能特性,而这些功能特性可以被利用成漏洞进行攻击

  1. Apache文件解析问题

    • 场景:在 Apache 1.xApache 2.x 环境中,当Apache遇到不认识的扩展名时(没有定义在其 /conf/mime.types 文件中),将会从后向前解析,直到碰到认识的扩展名。
    • 例子:例如文件名为1.php.aa,首先解析aa扩展名,发现不认识继续向前面遍历,最终识别为1.php。
    • 漏洞利用:Apache 并不认识 rar ,如果一个应用中要求用户上传rar,用户上传 webshell.php.rar.rar,可以通过安全检查,但实际容器中解析为PHP文件执行
  2. IIS文件解析问题

    • 场景:IIS是微软开发的一种web应用程序托管服务,曾出现过文件上传检查等问题
  3. 利用上传文件钓鱼

    黑客上传了一个bmp文件去正常的网站。然后传播这个合法图片的URL。

    其实这个bmp文件中包含了恶意代码,指向钓鱼网站。

防御

  1. 文件上传的目录设置为不可执行
    • 只要web容器无法解析目录下的文件,即使攻击者上传了脚本文件,服务器也不会执行
  2. 判断文件类型:结合使用MIME Type,后缀检查
    • 黑名单并不可行,使用白名单的方式
    • 通过压缩函数处理图片,破坏图片中的HTML代码
  3. 使用随机数改写文件名和文件路径
    • 在某些环境下,用户可以上传文件但并不能访问。可以使用随机数改写文件名和路径,使得用户无法访问到这个文件
  4. 单独设置文件服务器的域名
    • 由于存在同源策略,一系列的客户端攻击失效。