悬空标记注入
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/dangling-markup-injection-if7r。
技能介绍
要解决什么问题
当你拿到一个 HTML 注入点(反射型或存储型),却发现 JavaScript 执行被层层堵死:CSP 禁止内联脚本与事件处理器,消毒器剥掉 onerror、onload 等属性,WAF 拦下已知 XSS 模式。很多模型会直接判定「不可利用」,转而寻找别的出路——但页面里 CSRF token、预填的邮箱和用户名、API Key、隐藏字段里的会话标识往往就排在注入点之后。
这个技能回答的问题是:不执行 JS,能不能把数据带出去?答案是让浏览器自己发起一次请求,并把敏感内容拼进 URL 里。
技能如何工作
核心机制是注入一个未闭合的 HTML 标签,其 src、href、action 等属性指向攻击者服务器。未闭合的引号会「吞掉」后续所有页面内容,直到浏览器找到匹配的下一个引号——这段内容便成为发往攻击者域名的 URL 查询串。
主要利用向量:
<img>标签(最常见):浏览器发起 GET,吞下的内容作为查询参数外传;被img-src限制。<form action>劫持:注入点之后的</form>闭合攻击者表单,中间所有 input 在用户交互(甚至自动提交)时被发往攻击者;被form-action限制。<base>标签:页面后续所有相对 URL 都解析到攻击者服务器,可顺带劫持脚本与表单提交;被base-uri限制。<meta http-equiv="refresh">:整页跳转,吞下的内容进入 URL;被navigate-to限制(很少设置)。<link>/<style>:浏览器把 URL 当作 CSS 资源请求;被style-src限制。<textarea>+ 表单组合:未闭合的 textarea 把后续 HTML 全部当作纯文本吞下,配合表单劫持是最可靠的备选方案。<video poster>、旧式<table background>:适用于老浏览器。
适用边界与注意点
- 引号类型决定成败:页面属性用
",就用'注入,反之亦然。引号不匹配只会吞下无用内容甚至什么都不吞。 - 注入点必须在目标数据之前:CSRF token 若位于注入点上方,悬空标记吃不到它。
- 浏览器行为有差异:Chrome/Edge 会拦截属性值中含
<、>、``` 的悬空标记,Firefox 更宽松且允许属性值换行,Safari 接近 Chrome。 - CSP 不是万能答案:每个向量对应不同的指令限制,
img-src拦不住 DNS prefetch,style-src拦不住form-action。 window.name跨源持久:若能注入 iframe,name属性配合跳转是罕见的跨源数据通道。<meta http-equiv="Content-Security-Policy">不可注入,但<base>可以。
使用场景
- 在 CSP 禁止内联脚本、事件处理器被消毒器剥掉的注入点上,判断页面后方的 CSRF token 是否仍可外泄。
- 评估 form action 劫持能否在用户提交表单前,把预填的邮箱、API Key 等字段带往攻击者服务器。
- 测试页面中注入 <base> 标签后,后续相对 URL 的脚本加载与表单提交是否会被重定向到攻击者域名。
- 在 WAF 拦截已知 XSS 特征的情况下,验证 DNS prefetch 或 textarea 组合能否绕过限制带走 token。
适合人员
- 负责 Web 应用安全的渗透测试工程师,需要在 CSP 封锁脚本的场景里寻找仍能窃取数据的真实路径。
- 编写 AI 安全评估用例的研究员,想验证大模型在「不可利用」判断上是否会漏掉悬空标记注入。
- 制定前端加固规范的工程师,要确认 img-src、form-action、base-uri 等指令分别挡住哪些利用向量。
- 接手遗留系统的安全工程师,页面残留大量未闭合表格与老式属性,想评估旧浏览器上的注入风险。