# 文件上传漏洞:从绕过校验到 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;兜底防护:上传目录禁止脚本执行 + 后缀白名单。