文件上传漏洞(看过就能学会)

一、什么是文件上传漏洞?

在有上传功能的系统中,如果应用程序没有对用户上传的文件做严格的校验,那么可能会导致用户上传脚本文件,然后用户再通过访问这些文件的方式,来达到执行该脚本文件,从而控制服务器的目的。

可以看到,之所以会有文件上传漏洞,主要是由两个步骤处理不当导致的:

  • 没有对上传的文件做校验,导致具有危害性的脚本被保存到了服务器上;
  • 没有控制服务器对上传目录的解析和执行行为,导致误执行了危害性的脚本;

那么针对这两个步骤,通常有如下的防范措施。

二、防御技巧

2.1 前端校验

前端页面在提交上传文件时,增加文件类型的校验,如果不是指定的文件类型,就拒绝提交。

这种方式只能算是防止正常用户的误操作,完全不能阻止有心的黑客上传危害性的脚本,编辑一下页面JS,或者使用BP工具就能绕过了。虽然没有大用处,但也不可或缺。

2.2 后端检查文件扩展名

在文件被上传到后端服务器的时候,先对文件的扩展名进行校验:

  • 黑名单法

    凡是在黑名单中的文件扩展名均不允许被上传,直接返回给前端错误信息;

  • 白名单法

    限制只有白名单中的文件扩展名才会被服务器接受;

通常情况下,如果白名单能满足需求,就尽量使用白名单,因为白名单更加的安全,而黑名单容易被意想不到的方法进行绕过。

比如,我们黑名单规则为,凡是上传文件后缀为phpaspjsp的都会被过滤,那么针对以下情况就会被绕过:

  • 老版本的IIS服务器存在分号漏洞,即服务器会在解析上传文件的文件名时会把分号后面的内容丢弃,那么黑客构造一个文件名为danger.asp;jpg的危险脚本,就能绕过黑名单校验规则,且能被服务器解析为asp脚本,当访问该脚本的时候,就会执行文件的脚本程序;
  • 老版本的windows-server存在点号和空格漏洞,即会将文件名最后的点号或者空格自动丢弃,那么黑客构造一个文件名为danger.asp.或者danger.asp(此处有空格)的文件脚本,就能绕过黑名单校验规则,且能被服务器解析为asp脚本,当访问该脚本的时候,就会执行文件的脚本程序;
  • 老版本的Nginx存在%00截断漏洞,即对文件名中%00之后的内容进行截断,比如黑客构造一个文件名为danger.php%00.jpg的危险脚本,当上传成功后,服务器在解析该文件的时候,会截断%00之后的内容,把文件当成danger.php进行执行;
  • 老版本的apache服务器解析漏洞,即服务器在解析文件名的时候从右往左,遇到识别不了的后缀会自动跳过,读取可以识别的后缀,如果黑客构造一个文件名为danger.asp.rar或者danger.asp.gif的危险脚本,就能绕过黑名单校验规则,且能被服务器解析为asp脚本,当访问该脚本的时候,就会执行文件的脚本程序;

如果我们使用的是白名单规则,即只允许上传文件后缀为jpgpnggif的文件,那么如上的情况一和二就可以避免,而且可以阻止其它我们暂时没有想到的绕过规则。

2.3 后端检查Content-Type

HTTP协议规定了上传资源的时候会在请求头Header中添加一项MIMETYPE,即Content-Type,用来标识上传资源内容的类型,这个动作一般由浏览器来完成,常见的MIMETYPE类型如下:

  • text/plain,纯文本
  • text/html,HTML文档
  • text/javascript,JS代码
  • application/x-www-urlencoded,POST方法提交的表单
  • application/msword,MicrosoftWord文件
  • application/变成语言,该种编程语言的代码
  • application/pdf,PDF文档
  • application/octet-stream,二进制数据
  • application/xhtml+xml,XHTML文档
  • image/gif+jpeg+png,各种类型的图片
  • vedio/mpeg,动画
  • multipart/form-data,POST提交时伴随文件上传的表单

