一、HTTP协议基础
说起HTTP,干了十年安全审计的老鸟应该都不会陌生。但很多新人觉得这就是个“传网页的协议”,没什么好深究的。嗯,我跟你说,外发通道审计要是忽略了HTTP协议细节,就像开跑车不看仪表盘——迟早要翻车。今天先把这个底子打牢。
1.1 HTTP发展史及各版本特点
HTTP从诞生到现在,经历了四次比较大的版本迭代。我最早接触Web开发时还在用HTTP/1.0,那时候连Host头都没有,一台服务器只能挂一个网站。现在回想起来,简直是刀耕火种。
| 版本 | 发布时间 | 核心特点 | 审计关注点 |
|---|---|---|---|
| HTTP/0.9 | 1991 | 仅支持GET,无头部,纯文本 | 几乎绝迹,遇到则高度可疑 |
| HTTP/1.0 | 1996 | 引入请求头/响应头,支持Content-Type | Header字段简陋,容易被伪造 |
| HTTP/1.1 | 1999 | 持久连接、管道化、Host头、分块编码 | 大量审计规则基于此版本 |
| HTTP/2.0 | 2015 | 多路复用、二进制分帧、服务器推送 | 流量加密后裸协议特征变少,需依赖TLS侧面分析 |
这里有个坑,我年轻时踩过。有一次外发通道告警,原始日志里看到HTTP请求行居然是GET / 没有版本号,我本能地当成HTTP/1.1处理。后来抓包才发现是0.9格式的漏网之鱼。你想想看,一个2018年的流量里跑着1991年的协议,这本身就是强烈异常信号。
GET /path(无版本)的片段。
1.2 HTTP与HTTPS的区别
这个区别,面试八股文里写烂了:HTTPS就是HTTP加持了TLS/SSL加密。但在外发通道场景下,区别远不止“加了个锁”。
我习惯把HTTPS看成两个东西的组合——先走TLS握手,再走HTTP协议。TLS部分会暴露SNI(Server Name Indication)、证书信息、密码套件;而真正的HTTP数据是加密的,普通审计设备直接抓瞎。
| 维度 | HTTP | HTTPS |
|---|---|---|
| 协议可见性 | 明文,可看到请求行、Header、Body | HTTP内容完全加密,仅TLS元数据可见 |
| 审计深度 | 全字段可审计,支持关键字、正则、深度检测 | 需解密或依赖TLS handshake元数据(SNI、JA3指纹) |
| 端口特征 | 常见80、8080,代理场景灵活 | 443为主,但也可跑在其他端口 |
| 绕过难度 | 低——改Header即可简单混淆 | 高——但可通过TLS指纹识别工具 |
1.3 外发通道场景下的协议意义
好了,前面铺垫这么多,最终要落到外发通道审计上。为什么非要理解HTTP协议?说白了,90%的数据外泄都裹着HTTP的外衣。你想想,邮件附件、Web上传、API接口、甚至自定义协议隧道——它们只要能跑在三层以上,大概率都会选择HTTP/HTTPS。
审计的本质,是在协议层发现“不该出现在这里的东西”。比如:
- 正常的文件上传流量,Content-Type应该是multipart/form-data,出现了
application/x-www-form-urlencoded却带着base64大包?可疑。 - User-Agent突然从
Mozilla变成python-requests?得关注一下。 - 外发请求的目标域名看起来合法,但Host头的实际IP却是内网地址?多半是DNS劫持或代理。
我建议,初学者先不要把精力放在复杂的机器学习上,先手撸几个HTTP字段分析工具,把Request-Line、Header、Body的结构拆明白。我当年就是用tcpdump + awk手工分析异常流量的,虽然笨,但对协议细节的敏感度就是这么练出来的。
最后,记住一个关键认知:HTTP协议不是一成不变的铁板,而是一个活着的、不断演化的“协议族”。你在外发通道审计中见的每一个请求,都是某个版本、某个头部组合、某个编码方式的具体实例。理解它们,你就能在日志的汪洋里捞到那根最关键的针。