浏览器安全学习

浏览器特性

  1. 会将一些特殊符号当做字母进行解析,此时一个符号可能会被解析成两个到三个字母,这样子如果有漏洞对输入做了限制,黑客就可以利用这个特性来绕过某些漏洞中长度限制。
  2. 某些特殊字符或者其他国家的文字和某些字母的形状一模一样,也有可能会被黑客用来伪造域名。不过现在已经不支持其他国家的文字和英文在一起来注册域名了。
  3. 浏览器的输入框可以直接输入账号密码登录服务器,此时可以构造特殊的账号密码,来迷惑用户让其以为自己访问正确的网站,例如 http://qq.com:80@evil.com,用户可能以为自己访问的是 qq,其实访问的是 evil.com。常见的浏览器基本都会隐藏登录信息,所以基本没啥影响。

如果没有同源策略会有什么后果

  1. 用户在 A 网页的数据,可以被 B 网页随意读取,例如可以B 网页可以读取 A 网页的 cookie 等。B 网页读取数据后可以模拟 A 网页上的用户对 A 网页执行任何操作,例如转账。
  2. 页面 B 可以直接像用户一样操作直接A页面

伪协议

伪协议分为浏览器伪协议和例如 php 伪协议的语言伪协议,PHP 伪协议是一种在 PHP 中使用的特殊协议,它们允许开发者访问 PHP 的内部功能或资源。

浏览器伪协议

浏览器伪协议通常是浏览器直接处理,不需要服务端参与,伪协议会控制浏览器执行一些操作,例如 :

  1. tel 伪协议可以让浏览器调用当前设备上的打电话的应用进行打电话,在 mac 上,此协议可以调出 facetime 进行打电话。
  2. mailto:example@example.com伪协议可以让浏览器打开设备上的发送邮件的程序,并给example@example.com这个用户编辑一封邮件。
  3. data:image/png;base64,iVBORw0KGg…伪协议会更新浏览器当前页面,并显示对应的数据,举例如下
data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48IS0tIEZvbnQgQXdlc29tZSBQcm8gNS4xNS40IGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIC0tPjxwYXRoIGQ9Ik01MDUgNDQyLjdMNDA1LjMgMzQzYy00LjUtNC41LTEwLjYtNy0xNy03SDM3MmMyNy42LTM1LjMgNDQtNzkuNyA0NC0xMjhDNDE2IDkzLjEgMzIyLjkgMCAyMDggMFMwIDkzLjEgMCAyMDhzOTMuMSAyMDggMjA4IDIwOGM0OC4zIDAgOTIuNy0xNi40IDEyOC00NHYxNi4zYzAgNi40IDIuNSAxMi41IDcgMTdsOTkuNyA5OS43YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwbDI4LjMtMjguM2M5LjQtOS40IDkuNC0yNC42LjEtMzR6TTIwOCAzMzZjLTcwLjcgMC0xMjgtNTcuMi0xMjgtMTI4IDAtNzAuNyA1Ny4yLTEyOCAxMjgtMTI4IDcwLjcgMCAxMjggNTcuMiAxMjggMTI4IDAgNzAuNy01Ny4yIDEyOC0xMjggMTI4eiIvPjwvc3ZnPg==
  1. javascript 伪协议,会在当前页面执行 js 代码,例如javascript:alert(document.cookie)
  2. about 伪协议,调用浏览器一些内部功能,例如 about:blank 是显示一个空白网页,但是域和打开它的时候所在页面的域一样。

浏览器的导航过程

导航是指浏览器定位到某个资源的过程。简单来讲步骤如下:

  1. 用户在导航栏中输入 url
  2. 浏览器使用 dns 服务解析出 目标的 ip 端口等信息,并和目标建立连接
  3. 下载目标返回的资源
  4. 将资源交给 html 解析器去解析成 dom 树
  5. 运行dom 中的 js 代码,js 代码可能会对 dom 树进行改变
  6. 此时运行浏览器自己的过滤器,例如 xss 过滤器(不好用,现在已经废弃)等
  7. 将最终的结果展现给用户

使用 windows.open 打开网页的特点

