文件上传漏洞
Reference
文件上传漏洞 | 狼组安全团队公开知识库 (wgpsec.org)
文件上传漏洞
客户端校验
最简单的校验方法即在客户端浏览器对上传的文件进行校验
我们可以将木马修改为允许的后缀,然后使用bp拦包修改后缀名
服务端校验
MIME校验/文件内容头校验(GIF89a)
针对这两种服务端校验方法,我们有两种方法绕过
- 在恶意脚本前添加GIF89a标识,一句话前后加图片数据混淆
- 直接把木马改成
.gif
后缀上传,BurpSuite拦包修改后缀名。
文件扩展名校验
一般检查文件扩展名时会使用黑名单或白名单
黑名单绕过:
找漏网之鱼:cer、php3、php4
等
大小写绕过:AsP、pHP
文件后缀复写绕过:.phphpp
针对Windows系统:
上传不符合windows文件命名规则的文件名
1 | test.php:1.jpg |
会被windows系统自动去掉不符合规则符号后面的内容
会被windows系统自动去掉不符合规则符号后面的内容
白名单绕过:
%00截断 (PHP<5.3.4时 shell.php%00.jpg 可截断%00后的内容) 配合服务器中间件解析漏洞绕过
黑白名单通用,如果可上传修改 .htaccess
文件 (还能用于隐藏后门)
1 | <FilesMatch "shell.jpg"> |
文件内容检测
常见的是对图像进行二次渲染,一般是调用PHP 的GD库
我们可以使用绕过GD库的webshell生成器
例如getimagesize()函数,它是php提供的,通过对目标文件的16进制进行读取,通过该文件的前面几个字符串,来判断文件类型。
要绕过该函数的检测,我们可以伪造图片的16进制头部字符串,当然更简单的方法是将图片和php文件合成为一个图片
1 | copy test.jpg + test.php synth.jpg |
竞争条件攻击
一些网站允许上传任意文件,然后检测文件是否包含Webshell,如果有则删除该文件。
服务器端在处理不同用户的请求时是并发进行的
如果并发处理不当或相关操作逻辑顺序设计的不合理时,将导致条件竞争漏洞
如这样一段代码
1 |
|
它先把文件保存在本地,再检查,然后删除
在上传完成和安全检查删除它的间隙,攻击者用多线程不断的发起访问请求该文件
该文件就会被执行从而生成一个恶意shell
漏洞防御
1、使用白名单限制可以上传的文件扩展名
2、注意0x00截断攻击(PHP更新到最新版本)
3、对上传后的文件统一随机命名,不允许用户控制扩展名
4、上传文件的存储目录禁用执行权限