上传攻击学习报告

0x00 流程

文件以http协议上传会经过五步检测

  • A客户端javascript检测(通常未检测文件扩展名)
  • B服务端MIME类型检测(检测Content-Type内容)
  • C服务端目录路径检测(检测跟path参数相关的内容)
  • D服务端文件扩展名检测(检测跟文件extension相关内容)
  • E服务端文件内容检测(检测内容是否合法或含有恶意代码)

0x01 A

情形:若再开启了burp代理检测流量后。选择文件上传,在burp里也还没出现任何内容时,浏览器便弹出了警告框。
这种情况便是客户端javascript检测
复现:

  1. 这是在burp还没有任何响应时便有了的弹窗

  2. 这时查看源代码就可以看到Js的过滤


  3. 关于绕过,将我们的木马文件后缀先改为允许上传的类型,再在burp中将类型改回.php类型并发包

  4. 成功!

0x02 B

情形:当php文件是检测Content-type时

复现:

  1. 当上传一个.hml文件时用burp抓包
  1. 将content-type由text/html改为要求的image/jpeg便能成功上传

0X03 C

因对目录路径的检测不够严谨而导致可以用0x00截断路径或扩展名,导致写入木马文件。

0X04 D

黑名单检测

  1. 文件名大小写绕过
    eg:AsP,pHp
  2. 名单列表绕过
    用黑名单里没有的名单攻击
  3. 特殊文件名绕过
    在http包中改文件名为1.asp.或者1.asp(空格),则会自动去掉点与空格造成绕过。unix/linux中无此特性
  4. 0x00截断绕过
    文件后缀检测时获取的文件名用了0x00截断,而gettype()函数是从后往前扫描扩展名,造成判断错误使文件成功上传,上传后因0x00截断导致上传文件变回危险文件类型
  5. .htaccess文件攻击
  6. 解析调用/漏洞绕过

白名单

  1. 0x00截断
  2. 解析调用/漏洞绕过

.htaccess文件攻击

绕过黑白名单都是对.htaccess的攻击
如果 PHP 安全没配置好 就可以通过 move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务器上的 这样就能任意定义解析名单了
复现:

  1. 编写.htaccess文件调用php解析器解析文件名中只要包含‘apple’这个字符串的任意文件。

  2. 同目录上传一个只有文件名并包含apple的无扩展名文件,里面写入php一句话木马。

  3. 用菜刀连接,成功

0x05 E

文件幻数检测

  • 主要是检测文件内容开始处的幻数 eg:图片类型文件幻数
  • jpg:Value=FF D8 FF E0 00 10 4A 46 49 46
  • GIF:Value=47 49 46 38 39 61
  • png:Value=89 50 4E 47
    在幻数后加上一句话木马代码就ok

文件相关信息检测

图像文件相关信息检测常用的就是 getimagesize()函数

文件加载检测

渲染/加载测试:代码注入绕过

二次渲染:攻击文件加载器自身
在上传文件前在文件中添加一句话木马,而上传后的图片再重新下载回来后发现添加的一句话木马不见了
新的jpg图片中含有
CREATOR:gd-jpegv1.0(usingIJGJPEG v62)
可以看出是调用的gd库
可以试着上传文件数据不完整的图片文件,触发报错后可以看到是被用什么api或函数进行的二次渲染
eg:ddctf image的题。可以用脚本直接跑=-=

对文件完整性检测的绕过,通常就直接用个结构完整的文件进行代码注入即可 没必要再去测到底是检查的幻数还是文件头结构之类的了

0x06 解析攻击

代码注入+代码解析/执行
主要是apache/IIS/Nginx解析漏洞

  • Apache 的扩展名顺序解析漏洞 ( Apache 自身的漏洞
  • IIS 的 asp 解析漏洞 (IIS 自身的漏洞
  • Nginx 的%00 解析漏洞( Nginx 自身的漏洞
  • php-cgi 的默认配置漏洞

0x07 上传攻击框架

漏洞分为代码层与应用层两类


代码层要点:

  • 绕过轻量级检测
  • 绕过文件内容检测
  • 绕过代码层对路径/扩展名检测
  • 找到代码层解析调用
    应用层要点:
  • 绕过轻量级检测
  • 绕过文件内容检测
  • 找到应用层解析漏洞

关于防御

  1. 轻量级检测必然能绕过
  2. 检测的重点放在文件内容检测 可以用检测脚本语言特征码的机制
  3. 黑名单安全性低,不同的webserver默认有不同的可以解析的扩展名导致限制的扩展名不全,路径/扩展名检测一定要用白名单,并且注意路径的 %00 截断攻击 (把 php 更新至最新版本即可,已经修补了这个漏洞了) 可以使用in_array或者===来对比扩展名
  4. 文件头的验证注意不可靠的函数使用,eg:getimagesize()函数只要文件头是“GIF89a”就正常返回
  5. 保存上传到文件时进行命名,如upload-labs中的,使用时间日期拼接随机数的方式
  6. 不能有本地文件包含漏洞 ,对权限的管理限制,禁止参数中有..和反斜杠/斜杠\这些来限制跳转目录
  7. 随时注意更新 web 应用软件 避免被解析漏洞攻击

你可能感兴趣的:(上传攻击学习报告)