HTTP 协议学习笔记
《白帽子讲 web 安全(第二版)》
-
HTTP 默认的端口号为 80,HTTPS 的端口号为 443。
-
HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管理。 可以使用 Cookie 技术控制客户端状态,得到之前的状态信息。
-
HTTP 0.9 和 1.0 使用非持续连接,HTTP 1.1 使用持续连接( Connection: keep-alive )。
-
Web 工作过程
- 建立 TCP 连接
- \(\xrightarrow{请求文档}\)HTTP 请求报文
- \(\xleftarrow{响应文档}\) HTTP 响应报文
- 释放 TCP 连接
-
请求报文
-
请求报文由开始行、首部行和实体主体组成。
-
HTTP 方法:
POST 时传递的参数写在内容实体里面。
-
HTTP 方法使用原则和风险:
方法 使用原则 风险 GET 只用于对服务器没有副作用(read-only)的操作 不应通过 GET 方法提交敏感数据:日志文件会记录请求的 URL 内容,跳转时还会被 Referer 头携带 HEAD 同上 在 DDos 攻击中,攻击者可能使用 HEAD 方法发起攻击,让服务器网络出方向带宽不超过告警阈值 POST 用于可能对服务器有副作用时(如增加、删除、更改数据) - PUT/DELETE 用于直接上传和删除文件,如无特殊需求,应当禁用 - TRACE 用于诊断调试,生产环境的服务器应当禁用 在 XSS 攻击中可以利用它绕过 Cookie 的 HttpOnly 策略,通过 JavaScript 代码读取带有 HttpOnly 属性的 Cookie 内容 CONNECT 在客户端和目标地址之间建立一个 TCP 隧道,可用于建立从外网穿透到内网的传输通道 - 服务器端 获取请求参数时,应当明确指明从 GET 参数还是 POST 参数中获取 攻击者可将原本设计为用 POST 方法提交的操作改用 GET 方法提交,以绕过某些只针对 POST 请求设计的安全策略
-
-
首部字段
- 首部字段重复:未明确,根据浏览器内部处理逻辑不同,结果可能不一致
- 四种 HTTP 首部字段类型:
-
通用首部字段: 请求报文和响应报文都会使用的首部。
-
请求首部字段:发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、相应内容相关优先级等信息。
User-Agent 头:由客户端指定,在 Web 应用中不能基于 User-Agent 的值来做关键业务逻辑决策。攻击者可能向其中插入 XSS Payload,对后端的日志分析平台实现 XSS 盲打。
Referer 头:依赖其中的域名做来源校验是可靠的,但是只能信任其域名,而不能信任 URL 级别的内容。 -
响应首部字段:发送响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
-
实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。
-
-
-
响应报文
-
响应报文的开始行是状态行。响应中的版本号不一定要与请求中的版本号一样,但大版本号(Major Version)不能高于请求中的大版本号。
-
状态码用于指示服务器对于该请求的操作结果
状态码 说明 100~199 表示已收到请求,但未完成操作,用于通知客户端 200~299 请求中的操作已成功完成 300~399 告知客户端执行额外的操作,通常用于跳转 400~499 客户端请求有错误 500~599 服务端出错 -
HTTP 响应头通过
\r\n
分割,若请求中的数据出现在响应头中,当这些数据未经服务端严格过滤时,可能产生 HTTP 消息头注入(CRLF 注入),即攻击者使用\r\n
注入任意的 HTTP 头。
-
-
Cookie 交互
- 服务器在响应报文中添加
Set-Cookie
首部字段信息,通知客户端保存 Cookie。 - 客户端再次发送请求时,在请求报文中加入 Cookie 值后发送。
- 服务器收到 Cookie 后检查 Cookie 并对比服务器上的记录,得到之前的状态信息。
- 服务器在响应报文中添加
-
HTTP/2 和 HTTP/3
- HTTP/2:
- 应用层与传输层之间增加了二进制分帧层,实现了多路复用。
- 伪头:
:authority
,:method
,:path
,:scheme
和:status
(响应) - 请求内容被封装在明确长度的数据帧中
- 使用了 HTTP 反向代理的场景中,如果前后端使用了不一样的 HTTP 版本,可能会出现安全隐患
- HTTP/3:
- 使用了基于 UDP 的 QUIC 协议(Quick UDP Internet Connection),免去了 TCP 协议的三次握手。
- 限制了客户端的收报最小长度,缓解 UDP 反射放大攻击问题。
- 基于 TLS 短时间内可以复用加密连接的特性,QUIC 可以实现“0-往返”(0-RTT)请求。
- HTTP/2:
-
WebSocket
- 全双工通信模式,支持 HTTP 代理。
- 使用 ws(WebSocket) 和 wss (使用了 TLS 的 WebSocket)两种资源标识符,分别默认使用 80 和 443 端口
- 使用长连接,在认证通过后的通信中无需再携带凭证
- 在 WebSocket 应用中如果服务端没有校验访问源的机制,将会产生跨站 WebSocket 劫持(Cross-site WebSocket hijacking)问题。
-
Web 页面
- 文档对象模型(Document Object Model,DOM),Javascript,代码混淆方案