
文章目录一、上传漏洞到底在怕什么二、先看服务端常犯的“假安全”1. 黑名单拦扩展名2. 只看前端 Content-Type / 前端扩展名3. 只看扩展名不看内容4. 用本地路径拼接原文件名5. 上传后立刻给出可猜测的 URL三、绕过技巧按“骗过谁”来分类1. 扩展名层面2. Content-Type 层面3. 文件头 / 内容层面4. 服务端逻辑漏洞式绕过5. 竞争条件6. WAF 与过滤绕过四、解析漏洞上传成功之后谁“帮你执行”1. Apache 相关思路历史与配置2. IIS / 相关历史问题3. Nginx 与 CGI / 错误配置4. 应用层“伪解析”5. 解析问题的统一防御五、GetShell 路径从功能滥用到代码执行路径 A直接上传可执行脚本路径 B上传 解析特性路径 C上传 文件包含路径 D上传 解压 / 处理流水线路径 E覆盖与配置文件六、授权测试怎么做才专业1. 范围与安全阀2. 信息收集3. 测试顺序4. 报告怎么写七、防御清单比追绕过更值钱1. 扩展名白名单2. 服务端重新命名3. 存储位置4. 类型校验5. 权限与架构6. 鉴权与业务7. 监测8. WAF八、收尾文件上传听起来不像 SQL 注入那么“经典教材”可一旦出问题讨论区语气往往会急转直下——因为很多人嘴里的下一步叫GetShell在服务器上落地可被解析执行的脚本进而拿到远程命令执行。对业务来说这几乎等于把钥匙递给了别人。一、上传漏洞到底在怕什么正常上传做的事很土用户选文件 → 服务端保存 → 需要时再给下载或展示。危险在于三件事叠在一起攻击者能影响存盘后的文件名或扩展名文件落在 Web 可访问目录甚至可被脚本引擎解析校验可以被骗或服务器对后缀/路径的解析与程序员想象的不一致。于是链路变成绕过校验上传恶意脚本 → 文件落在可访问路径 → 服务器按脚本解析执行 → 远程代码执行GetShell → 提权、翻库、打内网……反过来防御只要切断其中一环就常常能把“上传”变回普通功能严格白名单、随机改名、存到非 Web 目录、对象存储、禁止执行权限、类型嗅探与内容审计。二、先看服务端常犯的“假安全”很多系统不是没做校验而是做了看起来很努力、实际上很好骗的校验。1. 黑名单拦扩展名禁止.php、.jsp、.asp等。问题是名单永远不全大小写、双写、冷门扩展、可解析的奇葩后缀、解析漏洞制造的“假后缀”都能让黑名单捉襟见肘。原则扩展名校验请用白名单不要用黑名单。2. 只看前端 Content-Type / 前端扩展名浏览器里改一下表单或用代理改包前端检查直接消失。Content-Type 是客户端声明不是文件事实。3. 只看扩展名不看内容扩展开对了就收文件体却是脚本。若落在可执行目录且被解析依然危险。反过来只看文件头Magic Number也可能被“合法头 脚本体”之类手法戏弄所以要组合控制。4. 用本地路径拼接原文件名原文件名里带路径穿越、特殊字符可能写到预期目录外。即便不是脚本也可能覆盖配置、砸关键文件。5. 上传后立刻给出可猜测的 URL/upload/avatar.php这种可预测路径降低了利用成本。随机对象键 鉴权下载更稳。三、绕过技巧按“骗过谁”来分类下面按授权测试与代码审计里常见的类别讲思路。具体字符串会随框架、WAF、版本失效不要当字典背要当“检查清单”用。1. 扩展名层面大小写黑名单只写了小写php环境却不区分或规则不严谨。双扩展名 / 伪装name.php.jpg一类取决于服务器怎么取“扩展名”、以及是否存在解析问题。名单外可执行后缀某些环境会解析.phtml、.php5、个别处理器映射的后缀——以目标真实配置为准乱猜意义不大要靠信息和探针。空格、点、特殊字符历史上有些系统和过滤器处理截断或规范化不当强依赖版本现代框架多数已修。测试时先问白盒扩展名怎么截取正则是什么大小写怎么处理比盲目砸包快。2. Content-Type 层面服务端若相信Content-Type: image/png改包即可。正确做法是服务端自己嗅探类型并与白名单扩展名交叉验证仍要把文件当不可信数据处理。3. 文件头 / 内容层面只验 GIF/PNG 头时可能出现“头像是图后面跟脚本”的讨论。是否能执行关键仍看最终是否被当脚本解析。图片马更多是和解析漏洞、包含漏洞、错误的图片处理组合有关而不是“有文件头就一定能 GetShell”。修复上对图片走专用解码再编码打散多余数据、剥离元数据是常见工程手段。4. 服务端逻辑漏洞式绕过先上传再异步校验异步失败却没删干净校验与保存使用不同字段校验filename保存用另一个可控参数二次渲染/压缩路径与原文件路径不一致管理员“审核通过”才移动到 Web 目录但审核逻辑可被越权调用。这类绕过不靠花哨后缀靠业务逻辑——授权测试里含金量往往更高。5. 竞争条件“先保存再检查再删除”的实现在高并发下可能留下极短窗口。现代利用有时很刁钻防御上应先写入隔离区校验通过再原子发布失败则删除。6. WAF 与过滤绕过WAF 可能拦.php、拦特征字符串。绕过研究变化极快且与具体设备强相关。授权测试若撞上 WAF应记录现象优先推动源站修复白名单、非执行目录而不是把文章写成 WAF 绕过大全。对防守方WAF 是辅不是主。四、解析漏洞上传成功之后谁“帮你执行”有时扩展名校验其实拦住了.php攻击者却上传了.jpg或看似无害的文件仍能执行——因为Web 服务器/应用对 URL 到文件的映射和程序员以为的不一样。这类常被统称为解析漏洞或解析特性问题。下面用“机制”说明方便你做配置审计细节随版本变化上线环境以实测与官方文档为准。1. Apache 相关思路历史与配置Apache 对多后缀、处理器映射、.htaccess若允许覆盖等配置不当可能导致“看起来像图片的 URL”被交到 PHP 引擎。经典案例多出现在旧版本或危险配置上例如允许用户目录写.htaccess、错误的 handler 映射等。防守要点禁止上传目录使用.htaccess覆盖上传目录AllowOverride None并禁止脚本引擎保持组件更新。2. IIS / 相关历史问题历史上 IIS 在文件名解析、分号等处理上出现过与“真实执行文件”不一致的问题导致看似安全的后缀实际按脚本执行。现代 IIS 正确处理器映射下大量问题已修复但老站、奇怪的通配符映射、自定义 ISAPI仍值得审计。3. Nginx 与 CGI / 错误配置Nginx 本身解析模型和 Apache 不同常见风险更多来自错误地把请求转给 PHP-FPM 的规则写得过宽例如某些路径匹配不当与历史 CVE / 错误try_files用法组合静态目录却误配了脚本处理。配置审计时应盯哪些location会fastcgi_pass上传目录是否落在其中。4. 应用层“伪解析”不一定是服务器漏洞也可能是业务自己下载/预览接口按参数拼路径再include模板引擎加载用户上传文件解压 zip 时目录穿越 可执行目录。这和文件上传经常绑成一条链上传落盘 本地包含 / 解压 / 预览执行。5. 解析问题的统一防御不管是哪种中间件上传目录建议独立域名或独立存储OSS系统权限不可执行Web 服务器配置明确禁止脚本处理文件名随机化不保留用户后缀到可执行语境。这样即便偶发解析差异也少给 GetShell 留桥。五、GetShell 路径从功能滥用到代码执行“GetShell”在国内安全语境里通常指拿到 WebShell 或等价远程执行能力。路径可以抽象成下面几条认识链路即可。路径 A直接上传可执行脚本校验弱 文件在 Web 目录 扩展名可解析 → 访问 URL 即执行。这是最直的一条也是白名单与非执行目录最该打死的一条。路径 B上传 解析特性用户侧像上传成功了一张图服务器却按脚本处理该 URL。测与防都要围绕真实解析行为不要只围绕业务代码的if ext php。路径 C上传 文件包含脚本不能直接解析但存在include $_GET[file]一类问题或日志包含、模板包含。上传的文件被包含后执行。修上传不够还要修包含与任意文件读取。路径 D上传 解压 / 处理流水线压缩包穿越、图片处理命令拼接、视频转码命令注入——上传只是入口执行点在后面的处理程序。这种“GetShell”表象是上传根因常是命令注入或路径穿越。路径 E覆盖与配置文件能覆盖 web 配置、定时脚本、启动项不一定要扩展名是 php。所以“只允许图片”仍要防路径穿越与错误落盘位置。授权测试报告里建议写清你走的是哪条路径方便开发对症下药而不是笼统写“存在上传漏洞”。六、授权测试怎么做才专业1. 范围与安全阀确认可上传的最大文件、是否生产、中招后如何清理。生产环境避免上传真实攻击性脚本用无害探针例如唯一字符串文本、合法测试图片证明“可被访问/可被错误解析”往往更合适。需要验证执行时优先在靶场复现同配置。2. 信息收集中间件与版本、语言PHP/Java/Net上传后 URL 形态是否有 CDN/WAF响应里是否泄露绝对路径。3. 测试顺序正常上传观察保存名与访问方式改扩展名、Content-Type、文件名特殊字符看拦截点白盒或配置审计脚本处理规则评估是否 Web 目录、是否可执行最小证明 清理 修复建议。4. 报告怎么写写清入口、绕过了哪一层校验、文件最终路径、是否可被解析执行、潜在影响、修复优先级。附配置建议白名单、存储策略、目录权限、中间件片段示例按他们的栈。七、防御清单比追绕过更值钱1. 扩展名白名单只允许业务需要的少量类型如jpg/png/pdf。用严谨方式取扩展名处理大小写拒绝双扩展名里的危险成分策略要明确。2. 服务端重新命名UUID 白名单后缀丢弃用户原文件名或仅把原名当展示元数据存库。3. 存储位置优先对象存储 / 非站点根目录需要回源时经应用鉴权后流式输出。若必须本地目录无执行权限且 Web 配置禁止脚本引擎。4. 类型校验扩展名 内容嗅探 图片解码再编码。不要只信 Content-Type。5. 权限与架构处理文件的服务用低权限账号转码/压缩放隔离队列禁止对用户内容直接include。6. 鉴权与业务上传接口要登录与授权注意 IDOR传别人的头像路径管理审核接口防越权。7. 监测短时间大量上传、异常扩展名尝试、上传目录出现脚本后缀、PHP/JSP 新建文件告警——可进 HIDS/FIM参见本系列 HIDS 篇。8. WAF可作辅助检测异常上传特征不能替代白名单与不可执行存储。八、收尾文件上传漏洞的可怕在于它把“业务功能”和“远程执行”之间的距离缩得很短。绕过技巧教你如何怀疑假校验解析漏洞教你如何怀疑假后缀GetShell 路径教你如何从架构上拆桥。防守侧请记住更短的一句白名单、随机名、不可执行、非 Web 存储必要时再编码与隔离处理。今晚若只做一件事找出你们系统上传文件的最终目录看该目录在 Web 服务器上是否配置了脚本处理、操作系统是否有执行位再看代码是白名单还是黑名单。这三眼看完你对“我们会不会被 GetShell”的判断会比听一百个绕过故事踏实得多。