1. 任意文件上传漏洞基础
什么是文件上传功能?
在网站和应用中,我们经常会看到允许用户上传文件的功能,比如:
- 更换头像:让用户上传自己的照片作为头像
- 发布图片:在社交媒体或论坛上传图片
- 提交文档:在办公系统中上传Word、Excel等文档
这些都是常见的文件上传功能。
任意文件上传漏洞是什么?
简单来说,这个漏洞就是:
- 网站本来只想让用户上传正常的文件(如图片、文档)
- 但由于网站没有正确检查上传的文件
- 导致攻击者可以上传危险的文件(如包含恶意代码的脚本文件)
为什么这个漏洞很危险?
如果攻击者成功上传了恶意文件:
- 他们可能获得对网站的控制权
- 可以查看、修改甚至删除网站的数据
- 严重情况下,可能获得整个服务器的控制权
什么是Webshell?
Webshell是攻击者最常用的一种恶意文件:
- 本质上是一段代码,通常伪装成普通网页文件
- 允许攻击者远程执行命令,控制服务器
- 常见类型有PHP、ASP、JSP等,取决于服务器使用的技术
Webshell分为几种:
- 大马:功能强大,体积较大,容易被发现
- 小马:功能简单(通常只能上传文件),体积小,不易被发现
- 一句话木马:极其简洁,通常只有一行代码,非常隐蔽
2. 文件上传漏洞利用条件和过程
成功利用的必要条件
要成功利用文件上传漏洞,需要满足以下条件:
- 木马上传成功:攻击者的恶意文件成功上传到服务器,且没有被安全软件删除
- 知道木马位置:攻击者需要知道上传文件在服务器上的具体路径
- 木马可以执行:服务器需要能够解析并执行这个恶意文件
典型的文件上传过程
一个完整的文件上传过程通常包括以下步骤:
- 客户端检查:使用JavaScript在浏览器中初步验证文件
- MIME类型检查:服务器检查文件的MIME类型是否合法
- 路径检查:确保文件不会被上传到危险的目录
- 扩展名检查:验证文件扩展名是否在允许列表中
- 内容检查:分析文件内容,确保没有恶意代码
3. 如何利用文件上传漏洞(GETSHELL)
基本步骤如下:
- 准备木马文件:创建一个包含恶意代码的文件
- 上传木马:将这个文件上传到存在漏洞的网站
- 获取路径:从服务器的响应中找出上传文件的存储路径
- 连接木马:使用专门的工具(如中国菜刀)连接到这个木马文件
- 执行操作:通过木马在服务器上执行各种操作
4. 常见的上传绕过技术
绕过JavaScript验证
原理:JavaScript验证在浏览器端进行,容易被绕过 方法:
- 使用浏览器开发者工具删除验证代码
- 使用Burp Suite等工具拦截并修改请求
绕过MIME类型验证
原理:服务器通过检查Content-Type字段判断文件类型 方法:
- 使用Burp Suite拦截上传请求
- 修改Content-Type为允许的类型(如image/jpeg)
- 发送修改后的请求
绕过文件扩展名验证
方法:
- 双扩展名:example.php.jpg
- 大小写混合:example.pHp
- 空格和点:example.php(空格).
- 特殊字符:example.php%00.jpg(需要PHP版本较低)
绕过内容检查
方法:
- 在正常文件中插入木马代码
- 使用编码或加密隐藏恶意代码
5. 防御措施
- 严格限制上传文件类型
- 使用白名单而不是黑名单
- 重命名上传的文件
- 将上传目录设置为不可执行
- 使用Web应用防火墙(WAF)
- 定期扫描已上传的文件