第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,用服务器公钥加密后发过去。这样,只有服务器能用私钥解开。两边拿到相同的“共享密钥”,后续通信就用对称加密,速度快多了。
从我的经验看,安全问题多出在证书验证环节:
- 证书过期了还在用——我在测试时就见过一个内网系统,证书过期大半年,浏览器报红字,他们硬是没管。
- 自签名证书随意信任——测试环境用自签名没问题,但上了生产环境还信任自定义 CA?这就是致命漏洞。
- 弱加密套件没禁用——比如 RC4、3DES、CBC 模式的旧 TLS 1.0/1.1。
下面这张图,我把握手过程的核心步骤画出来了:
血泪教训:曾经我配合等保整改,发现一个设备还在用 TLS 1.0。整改方案只是“禁用 TLS 1.0,开启 1.2/1.3”。就这么一个改动,一批老系统直接跑不起来了——兼容性问题全暴露了。所以,升级前一定要做全兼容测试。
嗯,到这里,HTTP/HTTPS 协议基础就算聊透了。请求方法、状态码、头部、TLS 握手——这四个点,你吃透了,做接口安全测试才有底气。后面咱们再深入讲具体的攻击手法和测试工具,到时候你会回来感谢今天打下的基础。