物理 XSS的身世
盲猜有人看成XXS了
跨站脚本攻击
1 核心定义
XSS 是一种代码注入攻击,攻击者将恶意脚本(通常为 JavaScript)注入到可信网站中,当用户浏览器解析该网站时,脚本随页面一同执行
2 根本成因
- 用户输入未经过滤或转义直接输出到 HTML 页面
- 浏览器信任来自同源(Same-Origin)的脚本,无法区分合法与恶意代码
- Web 应用将用户数据视为可执行代码而非纯文本
3 三种主要类型
3.1 反射型 XSS(Non-Persistent)
- 恶意脚本通过 URL 参数、表单提交等即时请求传递
- 服务器将脚本原样反射回响应页面,仅影响点击链接的当前用户
- 典型场景:搜索框错误提示、URL 重定向参数
- 攻击链路:构造恶意链接 → 诱导用户点击 → 浏览器执行反射脚本 → 窃取 Cookie 或重定向
3.2 存储型 XSS(Persistent)
- 恶意脚本永久存储在服务器数据库、文件或缓存中
- 每次访问受感染页面时,脚本自动从服务器加载并执行
- 典型场景:论坛帖子、评论区、用户资料、商品评价
- 攻击链路:提交恶意内容 → 服务器存储 → 其他用户访问页面 → 脚本在受害者浏览器执行 → 蠕虫式传播
3.3 DOM 型 XSS(基于文档对象模型)
- 完全不经过服务器后端,恶意脚本在前端 DOM 操作中产生
- 利用
document.write、innerHTML、eval、location.hash、document.cookie等客户端 API - 典型场景:单页应用(SPA)的路由参数、前端模板渲染、客户端缓存读取
- 攻击链路:恶意 URL 片段 → JavaScript 读取并修改 DOM → 脚本执行 → 劫持用户会话
4 攻击危害(按严重程度排序)
- 会话劫持:窃取 Cookie、Session ID,伪装成受害者发起请求
- 键盘记录:通过
onkeydown事件捕获所有按键,获取密码与敏感信息 - 钓鱼攻击:篡改页面内容,伪造登录框或支付表单,收集用户凭证
- 内网探测:利用 JavaScript 发起内网请求,扫描端口或获取内部服务信息
- 强制下载:通过
iframe或window.open诱导下载恶意文件 - 蠕虫传播:利用用户身份发送恶意私信或帖子,实现自动扩散
- 浏览器历史与剪贴板读取:获取用户浏览记录或复制内容
5 防御体系(纵深防御原则)
5.1 输入验证(过滤)
- 白名单优先:只允许预期格式的字符(如数字、字母、特定符号)
- 黑名单辅助:过滤
<script>、javascript:、onerror=、onload=等危险模式 - 上下文感知:验证内容是否匹配 URL、邮箱、日期、数字等具体类型
- 长度限制:防止超长 payload 绕过过滤逻辑
5.2 输出编码(转义)—— 最核心防御
- HTML 实体编码:
<→<,>→>,&→&,"→",'→' - HTML 属性编码:对属性值内的特殊字符(空格、引号、尖括号)进行编码
- JavaScript 编码:对字符串中的
\、"、'、\n、\r等进行 Unicode 转义(如\u003c) - CSS 编码:对 URL 或动态样式值中的
()、;、\转义 - URL 编码:对查询参数整体使用
encodeURIComponent - 注意编码顺序:先按目标上下文(HTML/JS/CSS/URL)选择对应编码器,再输出
5.3 使用安全 API 替代危险操作
- 禁止:
innerHTML、outerHTML、document.write、eval、setTimeout(string)、setInterval(string) - 推荐:
textContent、innerText、createElement+appendChild、setAttribute - 使用
DOMPurify等库对 HTML 进行净化(Sanitize),保留安全标签并移除事件处理器
5.4 HTTP 安全头
- CSP(内容安全策略):通过
Content-Security-Policy头限制脚本来源(script-src 'self'),禁止内联脚本(unsafe-inline)和eval(unsafe-eval) - X-XSS-Protection:启用浏览器内置反射型 XSS 过滤器(
X-XSS-Protection: 1; mode=block),但该头已逐渐废弃,CSP 为主 - HttpOnly:标记 Cookie 为
HttpOnly,禁止 JavaScript 读取(防御会话劫持) - Secure:Cookie 仅在 HTTPS 下传输
- SameSite:限制 Cookie 的跨站发送(Lax 或 Strict)
5.5 框架内置防护
- React:默认 JSX 中变量为文本,使用
dangerouslySetInnerHTML时必须配合 DOMPurify - Vue:使用
{{ }}插值自动转义,v-html需谨慎 - Angular:默认模板对变量进行编码,使用
bypassSecurityTrust必须显式声明 - 所有框架均提供自动转义,但开发者绕过时需额外检查
5.6 其他辅助措施
- 使用随机 CSRF Token 防止恶意脚本利用用户身份发起请求
- 设置
X-Content-Type-Options: nosniff防止 MIME 类型嗅探 - 对上传文件进行重命名并存储于独立域名(避免同源执行)
- 定期使用自动化扫描工具(如 OWASP ZAP、Burp Suite)检测 XSS


14.后记
1.本帖只为计算机科普,无任何不良引导
2.仅供学习使用,不得运用至真实的网络攻击
3.若因此受到警告,405(禁止访问),拉黑,甚至牵制到行政,刑事责任,质心论坛,本帖与我概不负责
共1条回复
时间正序
