XSS 的本质只有一句话:浏览器把攻击者输入的"数据",当成了"代码"来执行。 本文从基础概念讲到三个靶场实战:属性逃逸、JSONP 劫持、登录框反射型。
⚠️ 本文所有测试均在授权靶场中完成,仅用于安全学习与防御研究,请勿用于未授权目标。
一、XSS 基础
1.1 什么是 XSS
全称:Cross-Site Scripting(跨站脚本攻击)
原理:网站对用户输入的过滤不足,攻击者把恶意代码(通常是 JavaScript)注入到网页中。其他用户浏览这个页面时,嵌入其中的恶意代码就会被浏览器执行。
两个核心要素:
| 要素 | 说明 |
|---|---|
| 用户输入不可信 | 任何来自用户的内容都可能是攻击载荷 |
| 输出未经过滤 | 数据被原样拼进 HTML,于是变成了代码 |
📌 和 SQL 注入对照着记:SQL 注入是让数据库把数据当命令执行,XSS 是让浏览器把数据当代码执行。病根完全一样——数据越界成了代码。
1.2 为什么缩写是 XSS 而不是 CSS
因为 CSS 这个缩写已经被"层叠样式表"(Cascading Style Sheets)占用了。为了在书面表达上不混淆,安全领域把 Cross-Site Scripting 缩写为 XSS。
1.3 三种主要类型
| 类型 | 是否持久化 | 触发条件 | 典型场景 |
|---|---|---|---|
| 反射型 | ❌ 非持久 | 需要诱导受害者点击恶意链接 | 搜索框、错误提示页、登录失败回显 |
| 存储型 | ✅ 持久 | 访问页面即触发,无需点击 | 留言板、评论区、用户资料页 |
| DOM 型 | ❌ 非持久 | 浏览器端 JS 处理数据时触发 | 前端路由、动态渲染 |
逐条说明:
-
反射型:恶意代码作为请求参数(如 URL 参数)发给服务器,服务器把它原样"反射"回响应页面。一次访问通常只影响一个用户。
-
存储型:恶意代码被存进服务器(数据库、文件系统),所有访问该页面的用户都会中招,危害最大。
-
DOM 型:不经过服务器端解析,是浏览器 JS 动态修改 DOM 树造成的。详见第三章。
1.4 危害
-
窃取用户 Cookie → 账户劫持
-
会话劫持(Session Hijacking)
-
篡改网页内容(钓鱼、挂马)
-
键盘记录、窃取隐私
-
结合 XSS 发起 CSRF 攻击
二、常用 Payload 与变形
2.1 <script>alert(1)</script>:最简单粗暴的明牌
翻译成大白话:"浏览器,立刻执行一段脚本,给我弹个写着 1 的框!"
| 片段 | 作用 |
|---|---|
<script> |
HTML 的"代码执行区"入口,告诉浏览器接下来是代码而不是文字 |
alert(1) |
JS 最基础的弹窗命令,1 是弹窗显示的内容 |
</script> |
代码执行区到此结束 |
打个比方:好比你去别人的留言板上留言,没写字,而是贴了张纸条写着"请朗读以下内容:啊!"。网站没做防护,下一个来看留言的人,浏览器读到纸条就乖乖念了出来。
2.2 <img src=x onerror=alert(1)>:伪装成图片的陷阱
翻译成大白话:"浏览器兄弟,请你尝试加载一张名叫 x 的图片。如果找不到(肯定找不到),就立刻给我弹个框!"
| 片段 | 作用 |
|---|---|
<img> |
网页里最普通、最无害的标签,防御系统常常对它放松警惕 |
src=x |
图片地址故意写成一个不存在的 x,加载必然失败 |
onerror=alert(1) |
陷阱核心:onerror 是"出错就执行"的事件,加载失败即触发 |
优势:不需要用户交互,而且在过滤了 <script> 标签的环境里依然有效。
2.3 常见变形
| 思路 | 示例 |
|---|---|
| 换事件 | <svg onload=alert(1)>、<input autofocus onfocus=alert(1)>、<details open ontoggle=alert(1)> |
| 伪协议 | <a href="javascript:alert(1)">click</a> |
| 大小写混合 | <ScRiPt>alert(1)</ScRiPt> |
| URL 编码 | %3Cscript%3Ealert(1)%3C/script%3E |
| 双写绕过 | <scr<script>ipt>alert(1)</script> |
| 空格替代 | & |


1033

被折叠的 条评论
为什么被折叠?



