第四章|HTTP状态码详解:1xx~5xx 审计核心

各位好,这一章我们来聊聊状态码。可能你会觉得状态码没啥好讲的,翻来覆去就那几十个。但我在做外发通道审计的时候,恰恰是**状态码最容易暴露问题**。很多异常流量不会在请求体里做手脚,而是通过状态码的“擦边球”来混淆视听。所以,看清状态码背后的含义,是做审计的基本功。

4.1 状态码在审计中的定位

状态码是服务器对客户端请求的**第一回应**。它只有三位数字,却能告诉我们:

  • 请求有没有被网关拦截
  • 业务逻辑是否执行成功
  • 是否存在重定向跳转
  • 客户端还是服务器出了问题

我个人习惯,每次抓包第一眼就看响应状态码。如果看到一个 302 跳到外部域名,或者一个 204 但没有 Content-Length,我心里就会咯噔一下——多半有问题。

审计小技巧:外发通道中,状态码的分布比例比单个码值更重要。正常情况下 2xx 应占 90% 以上,如果 3xx 或者 4xx 突然飙升,就要重点排查。

4.2 1xx 信息性状态码

1xx 很冷门。平时几乎见不到,因为它属于**协议层面的握手**。常见的就两个:

状态码含义审计点
100 Continue客户端可以继续发送请求体检查是否被用作探测存活通道
101 Switching Protocols切换协议(如 WebSocket)检查是否被用作隧道穿越

我记得有一次,某个内网设备持续对外发出 101 Upgrade 请求。表面上是 WebSocket 心跳,实际上是通过 Upgrade 头把数据封装成二进制帧外发。这种通道绕过 HTTP 审计的可能性很高。

注意:100 Continue 如果配合超长请求体,可能被用来做慢速攻击或耗时缓存探测。审计时建议关注响应延时和请求体大小的关联性。

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 没内容就不看响应体。

避坑指南(我曾经踩过):很多 WAF 会把 4xx 的响应体清空成固定页面。但恶意流量如果自己返回了 403,响应体可能完全由服务端(即 C2)控制。建议对外发通道的 403/404 响应体做内容指纹,和正常接口的返回做对比。

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 知识体系图:状态码审计全景

下面我把整个状态码分类和对应的审计点画成一张图,方便你记忆和排查时快速对照。

HTTP 状态码分类与审计要点 HTTP 状态码 1xx 信息 2xx 成功 3xx 重定向 4xx 客户端错误 5xx 服务器错误 关注 Upgrade 隧道 204 心跳 & 206 分块 检查 Location 头 403/404 内容指纹 错误文本暗号 不要只看状态码数字,结合响应体、Location、频率分析 箭头方向:状态码大类 → 对应的审计重点

4.8 审计综合实操建议

说了这么多,归结到一句话:**状态码是外发通道的体温计**。你把上面这张图挂在案头,遇到可疑流量先对照一下,能省一半力气。

  • 建立基线:记录正常业务中每种状态码的占比和响应体特征
  • 异常检测:偏离基线超过 2 个标准差的,自动告警
  • 响应体检验:对 403/404/500 等常见码值,用正则提取错误内容里的非标准字段
  • 重定向链:对外发出口的 302/307 做 Location 白名单

我用这个方法帮团队抓出过好几个隐蔽的 C2 通道。不是啥高大上的技术,就是把状态码读懂、读透。希望对你也有用。