网络2️⃣HTTPS、Web 攻击技术
1、对比 HTTP
HTTPS 是在
TCP
和HTTP
之间添加SSL/TLS
安全协议,解决 HTTP 的安全性问题。
HTTP | HTTP Secure | |
---|---|---|
含义 | 超文本传输协议 | 超文本传输安全协议 |
默认端口 | 80 | 443 |
连接建立 | TCP 三握 → 传输 HTTP 报文 | TCP 三握 → SSL/TLS 握手 → 加密传输 HTTP 报文 |
2、安全性问题 🔥
HTTP 存在三大安全性问题
- | 窃听 | 篡改 | 伪装 |
---|---|---|---|
原因 | 采用明文传输 | 无法证明报文完整性 | 不验证通信方的身份 |
HTTPS 对策 | 信息加密 | 内容校验 | 身份验证 |
实现方式 | 混合加密 | 摘要算法 + 数字签名 | 数字证书 |
2.1、混合加密
混合加密:非对称加密 + 对称加密
充分运用了两种加密方式的优点。
- 通信建立前:采用非对称加密的方式,交换会话密钥。
- 使用一对密钥,公钥可任意分发,私钥需要保密。
- 运算速度慢,但是安全。
- 通信过程中:采用对称加密的方式,加密明文数据。
- 加密和解密使用同一把密钥。
- 运算速度快,但交换密钥时可能遭遇窃听。
综合二者的优点,在不同阶段分别采用两种加密算法。
2.2、摘要算法
摘要算法:即哈希函数,用于对内容计算哈希值。
哈希值是唯一的,且无法根据哈希值反推内容。
-
发送方:
- 根据内容使用摘要算法计算一个哈希值。
- 将哈希值与内容一起传输给对方。
-
接收方:
- 根据内容使用相同的摘要算法计算一个哈希值。
- 与发送方的哈希值对比,相同则说明没有被篡改。
内容和哈希值可能被中间人替换,
因为接收方无法确认消息来源的可靠性。
两种解决方案:
- 非对称加密算法
- 数字签名
2.2.1、非对称加密算法
使用一对可以双向加解密的公钥和私钥,
不同加密的目的也有所不同。
- 公钥加密,私钥解密:
- 确保只有拥有私钥的那个人可以获取内容。
- 目的:保证内容传输的安全(i.e. 内容加密)。
- 私钥加密,公钥解密:
- 确保内容是拥有私钥的那个人加密的。
- 目的:保证消息不会被冒充(i.e. 消息来源的可靠性)。
此方案通常不会使用,因为非对称加密计算比较耗费性能。
2.2.2、数字签名
采用私钥加密,公钥解密的方式。
在摘要算法的基础上对内容的哈希值加密,加密结果即数字签名。
加入数字签名后的摘要算法:
-
发送方:
- 根据内容使用摘要算法计算一个哈希值。
- ⭐使用私钥加密哈希值,得到数字签名。
- 将数字签名与内容一起传输给对方。
-
接收方:
- 根据内容使用相同的摘要算法计算一个哈希值。
- ⭐使用公钥解密数字签名,得到哈希值(成功解密说明内容来自服务端)。
- 与发送方的哈希值对比,相同则说明没有被篡改。
至此:
- 混合加密:解决了窃听问题。
- 摘要算法+数字签名:解决了篡改问题。
但还存在一个问题——伪装:公钥被替换/伪造。
👇 解决方案:数字证书
2.3、数字证书
CA(Certificate Authority,数字证书认证机构):拥有一对公钥和私钥。
- CA 私钥保密。
- CA 公钥已预先内置到浏览器或操作系统中。
-
服务器:将服务器公钥注册到 CA。
-
CA:
- 将服务器公钥、用途、颁发者、有效时间等信息打包,进行哈希计算得到一个 Hash 值。
- 使用 CA 私钥对 Hash 值加密,生成 CA 数字签名。
- 将 CA 数字签名 添加在文件证书上,形成数字证书。
-
客户端:请求服务器时,需要确认服务器证书有效性。
- 使用相同的哈希算法,计算服务器数字证书信息的 Hash 值(H1)。
- 使用 CA 公钥对服务器数字证书中的数字签名解密(得到 H2)。
- 对比 H1 和 H2,相同说明证书是由 CA 真实提供的,否则说明是伪造的。
- 从数字证书中获取服务器公钥,使用它对报文进行加密发送。
-
服务器:使用服务器私钥对报文进行解密。
3、建立连接
3.1、HTTPS 连接建立
HTTPS 连接建立的完整过程
- TCP 握手:👉 三握
- TLS 握手:核心内容如下
- 客户端索要并验证服务器公钥。
- 双方协商生成会话密钥。
- 通信:双方采用会话密钥进行对称加密的通信。
3.2、TLS 握手
TLS 握手:不同密钥交换算法的握手流程不同(👉 HTTPS-密钥交换算法)。
以 RSA 算法的 TLS/1.2 四握为例:
-
Client Hello
-
Server Hello, Server Certificate, Server Hello Done
-
Change Key Exchange, Change Cipher Spec, Finished
-
Change Cipher Spec, Finished
① Client Hello
Client Hello
:客户端向服务器发起加密通信请求
- 客户端随机数(用于生成会话密钥)
- 客户端支持的 TLS 版本(e.g. TLS/1.2)
- 客户端支持的密码套件列表(e.g. RSA)
② Server Hello
Sever Hello
:服务器收到客户端请求后,发出响应。
- 服务器随机数(用于生成会话密钥)
- 服务端确认 TLS 版本
- 服务端确认密码套件列表
Server Certificate
:服务器的数字证书。
Server Hello Done
:代表 Server 第一次响应结束。
③ 客户端后续
Client Key Exchange
:客户端生成并发送第三个随机数。
- 获取服务器公钥:
- 通过浏览器/操作系统中的 CA 公钥,确认服务器数字证书的真实性。
- 如果证书没问题,客户端会从数字证书中取出服务器的公钥。
- 发送预主密钥(
pre-master key
,用于生成会话密钥):- 生成随机数(预主密钥)。
- 使用服务器公钥加密后发出。
- 生成会话密钥:
- 客户端:根据双方协商的算法,结合三个随机数生成本次通信的会话密钥。
- 服务器:收到客户端发送的预主密钥后(使用服务器私钥解密),同理得到一个相同的会话密钥。
Change Cipher Spec
:通知服务器,之后使用会话密钥进行加密通信。
Finished
:客户端握手结束,同时将之前所有内容发生的数据生成一个摘要,用于服务端校验。
④ 服务器后续
Change Cipher Spec
:之后使用会话密钥进行加密通信。
Finished
:服务端握手结束,同时将之前所有内容发生的数据生成一个摘要,用于客户端校验。
- TLS 握手完成,客户端与服务器进入加密通信。
- 使用普通 HTTP + 会话密钥加密通信。
3.3、TLS 握手次数
-
SSL/TLS 1.2:2RTT,四握
-
SSL/TLS 1.3:1RTT ,三握
附:Web 攻击技术
HTTP 不具备安全功能,
基于 HTTP 协议的客户端、服务端和应用可能遭遇 Web 攻击。
- 攻击模式:
- 主动攻击:直接访问 Web 应用并传入攻击代码。
- 被动攻击:利用圈套策略执行攻击代码。
- 具体类型:
- 输出值转义不完全
- 设置货设计缺陷
- 会话管理疏忽
- 其它
① 输出值转义不完全
- 跨站脚本攻击(XSS):在注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 脚本。
- SQL 注入攻击:运行非法的 SQL。
- OS 命令注入攻击:执行非法的操作系统命令。
- HTTP 首部注入攻击:在响应首部字段内插入换行符,添加任意响应首部或主体(被动)。
- 邮件首部注入攻击:向邮件首部 To 或 Subject 内添加非法内容。
- 目录遍历攻击:通过相对路径定位到绝对路径,非法浏览、篡改或删除。
- 远程文件包含漏洞:部分脚本内容需要读取外部依赖文件,攻击者指定非法 URL 作为依赖文件。
② 设置或设计缺陷
- 强制浏览:浏览非公开文件。
- 不正确的错误消息处理
- 开放重定向:指定任意 URL 作重定向跳转。
③ 会话管理疏忽
- 会话劫持:获取用户会话 ID,使用此会话 ID 伪装成用户。
- 会话固定攻击:强制用户使用攻击者指定的会话 ID(被动)。
- 跨站点请求伪造(CSRF):通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新(被动)。
④ 其它
- 密码破解:穷举法、字典攻击。
- 点击劫持:透明的按钮或链接,覆盖在 Web 上。
- DoS 攻击:也称为服务停止或拒绝服务攻击,让运行中的服务呈停止状态(Denial of Service attack)
- 集中利用访问请求造成资源过载,资源用尽的同时,实际上也就呈停止状态。
- 通过攻击安全漏洞使服务停止。
- 后门程序