window.open(“https://www.baidu.com”);打开百度的时候,刚开始先打开的是about:blank,等 baidu 页面被渲染完成后,才会将地址栏中的 url 和网页内容显示出来。不过在显示出来前,about:blank 可以被创造它的页面完全控制,因为此时创造 about:blank 页面的页面和 about:blank 页面是同源的。

之前一些老的浏览器,会在显示 about:blank 页面的时候,地址栏先显示目标网站的 url(正确情况下应该在地址栏先显示 about:blank),等页面加载成功后再将正确的页面显示出来,此时的页面本质上还是 about:blank。

此时如果黑客可以利用某种技术,中断浏览器对正确页面的解析,让此页面继续保持在 about:blank 状态下,就可以完全控制这个页面。此时页面本质上还是 about:blank, url 是目标网站 url,但是内容却能被黑客完全控制,黑客可以通过控制 dom 树来伪造无比逼真的页面,现在已经无法利用。

为什么window.open()不直接打开目标页面而是先显示一个 about:blank 页面

  1. 浏览器访问目标 url 是需要一定时间的,此时如果弹出一个 about:blank 页面可以让用户知道浏览器正在执行操作,用户不会觉得浏览器稍微卡了一下,这样子的话用户体验会更好。
  2. 无论 window.open 是否被提供了正确的 url,浏览器都回打开新的页面,这样保持了结果的一致性,用户体验更好。
  3. 先创建窗口,再加载资源是浏览器的默认流程。
  4. 因为浏览器要对资源进行同源策略的判断,所以不能立刻加载目标url 返回的数据。此时又必须创建新的页面来反馈用户让用户知道浏览器确实在准备加载资源,所以浏览器需要先弹出一个页面,这个页面中的资源在弹出的时候就必须符合同源策略。此时 about:blank 页面就满足这个要求。当目标的 url 解析完毕后,会替换 about:blank 中的内容。

总得来说就是为了安全性和用户的体验更加流畅。

csp内容安全策略

作用是限制当前页面可以加载什么资源,不能加载什么资源。下面是 csp 的策略和策略值。

指令描述
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">default-src</font>指定默认的资源来源策略,适用于所有未明确指定的资源类型
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">script-src</font>指定允许加载和执行的JavaScript资源来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">style-src</font>指定允许加载的CSS资源来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">img-src</font>指定允许加载的图像资源来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">connect-src</font>指定允许发起网络请求的来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">font-src</font>指定允许加载的字体资源来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">object-src</font>指定允许加载的对象资源(如插件、Flash等)来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">media-src</font>指定允许加载的媒体资源(如音频、视频)来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">frame-src</font>指定允许嵌入的框架(如iframe)来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">worker-src</font>指定允许加载的Web Worker脚本来源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">base-uri</font>指定允许的文档基础URL
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">form-action</font>指定允许的表单提交URL
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">frame-ancestors</font>指定允许嵌入当前页面的框架来源
策略值含义
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">'self'</font>允许资源从当前域加载
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">'unsafe-inline'</font>允许内联脚本和样式
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">'unsafe-eval'</font>允许使用<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">eval()</font>
函数和<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">new Function()</font>
构造函数
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">'none'</font>不允许加载任何资源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">'sha256-<hash>'</font>允许加载具有指定SHA-256哈希值的资源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">'sha384-<hash>'</font>允许加载具有指定SHA-384哈希值的资源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">'sha512-<hash>'</font>允许加载具有指定SHA-512哈希值的资源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">'nonce-<random-value>'</font>允许加载具有指定随机nonce值的资源
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">https:'</font>允许资源从HTTPS协议加载
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">http:'</font>允许资源从HTTP协议加载(不推荐,存在安全风险)
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">data:'</font>允许资源从<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">data:</font>
URI加载
<font style="color:rgba(0, 0, 0, 0.6);background-color:rgb(248, 248, 248);">blob:'</font>允许资源从Blob URL加载

通过控制台执行 js 脚本,这种方式是内敛脚本执行,script-src ‘self’;规则会阻止这样的脚本执行。只有同源网站上的.js 文件才能在这个页面上执行。

绕过csp:MIME sniff

假设服务器设置了 csp,只允许执行同源的脚本,但是服务器没有对自己的文件设置正确的 mime 类型,当浏览器请求这个资源的时候会猜测这个资源是什么,猜测的依据是资源的内容。

此时我们可以上传一个图片,这个图片是经过精心构造的,内部有我们的 js 脚本代码。然后在网页上插入一段 html 代码,具体是插入 img 标签,并用 img 标签的 src 属性调用这个图片,此时即可执行图片中融合的 js 代码。因为此时浏览器会将这个图片的 mime 属性识别成octec-stream 或者 script,而不是 image。

如果服务器设置了正确的 mime 类型,则无法通过这种方式绕过 csp。

CORS 跨域资源共享

本质是一种机制,可以让不同的域之间进行资源访问。实现方式是添加几种http 头,通过发送一个options请求,确认目标域是否允许跨域访问。如果允许的话,当前域就可以访问目标域了。

浏览器插件带来的安全问题

  1. 机器上已经安装的某些插件可能有任意代码执行漏洞,此时构造一个 xss 漏洞或者给受害者发送一封含有 xss 漏洞链接的邮件,当受害者点击链接时即可触发漏洞。
  2. 利用 xss 来利用浏览器自身的漏洞去静默安装一个含有 rce 漏洞的合法公开插件,然后利用这个插件漏洞达到代码执行的目的。
  3. 直接安装一个有漏洞的插件,然后用另一个程序和这个插件通信,进而获取浏览器中的数据。

不过现在新版本浏览器已经很难在不被发现的前提下安装插件了。

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

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

相关文章

Jenkins | Jenkins安装

Jenkins安装 一、前置准备二、启动三、登录 一、前置准备 下载安装包 war包 下载地址: https://www.jenkins.io/ 安装jdk 要求jdk11版本以上 集成maven项目的话 需要有maven 与 git 二、启动 启动命令 需要注意使用jdk11以上的版本 /usr/java/jdk17/bin/java -Xms2048m -X…

Unity UI 道路线跟随:让图标沿道路轨迹移动

在 Unity UI 开发中&#xff0c;有时需要让图标沿着一条道路轨迹移动&#xff0c;比如地图上的车辆行驶动画、导航路径指示等。本文介绍如何基于 UI 图片中的道路线生成曲线&#xff0c;并使用 Slider 控制图标沿轨迹运动&#xff0c;适用于 UI 导航、路径跟随动画等场景。 1. …

「软件设计模式」建造者模式(Builder)

深入解析建造者模式&#xff1a;用C打造灵活对象构建流水线 引言&#xff1a;当对象构建遇上排列组合 在开发复杂业务系统时&#xff0c;你是否经常面对这样的类&#xff1a;它有20个成员变量&#xff0c;其中5个是必填项&#xff0c;15个是可选项。当用户需要创建豪华套餐A&…

有哪些免费的SEO软件优化工具

随着2025年互联网的不断发展&#xff0c;越来越多的企业意识到在数字营销中&#xff0c;网站的曝光度和排名至关重要。无论是想要提高品牌知名度&#xff0c;还是想要通过在线销售增加收益&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;都是一项不可忽视的关键策略。而要…

DeepSeek从入门到精通:提示词设计的系统化指南

目录 引言&#xff1a;AIGC时代的核心竞争力 第一部分 基础篇&#xff1a;提示词的本质与核心结构 1.1 什么是提示词&#xff1f; 1.2 提示词的黄金三角结构 第二部分 类型篇&#xff1a;提示词的六大范式 2.1 提示语的本质特征 2.2 提示语的类型 2.2.1 指令型提示词 …

单智能体到多智能体智能体任务规划有什么变化

单智能体到多智能体智能体任务规划有什么变化 核心原理 单智能体任务规划:大模型利用其强大的自然语言理解和生成能力,结合多模态信息,将自然语言描述的任务分解为可执行子任务,并能根据环境反馈调整执行策略。在规划过程中,可通过不同方式生成或优化任务计划,如端到端规…

算法之 跳跃游戏

文章目录 55.跳跃游戏思路参考&#xff1a;56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析&#xff1a; 两种思路&#xff0c;思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr&#xff0c;如果i>mr就说明无法到达i,否则就是可以到达&#xff1b;…

Ubuntu22.04通过Docker部署Jeecgboot

程序发布环境包括docker、mysql、redis、maven、nodejs、npm等。 一、安装docker 1、用如下命令卸载旧Docker: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 2、安装APT环境依赖包…

STM32 ADC介绍(硬件原理篇)

目录 背景 AD转换器 采样与保持 量化 编码 AD转换器转换原理 DA转换原理 AD转换原理 1.逐次逼近型AD转换器 2.并联比较型AD转换器 编码器 同步D触发器和边沿D触发器 基本RS触发器 同步RS触发器 同步D触发器 边沿型D触发器&#xff08;维持-阻塞D触发器&#xff…

DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏

DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器&#xff0c;可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API&#xff0c;开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…

编程技巧:VUE 实现接口返回数据的流式处理

一、写在前面 ChatGPT 的问答响应界面相信大家都见过&#xff0c;内容是一点一点追加式的显示。不是等好了一起发给你&#xff0c;然后一次性展示出来。这种效果和我们平常开发的展示渲染模式有点区别。可能有的同学会说&#xff0c;前端拿到报文后&#xff0c;我们做成这样的…

Django 创建表 choices的妙用:get_<field_name>_display()

1.定义choices 我在创建表时&#xff0c;对于性别这个字段&#xff0c;定义了choices 选项&#xff0c;1代表男&#xff0c;2代表女 mysql中表的数据如下&#xff0c;里面存储的是1或2 如果我们在网页上展示的时候&#xff0c;想展示“男”或“女”&#xff0c;而不是数字1或2…

Mac安装JD-GUI

Mac安装反编译工具步骤如下&#xff1a; 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包&#xff0c;点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK&#xff0c;通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…

[免费]Springboot+Vue医疗(医院)挂号管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringbootVue医疗(医院)挂号管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue医疗(医院)挂号管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 在如今社会上&#xff0c;关于信息上…

链表(典型算法思想)—— OJ例题算法解析思路

目录 一、2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 1. 初始化 2. 遍历链表并相加 3. 返回结果 举例说明 二、24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码思路 举例说明 初始状…

twisted实现MMORPG 游戏数据库操作封装设计与实现

在设计 MMORPG&#xff08;大规模多人在线角色扮演游戏&#xff09;时&#xff0c;数据库系统是游戏架构中至关重要的一部分。数据库不仅承担了游戏中各种数据&#xff08;如玩家数据、物品数据、游戏世界状态等&#xff09;的存储和管理任务&#xff0c;还必须高效地支持并发访…

lvsDR模式实现

LVS DR模式与NAT模式的优缺点&#xff1a; NAT&#xff1a;优点&#xff1a;配置简单&#xff0c;所需网络环境简单&#xff0c;访问流量的出入都经过LVS服务器&#xff0c;控制流量简单&#xff0c; 缺点&#xff1a;由于访问流量的出入都会经过LVS服务器&#xff0c;所以LVS…

闭源大语言模型的怎么增强:提示工程 检索增强生成 智能体

闭源大语言模型的怎么增强 提示工程 检索增强生成 智能体 核心原理 提示工程:通过设计和优化提示词,引导大语言模型进行上下文学习和分解式思考,激发模型自身的思维和推理能力,使模型更好地理解和生成文本,增强其泛用性和解决问题的能力。检索增强生成:结合检索的准确…

【快速幂算法】快速幂算法讲解及C语言实现(递归实现和非递归实现,附代码)

快速幂算法 快速幂算法可用分治法实现 不难看出&#xff0c;对任意实数a和非负整数n&#xff0c;有&#xff1a; a n { 1 , n 0 , a ≠ 0 0 , a 0 ( a n 2 ) 2 , n > 0 , n 为偶数 ( a n 2 ) 2 ∗ a , n > 0 , n 为奇数 a^n \begin{cases} 1, & n 0, a\neq 0…

大数据SQL调优专题——Hive执行原理

引入 Apache Hive 是基于Hadoop的数据仓库工具&#xff0c;它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中&#xff0c;HQL默认转换成MapReduce程序运行到Yarn集群中&#xff0c;大大降低了非Java开发者数据分析的门槛&#xff0c;并且Hive提供命令…