反射型 XSS 是什么
反射型 XSS(Cross-Site Scripting,跨站脚本)指用户提交的输入未经编码就回显在响应中,浏览器把它当作 HTML 或脚本解析执行。它与存储型的区别是数据不进数据库,只随当次请求反射回来,通常需要诱导受害者点击构造好的链接才能触发。验证的关键是定位回显位置与上下文——同样的输入落在 HTML 文本、HTML 属性、JavaScript 字符串还是 URL 里,利用方式与修复手段完全不同。常用做法是提交一个唯一无害标记串,在响应中检索它出现的位置,再判断该位置是否做了编码处理。
基本信息
| 风险类型 | 跨站脚本(反射型),CWE-79 |
|---|---|
| 定位方法 | 提交无害唯一标记串,检索响应中的出现位置 |
| 上下文类型 | HTML 文本、HTML 属性、JavaScript、URL |
| 证明方式 | 必要时用无害弹窗在自测浏览器验证可执行性 |
| 修复方向 | 按上下文做输出编码,配合内容安全策略(CSP) |
典型使用场景
- 搜索框回显:搜索关键词原样显示在结果页
- 错误回显:错误提示把输入参数直接写回页面
- 表单预填:查询失败后把提交内容回填到输入框
- 跳转提示:提示语拼接了用户可控的 URL 或标题
- 接口返回 HTML:部分接口的 message 字段被页面当 HTML 渲染
标记法
标记法
1. 提交唯一标记串(如 xss-verify-7f3a),记录请求
2. 检索响应中出现的位置与上下文类型
3. 检查该位置的编码处理(是否实体编码)
4. 若进入 HTML 属性或脚本上下文,重点记录
5. 必要时在自测浏览器用无害弹窗确认可执行
6. 记录上下文与编码现象,给出对应修复建议上下文与处理方式
| 回显位置 | 危险点 | 修复手段 |
|---|---|---|
| HTML 文本 | 标签可被注入 | 对 < > & " ' 做 HTML 实体编码 |
| HTML 属性 | 属性可被闭合 | 属性值加引号并实体编码,避免写入事件属性 |
| JavaScript 字符串 | 可跳出字符串执行 | 用 JSON 序列化加安全转义,禁止直接拼接 |
| URL 参数 | javascript: 等协议 | 校验协议白名单,输出做 URL 编码 |
| CSS 或注释 | 特殊解析规则 | 按对应上下文转义,或避免用户输入进入该位置 |
证明输入未编码进入危险上下文即足以说明风险;验证性弹窗只允许在测试账号与自用浏览器中进行,不对真实用户发起。
不要以能否弹窗作为唯一判定标准。CSP 拦截提示也不代表漏洞不存在——CSP 属于纵深防御,配置不当或存在绕过点的情况都可能出现。