HTTP 协议学习笔记

HTTP 协议学习笔记

带新手走进神秘的HTTP协议 - 超超boy - 博客园

HTTP 首部字段详细介绍 - 超超boy - 博客园

《白帽子讲 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 连接
  • 请求报文

    • 请求报文由开始行、首部行和实体主体组成。
      img

    • HTTP 方法:
      image

      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 首部字段类型:
        • 通用首部字段: 请求报文和响应报文都会使用的首部。 img

        • 请求首部字段:发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、相应内容相关优先级等信息。image

          User-Agent 头:由客户端指定,在 Web 应用中不能基于 User-Agent 的值来做关键业务逻辑决策。攻击者可能向其中插入 XSS Payload,对后端的日志分析平台实现 XSS 盲打。
          Referer 头:依赖其中的域名做来源校验是可靠的,但是只能信任其域名,而不能信任 URL 级别的内容。

        • 响应首部字段:发送响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。image

        • 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。

  • 响应报文

    • 响应报文的开始行是状态行。响应中的版本号不一定要与请求中的版本号一样,但大版本号(Major Version)不能高于请求中的大版本号。

      img

    • 状态码用于指示服务器对于该请求的操作结果

      状态码 说明
      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)请求。
  • WebSocket

    • 全双工通信模式,支持 HTTP 代理。
    • 使用 ws(WebSocket) 和 wss (使用了 TLS 的 WebSocket)两种资源标识符,分别默认使用 80 和 443 端口
    • 使用长连接,在认证通过后的通信中无需再携带凭证
    • 在 WebSocket 应用中如果服务端没有校验访问源的机制,将会产生跨站 WebSocket 劫持(Cross-site WebSocket hijacking)问题。
  • Web 页面

    • 文档对象模型(Document Object Model,DOM),Javascript,代码混淆方案
posted @ 2024-11-14 22:44  Maplisky  阅读(11)  评论(0编辑  收藏  举报