文件操作漏洞

代码审计-文件上传 - 图2

漏洞介绍

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传”本身是没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果

漏洞危害

上传文件的时,服务器端脚本语言未对上传的文件进行严格的验证和过滤,就有可能上传恶意的文件,从而控制整个网站,甚至是服务器。

漏洞条件

  • 文件可上传
  • 知道文件上传的路径
  • 上传文件可以被访问
  • 上传文件可以被执行

文件上传可控点

  • Content-Length,即上传内容大小
  • MAX_FILE_SIZE,即上传内容的最大长度
  • filename,即上传文件名
  • Content-Type,即上传文件类型
  • 请求包中的乱码字段,即是所上传文件的内容
  • 有可能存在请求包中的可控点还有上传路径,只是上面的示例中没有出现

挖掘思路

  • 上传点都调用同一个上传类,直接全局搜索上传函数
  • 黑盒寻找上传点,代码定位

代码案例

  • name:客户端的原始上传文件名称
  • Type:上传文件的MIME类型
  • Tmp_name:服务器端用来保存上传文件的临时文件路径
  • Error:上传文件时的错误信息
  • Size:上传文件的大小,单位是b

    实例

    新建upload.html
    image.png
    新建upload.php
    image.png
    新建1.php一句话木马
    image.png
    上传1.php
    image.pngimage.png

菜刀连接1.php
image.png

文件上传绕过-客户端

  • 1.用firebug将form表单中的onsubmit事件删除
  • 2.上传木马文件,Burp拦截数据包,修改扩展名

文件上传绕过-服务端

  • 1.黑白名单过滤
  • 2.修改MIME类型
  • 3.截断上传攻击
    1. .htaccess文件攻击
  • 5.目录验证

修复方案

  • 检测文件上传内容
    • 黑白名单验证,检测文件扩展名是否合法
    • MIME验证,检测文件的MIME类型
  • 限制文件大小
  • 更改临时文件夹的路径
  • 读取上传文件的绝对路径 与文件名称
  • 隐藏文件路径