存储型 XSS 验证
存储型 XSS 指用户提交的数据被持久化保存,之后在其他页面渲染时未做编码,脚本随页面加载自动执行。它比反射型更危险:无需诱导点击特定链接,任何访问该页面的用户都会中招,影响范围随渲染点扩散。验证方法是用专用测试账号提交一个唯一标记串,然后在所有可能出现该数据的地方检索它——列表页、详情页、搜索结果、导出文件、邮件通知、后台管理界面——逐个判断渲染位置是否做了编码。凡是数据被存储后又展示的地方都要覆盖,前后台都不能漏。
基本信息
| 风险类型 | 跨站脚本(存储型),CWE-79 |
|---|---|
| 高风险字段 | 昵称、评论、工单、备注、地址、文件名 |
| 渲染点 | 列表、详情、搜索、导出、邮件通知、后台管理 |
| 验证方法 | 用专用测试账号提交唯一标记串,逐点检索 |
| 清理要求 | 测试数据要可识别、可删除,结束前清理 |
典型使用场景
- 用户资料:昵称、签名、地址等在多处展示的字段
- 工单与客服:工单内容、回复、备注进入后台界面
- 评论与留言:前台展示且常进入管理审核列表
- 文件名:上传文件的名字在列表与预览页展示
- 日志与通知:数据进入邮件模板或消息通知后渲染
验证步骤
验证步骤
1. 用专用测试账号提交唯一标记串
2. 在前台与后台多个渲染点检索标记
3. 找到未编码渲染位置,记录数据流(入口到存储到渲染)
4. 判断上下文类型,给出对应修复建议
5. 测试结束清理数据,并在报告注明清理情况渲染点与风险
| 渲染点 | 典型位置 | 关注点 |
|---|---|---|
| 前台列表 | 首页、搜索结果 | 数据被批量渲染,影响面最大 |
| 详情页 | 内容详情、个人主页 | 直接展示用户输入 |
| 后台管理 | 审核列表、用户管理 | 常被忽略,管理员会话权限高 |
| 导出文件 | Excel、CSV、PDF 导出 | 上下文不同,转义规则也不同 |
| 邮件通知 | 站内信、邮件模板 | HTML 邮件同样存在执行风险 |
修复视角:输出编码加富文本白名单过滤(保留安全标签属性)双管齐下;只做输入过滤容易在展示环节失效。
测试数据未清理会形成长期注入痕迹,也可能被其他用户看到;测试内容要可识别,结束前务必删除并在报告注明。