文件上传漏洞 — 前端JS绕过、MIME类型绕过

文件上传漏洞 — 前端JS绕过、MIME类型绕过
最新回答
下一站等候

2022-03-29 22:32:02

文件上传漏洞是Web应用中常见的安全风险,攻击者可通过绕过前端或服务器端的限制上传恶意文件,进而控制服务器。以下是针对前端JS绕过和MIME类型绕过的详细解答:

一、前端JS绕过

前端JS验证通常通过检查文件扩展名或类型实现,但仅在客户端生效,可通过以下方法绕过:

方法一:禁用浏览器JS
  • 步骤

    在浏览器设置中禁用JavaScript(如Chrome的设置 > 隐私和安全 > 网站设置 > JavaScript)。

    刷新页面后直接上传.php等被禁止的文件,此时前端验证失效。

  • 示例

方法二:Burp Suite抓包修改
  • 步骤

    上传一个允许的文件(如.jpg),拦截请求包。

    修改请求中的文件名或扩展名(如将shell.jpg改为shell.php)。

    转发请求,服务器可能因未校验后端而接收恶意文件。

  • 关键点

    需确保服务器未对文件内容或后端MIME类型做校验。

    示例操作:

二、MIME类型绕过

服务器通过检查HTTP请求头中的Content-Type或文件扩展名限制上传类型,可通过以下方式绕过:

方法一:修改Content-Type
  • 步骤

    上传.php文件时,拦截请求包。

    将Content-Type: application/octet-stream(默认二进制流)改为允许的类型(如image/jpeg或image/png)。

    转发请求,服务器可能误判为图片文件。

  • 示例

方法二:双重扩展名绕过
  • 步骤

    将文件命名为shell.php.jpg(本地显示为图片)。

    上传时拦截请求,修改扩展名为.php。

    若服务器仅检查初始扩展名,文件可能被当作PHP执行。

  • 注意

    需服务器对扩展名解析存在漏洞(如Apache的mod_php配置)。

    示例操作:

三、防御建议
  1. 前后端双重验证

    前端仅作用户体验优化,后端必须校验文件内容(如getimagesize()检测图片头)。

  2. 严格限制扩展名

    使用白名单(如仅允许.jpg, .png),避免黑名单(易被绕过)。

  3. 重命名文件

    上传后随机生成文件名,避免执行恶意代码。

  4. MIME类型验证

    对比文件实际类型与Content-Type头(如PHP的finfo_file()函数)。

总结
  • 前端JS绕过:利用禁用JS或抓包修改扩展名。
  • MIME绕过:篡改Content-Type或使用双重扩展名。
  • 核心原则:安全验证必须依赖服务器端,且需多层次防护。

通过理解漏洞原理和防御措施,可有效降低文件上传风险。