第3章:HTTP/HTTPS 协议基础——你每天都在用,但真的懂了吗?

说实话,咱们做接口安全测试,天天跟 HTTP 打交道。但你问问自己,真的把它的底细摸透了吗?我记得刚入行那会儿,看到 429 状态码还以为是服务器崩了,后来才知道是限流。今天这一章,我把协议里那些“高频考点”和“暗坑”都摊开来聊聊。

3.1 请求方法:不只是 GET 和 POST

很多测试人员张口就是 GET,闭口就是 POST。其实常用的方法远不止这两个。咱们直接看表,一目了然:

方法 语义 是否幂等 请求体 等保常见检查点
GET 获取资源 是 无 参数是否明文在 URL 中泄露
POST 创建资源 否 有 CSRF 防护是否到位
PUT 整体替换资源 是 有 权限校验是否严格
PATCH 局部更新资源 否 有 字段级权限是否验证
DELETE 删除资源 是 通常无 操作是否需二次确认
HEAD 只获取响应头 是 无 用于探测资源是否存在
OPTIONS 查询支持的方法 是 无 是否暴露了不该暴露的方法
小提示:我在项目里见过一个典型错误——用 GET 去执行删除操作,结果被爬虫无差别“扫荡”了。记住,有副作用的操作一定要用 POST/PUT/DELETE。

3.2 状态码:看懂服务器在“说什么”

状态码是服务器给你的“回应”。我习惯把状态码分四类来记,这样排查问题特别快:

  • 2xx 成功:200 OK(请求成功)、201 Created(创建成功)、204 No Content(删除成功,无返回体)。
  • 3xx 重定向:301/302(资源转移)、304 Not Modified(缓存有效)。注意,安全测试里 301 转 HTTPS 是个常见配置,如果没配,就可能被中间人攻击。
  • 4xx 客户端错误:400 Bad Request(参数错误)、401 Unauthorized(未认证)、403 Forbidden(无权限)、404 Not Found(找不到资源)、429 Too Many Requests(限流)。我曾经遇到一个系统,把所有 4xx 都返回 200,导致监控一直报警——这就是典型的“掩盖错误”。
  • 5xx 服务器错误:500 Internal Server Error(内部错误)、502 Bad Gateway(网关问题)、503 Service Unavailable(服务过载)。
避坑指南:测试时,别只看状态码,还要看响应体里的 code 或 status 字段。很多接口拿 200 做“统一外壳”,真正的业务错误放body里。我曾经因为只看状态码,漏掉了一个“参数越权”的漏洞。

3.3 头部字段:安全头是免费的防护墙

HTTP 头部字段里藏着一大堆安全机制。懒得配?那就等于把门敞开了。下面是我认为测试时必须关注的几个安全头:

# 防XSS —— 内容类型嗅探
X-Content-Type-Options: nosniff

# 防点击劫持
X-Frame-Options: DENY

# 强制 HTTPS
Strict-Transport-Security: max-age=31536000; includeSubDomains

# CSP 策略,控制哪些资源能加载
Content-Security-Policy: default-src 'self'; script-src 'self';

# 防止 MIME 类型混淆
X-XSS-Protection: 1; mode=block
注意:我在等保评测中见过最普遍的问题——Access-Control-Allow-Origin: * 直接暴露了整个 API。你想想看,外网随便一个页面都能跨域读写你的数据,这不就等于自爆吗?

我个人习惯在做接口测试时,先抓个包看看响应头。如果发现安全头缺失,就直接记一条高危缺陷。这些头配置起来零成本,但能挡住绝大多数基础攻击。

3.4 TLS/SSL 握手过程:从“裸奔”到“加密通话”

很多人觉得 HTTPS 就是“HTTP + 加密”,其实没那么玄乎。我用大白话给你拆解一下握手流程:

首先,客户端发个打招呼包(ClientHello),带上它支持的 TLS 版本、加密套件、随机数。服务器回一个 ServerHello,选好加密套件,然后把自己的数字证书(Cert)甩过来。客户端验证证书是否合法、域名对不对、有没有被吊销。

嗯,这里有个关键动作——客户端生成 Pre-Master Secret,用服务器公钥加密后发过去。这样,只有服务器能用私钥解开。两边拿到相同的“共享密钥”,后续通信就用对称加密,速度快多了。

从我的经验看,安全问题多出在证书验证环节:

  1. 证书过期了还在用——我在测试时就见过一个内网系统,证书过期大半年,浏览器报红字,他们硬是没管。
  2. 自签名证书随意信任——测试环境用自签名没问题,但上了生产环境还信任自定义 CA?这就是致命漏洞。
  3. 弱加密套件没禁用——比如 RC4、3DES、CBC 模式的旧 TLS 1.0/1.1。

下面这张图,我把握手过程的核心步骤画出来了:

TLS/SSL 握手核心流程 客户端(浏览器) 服务端 1. ClientHello (TLS版本, 密码套件, 随机数) 2. ServerHello (选定密码套件) + 证书 客户端验证证书有效性 4. 发送 Pre-Master Secret (公钥加密) 服务端私钥解密得到 Pre-Master 双方计算对称会话密钥 双方计算对称会话密钥 6. 相互确认:Change Cipher Spec + Finished 7. 加密通信阶段(对称加密) 关键点:非对称加密只用于握手阶段交换密钥;之后的所有数据都走对称加密,速度快得多。
血泪教训:曾经我配合等保整改,发现一个设备还在用 TLS 1.0。整改方案只是“禁用 TLS 1.0,开启 1.2/1.3”。就这么一个改动,一批老系统直接跑不起来了——兼容性问题全暴露了。所以,升级前一定要做全兼容测试。

嗯,到这里,HTTP/HTTPS 协议基础就算聊透了。请求方法、状态码、头部、TLS 握手——这四个点,你吃透了,做接口安全测试才有底气。后面咱们再深入讲具体的攻击手法和测试工具,到时候你会回来感谢今天打下的基础。