一、攻击从哪来:一个被低估的入口
大多数企业的安全建设有个共性盲区:静态资源防得很好,API 接口裸奔。
原因很现实:
- 图片、视频走 CDN,天然有多层缓存
- 登录、下单、查询接口是动态的,没法缓存
- 这些接口直接回源,源站承压上限一目了然
攻击者不需要打带宽,只要找到最耗资源的那个接口,用中等并发持续请求,就能让数据库和 CPU 先趴下。
这就是 CC 攻击的核心逻辑:不砸门,把门里的人累死。
二、一次典型的 API CC 攻击链
以某 SaaS 平台的「批量查询」接口为例,还原攻击路径:
第一阶段:侦察(Day 1)
攻击者做的事很简单:
- 注册一个正常账号
- 抓包分析接口参数、频率限制、鉴权方式
- 用低并发试探,摸清后端响应时间和限流阈值
工具:curl + 简单脚本,甚至不需要僵尸网络。
第二阶段:放大(Day 2-3)
发现接口存在两个问题:
- 单次请求可批量查询 200 条数据,后端无分页限制
- 鉴权 Token 有效期 7 天,且未绑定设备指纹
攻击者构造恶意请求:
bash
# 伪代码:模拟 500 个会话,每个会话携带有效 Token for session in sessions: POST /api/v2/batch-query Header: Authorization: Bearer {valid_token} Body: {"ids": [1..200], "detail": "full"}
每个请求都合法鉴权、合法参数,WAF 规则拦不住——因为它看起来就是正常业务流量。
第三阶段:源站被打穿
- 单 IP QPS 不高(5-10/s),传统限频策略不触发
- 但 500 个会话 × 10 QPS × 200 条查询 = 每秒 100 万次数据库检索
- 连接池耗尽 → 响应时间从 80ms 涨到 8s → 正常用户超时
三、高防 CDN 在这里做了什么
普通 CDN 在这个场景里基本是摆设——流量全回源,节点没有判断能力。
高防 CDN 的对抗点在边缘层做行为识别,而不是单纯数包:
1. 设备指纹识别
即使攻击者轮换 IP(拨号代理、4G 池),但:
- TLS 指纹相同(JA3/JA4)
- TCP 窗口大小、时序特征一致
- HTTP/2 帧顺序异常
高防节点在握手阶段就打上设备标签,跨 IP 关联同一攻击者。
2. 行为基线建模
节点持续学习正常用户的访问模式:
维度 |
正常用户 |
攻击者 |
会话持续时间 |
3-15 分钟 |
持续数小时不中断 |
请求间隔 |
随机(人为操作) |
固定间隔(脚本) |
接口调用序列 |
浏览→搜索→详情 |
反复调用同一接口 |
参数分布 |
多样化 |
高度重复 |
偏离基线超过阈值 → 触发挑战(滑块/JS 计算)→ 脚本无法通过。
3. 动态回源熔断
当某接口回源 QPS 突增且攻击特征命中时:
- 边缘节点对该接口启动本地缓存兜底(返回 stale cache 或降级页面)
- 回源连接数被限流,保护源站连接池
- 攻击结束后自动恢复
四、运维侧最容易踩的 3 个坑
坑 1:只开了 IP 限速,没开行为分析
IP 限速对代理池攻击完全无效。攻击者 1000 个 IP × 1 QPS,单个 IP 永远不超限。
正确做法:叠加设备指纹 + 会话级限流 + 接口级 QPS 上限。
坑 2:回源 IP 没收敛
安全组里放行了整个云厂商 IP 段,攻击者直接从同区域 ECS 打过来,绕过边缘清洗。
正确做法:只放行高防节点公布的回源段,且定期更新。
坑 3:日志没开全
攻击发生时没有边缘节点日志,只能看到源站被打满,但不知道攻击特征、入口接口、请求内容。
正确做法:开启边缘访问日志 + 攻击日志,至少保留 7 天,便于事后复盘和规则调优。
五、一个可落地的防护清单
按优先级排序:
- API 层:分页上限、参数校验、请求去重(幂等键)
- 鉴权层:Token 绑定设备指纹、短有效期、异常地点二次验证
- 边缘层:高防 CDN + CC 规则(速率 + 行为 + 挑战)
- 回源层:IP 白名单 + 端口收敛 + 连接数上限
- 可观测层:全链路日志 + 实时告警(回源 QPS、响应时间、5xx 率)
六、写在最后
CC 攻击的本质是用你的业务逻辑打你自己。高防 CDN 能兜住大部分流量型攻击,但应用层的安全水位最终取决于业务代码本身。
安全不是买一个产品就结束的事,而是边缘防护 + 业务加固 + 持续运营的组合拳。