第四章|HTTP状态码详解:1xx~5xx 审计核心
各位好,这一章我们来聊聊状态码。可能你会觉得状态码没啥好讲的,翻来覆去就那几十个。但我在做外发通道审计的时候,恰恰是**状态码最容易暴露问题**。很多异常流量不会在请求体里做手脚,而是通过状态码的“擦边球”来混淆视听。所以,看清状态码背后的含义,是做审计的基本功。
4.1 状态码在审计中的定位
状态码是服务器对客户端请求的**第一回应**。它只有三位数字,却能告诉我们:
- 请求有没有被网关拦截
- 业务逻辑是否执行成功
- 是否存在重定向跳转
- 客户端还是服务器出了问题
我个人习惯,每次抓包第一眼就看响应状态码。如果看到一个 302 跳到外部域名,或者一个 204 但没有 Content-Length,我心里就会咯噔一下——多半有问题。
4.2 1xx 信息性状态码
1xx 很冷门。平时几乎见不到,因为它属于**协议层面的握手**。常见的就两个:
| 状态码 | 含义 | 审计点 |
|---|---|---|
| 100 Continue | 客户端可以继续发送请求体 | 检查是否被用作探测存活通道 |
| 101 Switching Protocols | 切换协议(如 WebSocket) | 检查是否被用作隧道穿越 |
我记得有一次,某个内网设备持续对外发出 101 Upgrade 请求。表面上是 WebSocket 心跳,实际上是通过 Upgrade 头把数据封装成二进制帧外发。这种通道绕过 HTTP 审计的可能性很高。
4.3 2xx 成功状态码
2xx 看似人畜无害,但违法流量最爱伪装成 200 OK。为什么?因为大部分安全设备对 200 的检查力度最弱。
| 状态码 | 含义 | 审计陷阱 |
|---|---|---|
| 200 OK | 正常响应 | 响应体可能藏有加密数据或指令 |
| 201 Created | 资源创建成功 | 检查是否向外部服务器上传文件 |
| 204 No Content | 无响应体 | 常见于心跳/长连接保活通道 |
| 206 Partial Content | 分段传输 | 可被用来隐蔽分块外发大文件 |
拿 204 举例。设备向 C2 发送一个 GET 请求,服务端返回 204,啥都没带。但我看过日志,每次 204 之前都有一次 200,响应体里藏着加密的配置。204 只是在确认“收到指令”。这种组合在社工库外发时非常常见。
- 统计 200 的平均响应体大小,突然变小或变大都要怀疑
- 204 如果出现频率异常(比如每分钟都有)且源 IP 固定,基本就是心跳
- 206 的 Range 字段值如果与正常文件分段不符,可能是拆包外发
4.4 3xx 重定向状态码
重定向是外发通道的“黄金协作者”。恶意软件经常通过重定向链来躲避分析——跳一次到 CDN,再跳一次到云存储,最后到达真实目标。
| 状态码 | 含义 | 审计点 |
|---|---|---|
| 301/302 | 永久/临时重定向 | 检查 Location 是否指向外部域名 |
| 303 See Other | 用 GET 获取结果 | 注意 POST→GET 的跳转,可能绕过 WAF 检查 |
| 307 Temporary Redirect | 保留请求方法重定向 | POST 不被改为 GET,常用于凭证传递 |
我个人曾遇过一个案例:内网感染了挖矿脚本,它每隔 5 分钟请求一个短链接,服务器返回 302 跳到一个矿池。因为短链接域名看起来像社交平台,防火墙没拦住。但如果我们审计了 302 的 Location 头,直接就能发现这个猫腻。
- 对 3xx 响应,必须记录并分析 Location 头
- 重定向链超过 3 跳的,直接标记为可疑
- 307 配合 POST 向外发送数据,属于高危行为
4.5 4xx 客户端错误状态码
4xx 最能反映客户端的行为异常。审计 4xx 不是在查服务器有没有问题,而是在看客户端在“搞什么鬼”。
| 状态码 | 含义 | 审计价值 |
|---|---|---|
| 401/403 | 未认证/禁止访问 | 扫描器或暴力破解的特征 |
| 404 Not Found | 资源不存在 | 目录遍历或漏洞扫描的痕迹 |
| 405 Method Not Allowed | 方法不允许 | 异常调用(如用 TRACE、OPTIONS 探测) |
| 429 Too Many Requests | 频率限制 | 自动化工具、爬虫、CC 攻击 |
有一次我审计一个 OA 系统的外发日志,发现某个 IP 在 10 分钟内返回了 200 多个 403。表面看是访问越权,但 403 的响应体里有一段 Base64。解码后发现是系统内部路径。这其实是一种侧信道探测。所以别以为 403 没内容就不看响应体。
4.6 5xx 服务器错误状态码
5xx 表示服务器内部出错。在外发场景里,5xx 往往意味着**攻击失败**或者**目标已防御**。但反过来,攻击方可能故意制造 5xx 来伪装失败,实际在传递数据。
| 状态码 | 含义 | 审计点 |
|---|---|---|
| 500 Internal Server Error | 服务器内部错误 | 错误信息里可能带 SQL 报错或栈信息 |
| 502 Bad Gateway | 网关代理错误 | 可能表示 C2 节点挂了或负载均衡切换 |
| 503 Service Unavailable | 服务暂不可用 | 经常被用作回退指令(比如“暂停外发”) |
我记得有一次,一个后门在收到 kill 指令后,连续返回 502 来告知 C2 “我已停止活动”。表面上像网络不稳定,实际上是用状态码做信号。审计时,如果某台机器对外的 5xx 数量突然归零或突然增多,都要怀疑是人肉控制。
- 5xx 占比超过 1% 且指向同一域名,应深入调查
- 检查 5xx 响应体是否包含自定义错误文本(非标准模板)
- 502/504 配合超时,可能是隧道被阻断的标志
4.7 知识体系图:状态码审计全景
下面我把整个状态码分类和对应的审计点画成一张图,方便你记忆和排查时快速对照。
4.8 审计综合实操建议
说了这么多,归结到一句话:**状态码是外发通道的体温计**。你把上面这张图挂在案头,遇到可疑流量先对照一下,能省一半力气。
- 建立基线:记录正常业务中每种状态码的占比和响应体特征
- 异常检测:偏离基线超过 2 个标准差的,自动告警
- 响应体检验:对 403/404/500 等常见码值,用正则提取错误内容里的非标准字段
- 重定向链:对外发出口的 302/307 做 Location 白名单
我用这个方法帮团队抓出过好几个隐蔽的 C2 通道。不是啥高大上的技术,就是把状态码读懂、读透。希望对你也有用。