php投票网站,线上活动策划方案,新闻自动采集网站源码,平面设计找素材的网站前言
前端关于网络安全问题看似高深莫测#xff0c;其实来来回回就那么点东西#xff0c;我总结一下就是 3 1 4#xff0c;3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略#xff0c;其他的都是网络攻击。除…前言
前端关于网络安全问题看似高深莫测其实来来回回就那么点东西我总结一下就是 3 1 43个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略其他的都是网络攻击。除了这 4 个前端相关的面试题其他的都是一些不常用的小喽啰。
我将会在我的《面试题一网打尽》专栏中先逐一详细介绍然后再来一篇文章总结预计一共5篇文章欢迎大家关注
本篇文章是前端网络安全相关的第四篇文章内容就是关于中间人攻击欢迎收藏加关注。
一、准备工作
1.1 拉取仓库
本篇文章的基础是需要一个服务端的项目可以跟着我的这篇文章搭建自己的服务端项目。或者直接克隆我的仓库代码在这个提交上拉一个新分支本篇文章所有的代码都是在这个提交基础上进行的。 在本篇文章之前我已经写了 xss 攻击、 csrf 攻击、cors跨域的文章所以在你拉取我的 git 最新代码的时候已经有很多更新的提交了。不过无论是从上面我说的那个提交拉取新分支还是拉取最新的代码都可以我的仓库的所有的合并都是相互独立的。
不论你先其他的教程还是先看这篇中间人攻击的文章都可以。
1.2 新增 middleman 文件夹 二、中间人攻击原理
2.1 攻击原理
中间人攻击MITMMan-in-the-middle Attack多发生在未加密的通信中比如 http 就是未加密的明文传输中间人攻击是一种攻击方式攻击者插入自己作为通信方之间的“中间人”以截取、篡改或窃取传输的数据。中间人截取的是传输过程中的数据任何他觉得有用的数据都可以截取。中间人攻击并不仅仅发生在 HTTP 请求中它可以发生在任何通过网络传输的通信中包括 HTTP、SMTP、FTP等。
中间人攻击并不仅限于非加密通信在加密通信中也会存在比如 https 只不过难度更大。 在一些教程中介绍的关于中间人攻击的流程中很多描述的是通信双方有加密的场景让初学者误以为只有有加密的场景才是中间人攻击其实不然。因为 https 加密通信的中间人攻击比较复杂非加密通信的中间人攻击简单所以很少有人单独拿出来说。 但是我的这篇文章会详细介绍 【http 非加密通信的中间人攻击】和 【https 加密通信的中间人攻击】 2.2 常见形式
拦截和查看 攻击者截取传输中的数据包并查看其中的内容可能包括敏感信息。篡改 攻击者可能修改传输中的数据包以执行恶意操作如注入恶意代码或篡改页面内容。重放攻击 攻击者可能记录先前的通信并重放其中的某些请求以试图欺骗服务器或客户端。SSL Stripping 在HTTPS通信中攻击者可能试图将连接转换为不安全的HTTP连接从而绕过加密。【中间人和用户建立http 连接中间人冒充用户与服务器建立https连接】
2.3 防范措施
使用 HTTPS 对于敏感信息的传输始终使用HTTPS以确保通信是加密的。使用可靠的证书 在HTTPS 通信中使用受信任的 SSL/TLS 证书以确保通信的安全性。安全的公共 Wi-Fi 在使用公共 Wi-Fi 时尽量避免访问敏感信息因为这些网络可能容易受到中间人攻击。强大的身份验证 使用强大的身份验证机制如多因素身份验证以减少身份被盗用的风险。持续监控和检测 实施监控和检测机制以及时发现并应对中间人攻击。 在 HTTPS 通信中数据包是经过加密的可以增加中间人攻击的难度但中间人攻击仍然可能发生攻击者可以尝试使用各种技术解密或篡改加密通信。中间人攻击是一个缺乏相互认证的攻击https 中的 ssl 协议可以验证参与通讯的一方或双方使用的证书是否是权威受信任的数字证书认证机构颁发并且能执行双向身份认证。【信任链】 为什么公共 Wi-Fi 是不安全的? 通常公共 Wi-Fi 不启用 Wi-Fi 加密协议Wi-Fi 加密协议不是 https【不要一想到加密就想到https 】。Wi-Fi 加密协议有 wep、wpa、wpa2、wpa3 等这些协议可以加密通过 Wi-Fi 网络传输的数据防止被不相关的第三方截取防止中间人攻击。在一个公共 Wi-Fi 中即使网站使用了 httpsWi-Fi 本身没有启用加密攻击者仍可以截取 Wi-Fi 数据包尽管这些数据包中的具体内容是加密的。中间人攻击者仍可以能够分析 Wi-Fi 流量的模式、抓取一些元数据或者使用其他手段来识别用户的行为。 三、http 中间人攻击
我们接下来模拟 http 这种非加密通信中的 中间人攻击。
3.1 构建本地服务
强调一下如果你对下面这些构建服务的内容有疑问或者不懂的我建议你先看一下我的这篇关于构建 express 服务的文章。
3.1.1 新建 index.html
在 middleman 文件夹下面新建 index.html
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleDocument/title
/head
bodymiddlemanscriptfunction init() {fetch(info).then((res) {return res.json()}).then((data) {console.log(请求成功, data)})}init()/script
/body
/html
3.1.2 新建 index.js
在 middleman 文件夹下面新建 index.js
const express require(express);
const path require(path)
const cors require(cors)
const app express();
app.use(cors())app.get(/, function (req, res) {res.sendFile(path.join(__dirname, /index.html));
});app.get(/info, function(req, res){res.send({text: success})
})
app.listen(3000);3.1.3 运行服务
npm run dev middleman
3.2 使用 whistle 拦截请求
我们需要一个抓包工具模拟中间人攻击无论你用那种抓包工具都可以有很多可以选择的找一个你觉得好用的就行。 我这里使用的是 whistle 感觉还挺好用的。 whistle 貌似不能拦截 localhost 地址的请求不知道其他的工具能不能不过不重要我们在模拟的时候可以使用 ip 地址。 3.2.1 运行我们的服务 3.2.2 使用 whistle 拦截请求 3.2.3 伪造请求的返回 3.2.4 刷新本地服务 这就是一个简单的中间人攻击中间人就是我们的抓包工具拦截了请求伪造了返回结果这样就会给用户造成困扰。
注意我们本地的服务是一个 http 的服务你要知道 http 是明文传输非加密的请求所以我们可以随意的抓包进行中间人攻击。 这种中间人攻击比较简单所以很多面试题详解的中间人攻击过程其实都不是这种简单的抓包更多的是 https 的中间人攻击包括公钥、私钥啥的继续看我们后面会讲到。 四、https 基础知识
为了防范中间人攻击才推出了 https 加密传输协议。
4.1 http 和 https 的区别
httphttps明文传输密文传输默认端口80443是否安全不安全安全是否加密否使用 TLS / SSL加密
https 是基于 http 的安全版本实际上是在 http 之上添加了安全性和加密协议它使用TLSTransport Layer Security或其前身SSLSecure Sockets Layer来加密在客户端和服务器之间传输的数据。 关于 https 的加密逻辑又是一大堆知识点可以后续写一篇文章现在可以大概说一下 https 使用非对称加密加密密钥使用对称加密加密数据。 4.2 PKI 公钥基础设施
https 基于 PKI 技术。PKIPublic Key Infrastructure公钥基础设施是一种安全体系结构用于管理数字证书和密钥对以确保安全的数据传输和身份验证。PKI 采用了公钥加密技术其中每个实体都有一个公钥和一个私钥这对密钥用于加密和解密通信。
4.2.1 信息摘要
使用一个哈希函数对文档进行摘要运算生成一个固定长度的哈希值这个哈希值通常称为信息摘要。 在前端领域关于哈希函数这个概念还有哪些地方会用到 1路由导航的 #号 表示的哈希路由 2资源打包之后会给文件名加上哈希值用于静态资源完整性校验 3前端缓存管理也可以使用哈希函数对数据进行缓存防止健名冲突 常用的信息摘要算法
md5 生成128位的哈希值但由于其容易被碰撞攻击破解已经不再被广泛使用于安全领域但是在业务逻辑中常用把一个文件进行摘要获得唯一的哈希值可以用来判断文件是否被修改。【前端经常用到的 md5 的npm 包】SHA-256、SHA-384、SHA-512 属于SHA-2系列分别生成256位、384位和512位的哈希值。目前在许多安全应用中仍然广泛使用。【前端经常使用crypto-js】 1信息摘要的目的主要是为了防止数据被篡改所以哈希算法是不可逆的 2信息摘要是唯一的同一个数据用同样的哈希函数得到的值是一定的。 4.2.2 对称加密和非对称加密
对称加密非对称加密一个密钥两个密钥【公钥、私钥】速度快速度慢DES、AESRSA、ECC
4.2.3 公钥和私钥
在加密通信中公钥和私钥是一对密钥通常用于非对称加密算法。这些算法允许一个密钥用于加密而另一个密钥用于解密其中 公钥Public Key 公钥是一种可以自由分发的密钥用于加密数据。任何人都可以使用公钥对数据进行加密但只有拥有与之配对的私钥的实体才能解密这些数据。公钥通常用于加密通信中的敏感信息例如用于建立安全连接或传输敏感数据。 私钥Private Key 私钥是一种保密的密钥只有密钥的所有者知道。私钥用于解密由相应的公钥加密的数据。私钥通常用于解密接收到的加密数据以及对数字签名进行生成或验证。私钥必须始终保持保密以确保通信的机密性和完整性。 那么问题来了如何生成公钥和私钥 有公钥和私钥一定是非对称加密通常使用 OpenSSL 生成公钥和私钥。【这看起来也不是前端的工作哈哈】 4.2.4 数字签名
数字签名是一种用于验证电子文档真实性和完整性的技术。通过数字签名发送者可以在文档上附加一个数字签名接收者可以使用签名验证工具来确认文档的来源和是否在传输过程中被篡改。 数字签名防止数据被篡改这一点和信息摘要算法的作用是一样的。但是数字签名有更多的信息相当于是信息摘要的一个扩展应用。 1数字签名生成的过程 选择哈希算法 首先选择一个哈希算法例如SHA-256。哈希算法用于将消息或文档转换为固定长度的哈希值。【生成签名一定要有哈希算法】 创建消息摘要 使用选择的哈希算法对消息或文档进行哈希得到一个称为消息摘要message digest的固定长度字符串。这个摘要是消息内容的唯一表示。 使用私钥进行加密 数字签名的生成涉及使用私钥对消息摘要进行加密。这个过程使用的是非对称加密算法通常是使用数字签名算法中的私钥。 将签名附加到原始消息或文档 将生成的数字签名附加到原始消息或文档中形成带有数字签名的消息。
2数字签名的基本原理包括 消息摘要Message Digest 发送者使用一个哈希函数对要签名的文档进行摘要运算生成一个固定长度的哈希值。这个哈希值通常称为消息摘要。【消息摘要就是信息摘要】 私钥签名 发送者使用自己的私钥对消息摘要进行加密形成数字签名。 公钥验证 接收者使用发送者的公钥对数字签名进行解密得到消息摘要。 验证摘要 接收者再次对接收到的文档进行哈希运算得到一个新的消息摘要。 比较摘要 接收者将用公钥解密得到的消息摘要与重新计算得到的摘要进行比较。如果两者一致说明文档未被篡改且确实来自于私钥持有者。
4.2.5 数字证书
数字证书是一种用于在网络通信中验证身份和确保数据传输安全的安全工具。它是由数字签名和公钥加密技术结合而成的一种电子凭证。数字证书通常包含以下信息 主体信息Subject 证书中标识了证书的所有者通常是一个实体个人、组织或设备的名称。 公钥 证书中包含了与证书所有者相关联的公钥用于加密和解密通信中的数据。 数字签名 数字证书通过使用颁发者Certificate AuthorityCA的私钥对证书中的数据进行签名以确保证书的完整性和真实性。 颁发者信息Issuer 证书中标识了颁发该证书的CA的信息。 有效期 证书包含了一个指定的有效期范围确保证书在一段时间后会过期从而促使证书的定期更新。
数字证书形成步骤 生成密钥对 实体首先生成一对非对称密钥包括公钥和私钥。通常使用算法如RSA或ECC进行密钥对的生成。 创建证书请求CSR 实体生成一个包含其公钥以及其他相关信息的证书请求。这个请求包括实体的标识信息例如域名、组织名称等。 提交证书请求 将证书请求发送给证书颁发机构CA。CA是一个受信任的第三方机构负责验证请求者的身份并颁发数字证书。 验证身份 CA对证书请求进行身份验证以确保请求者拥有提供的标识信息域名、组织等。这可能包括域名验证、组织验证等。 颁发数字证书 CA验证成功后颁发数字证书。数字证书包含实体的公钥以及与证书相关的元数据如证书有效期、签名算法等。 证书签名 CA 使用自己的私钥对数字证书中的信息进行签名生成数字签名。这个签名可以被验证以确保证书的完整性和真实性。 证书发布 CA将数字证书返回给实体实体将其安装在其服务器或应用程序中。 使用数字证书 数字证书现在可以用于建立安全的通信通道例如在HTTPS中客户端和服务器可以相互验证身份并使用证书中的公钥进行加密通信。
4.2.6 PKI 关键组件的功能
证书颁发机构Certificate Authority CA 是 PKI 的核心组成部分负责验证个体或实体的身份并颁发数字证书。CA 签署证书用于证明数字证书的真实性。中国的 CA 机构有。【注意这是一个机构或者说一个公司】 中国互联网络信息中心CNNICCFCA中国金融认证中心WoSign沃通根证书认证机构数字证书 数字证书是包含公钥及相关身份信息的文件由CA签发。数字证书用于在网络上建立信任确保通信方的身份。注册机构Registration Authority RA 是 CA 的协助机构负责验证证书请求者的身份信息并将验证结果提交给 CA。RA在某些情况下可以由 CA 直接处理。证书存储库 证书存储库用于存储和检索数字证书。它是一个安全的存储区域通常由 CA进行管理。密钥对生成和管理 PKI 系统支持生成和管理加密算法所需的密钥对包括公钥和私钥。这确保了通信的安全性同时也涉及密钥的定期轮换和更新。证书撤销列表CRL CRL 是CA 发布的一个列表包含被吊销的数字证书的信息。这允许验证方检查证书是否仍然有效。数字签名 PKI 使用数字签名来保证证书的真实性和完整性。数字签名是用私钥生成的可通过公钥验证。
4.3 小结
啰里八嗦一大堆我们总结一下我们只要理解数字证书咋来的就能理解这些概念大概步骤如下
哈希算法 消息 信息摘要信息摘要 私钥 数字签名数字签名 实体信息 数字证书
五、https 中间人攻击
理论上 https 是设计用于防范中间人攻击的因为它是用加密机制来保护数据在客户端和服务器之间的传输https 通过 TLSTransport Layer Security和SSLSecure Sockets Layer 协议加密通信使得中间人在截获数据时无法解密敏感信息但是虽然 https 提供来重要的安全性增强仍然在一些可能的中间人攻击场景。
5.1 攻击场景
证书劫持 从证书颁发机构CA处获取伪造证书或通过其他方式获取目标网站的合法证书恶意证书颁发机构 恶意的证书颁发机构从而允许攻击者创建伪造的SSL证书。SSL剥离SSL Stripping 攻击者可能尝试将HTTPS连接转换为不安全的HTTP连接使得攻击者能够查看和修改未加密的通信降级攻击SSL/TLS漏洞 SSL/TLS 协议本身存在漏洞弱密码或弱密钥 如果 SSL/TLS 使用弱密码或弱密钥可能使攻击者很容易破解加密 我们可以模拟的场景其实就是第一个证书劫持我们在之后使用抓包工具如果想要拦截https 的请求也需要安装一个根证书。 比如我用的抓包工具 whistle 就需要这样设置。 5.2 防范攻击
使用受信任的证书颁发机构CA颁发SSL证书。实施公共密钥基础设施PKI以确保证书的真实性。启用HTTP Strict Transport SecurityHSTS以防止协议降级攻击。【SSL剥离】定期检查和更新服务器和 SSL/TLS 库以修复已知漏洞。在 Web 应用程序中实施安全性最佳实践如使用安全的 Cookie 标记、避免混合内容、配置CSP内容安全策略等。
5.3 攻击流程
客户端发送 https 请求中间人截获 https 请求然后在转发给服务端 中间人可以是抓包工具中间人可以通过伪造证书的方式截获请求服务端接收到请求【看起来是客户端发的实际上已经经过中间人转发了】服务端以为是一个安全的请求向客户端发送数字证书假设为 DC_A证书中包含公钥和CA等信息。 作为 https 请求的服务端一定是购买了安全的证书否则会提示不是安全的链接 数字证书里面包含是公钥 PK_A服务端私密保存数字证书对应的私钥SK_A中间人截获数字证书 DC_A使用 OpenSSL 提取其中的公钥 PK_A。然后把自己的数字证书 DC_B 发送给客户端 中间人有自己的数字证书其中数字证书包含了自己的公钥 PK_B 中间人私密保存自己的私钥 SK_B。客户端接收到数字证书 DC_B【这个证书看起来是服务端发的实际上是中间人的】客户端会验证数字证书是否有效步骤如下 证书链验证客户端检查证书是否由受信任的根证书颁发机构CA签发通过信任链验证证书的有效性。 客户端的操作系统中内置了根证书根证书通常用于验证 CA 。根证书验证 CA 的流程是信任链信任设备的根证书 操作系统内置 信任根证书签发它的 CA CA 信任颁发它的中间 CA 以此类推最终信任根证书签发的所有数字证书所以验证数字证书的本质是验证 CA所以我们在实现中间人攻击之前需要在我们的电脑上安装一个新的根证书这个根证书就是用来验证中间人的数字证书的。【这个根证书和中间人证书是一个CA 签发的】有效期验证检查证书是否在有效期内吊销状态检查检查证书是否被吊销客户端验证证书 DC_B 有效后提取公钥 PK_B并用公钥 PK_B 加密一个数据当作后续对称加密的私钥这个数据通常是随机字符串使用哈希算法得到的哈希值这里假设是 hash_B。中间人拦截请求得到使用自己的公钥 PK_B 加密的哈希值 hash_B用自己的私钥 SK_B 解密得到真实的哈希值 hash_B这个真实的哈希值后续用来解密所有拦截的客户端的请求。中间人再生成一个假的随机字符串 hash_A用服务端的公钥 PK_A 加密发给服务端。服务端接收到请求用自己的私钥 SK_A 解密得到哈希值 hash_A他以为是客户端发的实际是中间人伪造的后续客户端用这个哈希值 hash_A 加密数据和客户端进行后续的对称加密会话。中间人拦截服务端的返回用第8步假的哈希值 hash_A 就可以解密因为是对称加密然后再用 hash_B 加密发给客户端客户端接收到中间人用 hash_B 加密的数据再用 hash_B 解密就得到了服务端发送的数据。
在上面 1 - 11 这个过程中中间人只做了数据的窃取中间人还可以进行数据的篡改比如发给客户端的数据是自己胡编乱造的总之会对客户端用户造成很大的影响这就是中间人攻击。
5.4 代码模拟
依旧使用我们在 2.4 中的服务但是我们要模拟 https 攻击需要使用 whistle 进行域名映射把
http://10.10.25.120:3000 映射到 https://a.com
然后拦截 https://a.com 的请求并篡改返回。
5.4.1 本地服务映射为 https 5.4.2 拦截 https 请求
想要拦截 https 请求首先需要安装一个根证书信任这个根证书然后在 whistle 中选中这两个选项。 修改请求的返回值 总结
至此中间人攻击的全部流程已经解释完毕。
我的仓库地址如下欢迎查看
yangjihong2113/learn-express
内容较多难免疏漏如有问题欢迎指正。 这是一个系列文章欢迎关注我的专栏《面试题一网打尽》持续更新中。