后端在处理上传请求的时候,可以获取header种的Content-Type类型,来判断上传的文件是否符合要求。当然这种方式也很容易被绕过,使用BP工具,拦截浏览器请求,修改Content-Type类型就行了,虽然这种方法不保险,但是加上一层防护也还是必要的。

2.4 后端检查文件头内容

每一种特定类型的文件都会有自己固定的文件头,通常是用十六进制表示。

  • JPG对应FF D8 FF E0 00
  • GIF对应47 49 46 38 39 61
  • PNG对应89 50 4E 47
  • ZIP对应50 4B 03 04
  • RAR对应52 61 72 21
  • DOC/XLS/PPT对应D0 CF 11 E0 A1 B1 1A E1

后端可以检查文件头的前几位字节,就可以判断是否为合法的文件类型,但是这种方式也不是完全保险的,并不能替代检查文件后缀的方式,因为黑客完全可以构造一个脚本文件,其文件头伪装成正常的上传文件类型。

三、控制服务器对指定目录的行为

服务器对恶意脚本的执行是造成漏洞生效的直接原因。

我们一般会把用户上传的文件放在一个固定的目录,比如/upload下面,按照预想计划,当用户访问这个文件夹下面的文件时,应该发起下载逻辑,而不是把文件当成脚本去执行。因为,我们可以设置服务器对特定目录的行为来有效避免漏洞的发生。

四、其它预防手段

4.1 上传文件重命名

服务器对恶意脚本的执行是造成漏洞生效的直接原因。

所以我们还可以通过让黑客无法找到他上传的恶意脚本来避免这个问题。当文件上传到服务器之后,服务器可以对文件进行随机重命名,然后再保存到上传目录中。

4.2 隐藏上传文件路径

服务器对恶意脚本的执行是造成漏洞生效的直接原因。

所以,我们需要将文件上传的路径隐藏起来,使其不能被用户直接访问到。比如,我们将文件上传路径放在非项目内,或者放在别的服务器上。当用户上传文件的时候,通过程序将文件传输到对应的目录;当需要读取该文件的时候,也由程序以文件流的方式去对应的目录加载,如此,用户根本无法直接访问到上传的文件,更不能使其执行。

五、文件上传绕过技巧:

  1. 客户端JavaScript检测绕过:客户端的JavaScript检测可以被禁用或修改,因为它们是在用户浏览器上执行的。攻击者可以通过禁用JavaScript或使用代理工具(如Burp Suite)来修改HTTP请求,从而绕过客户端检测。

  2. 服务端MIME检测绕过:服务器可能会检查上传文件的MIME类型,以确保它们是允许的文件类型。攻击者可以通过修改HTTP请求头中的Content-Type字段来尝试绕过这种检测。

  3. 服务端扩展名检测绕过:服务器可能会使用黑名单或白名单来限制允许的文件扩展名。攻击者可以尝试使用大小写变化、双写扩展名(如phtml代替php)、添加特殊字符(如空格、点或::$DATA)来绕过这些限制。

  4. 利用服务器解析漏洞:某些服务器配置错误或特定条件下,可能会错误地解析文件类型。例如,IIS服务器在某些情况下可能会将.php文件作为图片解析,或者Nginx服务器在配置不当的情况下可能会执行看起来像图片的.php文件。

  5. 利用条件竞争:如果服务器在上传文件后进行验证和重命名,攻击者可能利用时间差来访问尚未被重命名的文件。

  6. 文件头内容检验绕过:有些服务器会检查文件的头部内容,以确定文件类型。攻击者可以通过在恶意代码前添加有效的文件头(如GIF89a)来绕过这种检测。

  7. 利用.htaccess文件:在支持.htaccess的服务器上,攻击者可以尝试上传一个.htaccess文件,配置服务器将特定文件类型作为可执行脚本处理。

  8. 二次渲染绕过:某些服务器在处理上传的文件时,可能会对文件进行二次渲染,这可能会移除或改变文件头,攻击者可以利用这一点来绕过文件头检查。

六、总结

我们需要清楚地意识到触发上传漏洞的两个必要条件:

  • 用户上传了非法格式的文件;
  • 用户通过访问的方式触发了服务器执行其上传的文件;
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南棋网络安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值