0x00 流程
文件以http协议上传会经过五步检测
- A客户端javascript检测(通常未检测文件扩展名)
- B服务端MIME类型检测(检测Content-Type内容)
- C服务端目录路径检测(检测跟path参数相关的内容)
- D服务端文件扩展名检测(检测跟文件extension相关内容)
- E服务端文件内容检测(检测内容是否合法或含有恶意代码)
0x01 A
情形:若再开启了burp代理检测流量后。选择文件上传,在burp里也还没出现任何内容时,浏览器便弹出了警告框。
这种情况便是客户端javascript检测
复现:
-
这是在burp还没有任何响应时便有了的弹窗
-
这时查看源代码就可以看到Js的过滤
-
关于绕过,将我们的木马文件后缀先改为允许上传的类型,再在burp中将类型改回.php类型并发包
成功!
0x02 B
情形:当php文件是检测Content-type时
复现:
- 当上传一个.hml文件时用burp抓包
- 将content-type由text/html改为要求的image/jpeg便能成功上传
0X03 C
因对目录路径的检测不够严谨而导致可以用0x00截断路径或扩展名,导致写入木马文件。
0X04 D
黑名单检测
- 文件名大小写绕过
eg:AsP,pHp - 名单列表绕过
用黑名单里没有的名单攻击 - 特殊文件名绕过
在http包中改文件名为1.asp.或者1.asp(空格),则会自动去掉点与空格造成绕过。unix/linux中无此特性 - 0x00截断绕过
文件后缀检测时获取的文件名用了0x00截断,而gettype()函数是从后往前扫描扩展名,造成判断错误使文件成功上传,上传后因0x00截断导致上传文件变回危险文件类型 - .htaccess文件攻击
- 解析调用/漏洞绕过
白名单
- 0x00截断
- 解析调用/漏洞绕过
.htaccess文件攻击
绕过黑白名单都是对.htaccess的攻击
如果 PHP 安全没配置好 就可以通过 move_uploaded_file 函数把自己写的.htaccess 文件覆盖掉服务器上的 这样就能任意定义解析名单了
复现:
-
编写.htaccess文件调用php解析器解析文件名中只要包含‘apple’这个字符串的任意文件。
-
同目录上传一个只有文件名并包含apple的无扩展名文件,里面写入php一句话木马。
用菜刀连接,成功
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 上传攻击框架
漏洞分为代码层与应用层两类
<div align=center>
<div align=left>代码层要点:
- 绕过轻量级检测
- 绕过文件内容检测
- 绕过代码层对路径/扩展名检测
- 找到代码层解析调用
应用层要点: - 绕过轻量级检测
- 绕过文件内容检测
- 找到应用层解析漏洞
关于防御
- 轻量级检测必然能绕过
- 检测的重点放在文件内容检测 可以用检测脚本语言特征码的机制
- 黑名单安全性低,不同的webserver默认有不同的可以解析的扩展名导致限制的扩展名不全,路径/扩展名检测一定要用白名单,并且注意路径的 %00 截断攻击 (把 php 更新至最新版本即可,已经修补了这个漏洞了) 可以使用in_array或者===来对比扩展名
- 文件头的验证注意不可靠的函数使用,eg:getimagesize()函数只要文件头是“GIF89a”就正常返回
- 保存上传到文件时进行命名,如upload-labs中的,使用时间日期拼接随机数的方式
- 不能有本地文件包含漏洞 ,对权限的管理限制,禁止参数中有..和反斜杠/斜杠\这些来限制跳转目录
- 随时注意更新 web 应用软件 避免被解析漏洞攻击