文件上传漏洞:从绕过校验到 WebShell 落地
admin
2026-10-26 18:21
72人看过
免费
# 文件上传漏洞:从绕过校验到 WebShell 落地|红蓝对抗演练视角
> 核心一句话:**业务允许用户上传文件,但后端校验逻辑存在缺陷,攻击者成功上传可执行脚本文件(WebShell),服务端解析执行,拿到服务器权限。**
> 前提条件:上传文件**能被Web服务器解析执行**,并且攻击者知道上传后的访问路径。
## 一、原理
正常业务:头像上传、附件上传,只允许图片(jpg/png)。
开发者做校验(前端JS校验、后缀名校验、文件头校验),但校验逻辑可被绕过;
上传一句话木马(webshell),访问该文件地址,Web容器(Nginx/Apache/IIS)把脚本当做代码执行。
一句话PHP Webshell示例
```php
```
## 二、各类校验绕过方式(红队常用)
### 1. 前端JS校验绕过(最简单)
仅在网页前端用JS判断后缀。
✅绕过:抓包修改数据包,删掉JS限制,直接上传php文件;或者禁用浏览器JS再上传。
> 重点:**前端校验只是展示层面,后端不校验=完全无效**
### 2. 后缀名校验绕过(后端黑名单)
后端黑名单禁止`.php`,但漏了其他可执行后缀
- PHP环境:`php3、php4、php5、phtml`
- 大小写绕过:`.PhP`,部分服务器解析
- 双后缀:`xxx.jpg.php`
- 空字符截断(老版本):`xxx.php%00.jpg`(00截断,PHP<5.3.4)
### 3. 文件头校验(MIME/图片头绕过)
后端读取文件头部二进制,判断是不是图片(GIF89a、FFD8FF),仅校验文件头。
✅绕过:图片马。
图片文件头部加上GIF标识,后面追加PHP木马代码。
```
GIF89a
```
文件后缀如果是jpg,**单独访问不会执行**;一般需要搭配**文件包含漏洞**,包含这个jpg文件,触发代码执行。
### 4. Content-Type 校验绕过
后端校验请求头`Content-Type: image/jpeg`。
✅绕过:抓包修改请求头即可伪造,极易绕过。
### 5. 中间件解析漏洞(Nginx/Apache/IIS 历史漏洞)
1. Nginx:`xxx.jpg/.php`,访问jpg文件后拼接`/.php`,Nginx会把jpg交给PHP解析
2. Apache:`xxx.php.xxx`,后缀未知,向前识别到php执行
3. IIS 旧版本:`xxx;.asp` 解析为asp脚本
> 关键点:单纯上传图片马,如果没有解析漏洞/文件包含漏洞,**无法直接执行**。
## 三、完整攻击链路
1. 探测:寻找上传点(头像、附件、文件提交),测试校验机制
2. 尝试绕过上传校验:前端绕过 / 后缀绕过 / 图片马 + 中间件解析漏洞
3. 上传WebShell,获取上传后的文件访问地址
4. 访问webshell地址,用蚁剑/菜刀连接,执行系统命令
5. 服务器信息收集、本地提权、抓取凭据,进入内网横向
## 四、蓝队审计&检测
### 代码审计检查点
1. 文件校验**必须后端校验,不能只依赖前端**
2. 校验内容:文件后缀(白名单优先!)、文件大小、文件内容、文件头
3. 上传目录禁止赋予脚本执行权限!(最重要防御点)
### 流量&日志特征
- POST上传数据包内包含` 黑名单,黑名单永远存在绕过空间
4. 上传目录**取消脚本执行权限**是兜底防护,就算上传成功也无法RCE
一句话速记:
文件上传漏洞根源是后端校验不足;多种方式绕过文件校验上传WebShell;兜底防护:上传目录禁止脚本执行 + 后缀白名单。
版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载或以其他方式使用本站原创内容。