一次请求的旅程
用户在地址栏敲下回车到页面渲染,中间经过 DNS、CDN、负载均衡、Nginx、应用、数据库六道关卡——每一道都能被做手脚。这一章画出完整攻击面地图,后面每一章各拆一段。
一次请求的旅程
跟着一次 https://example.com/profile 走完全程。每一站都标出「这里能被做什么手脚」,这就是你的攻击面地图。
全程六站
① DNS 解析:还没连上就可能被劫持
浏览器先问「example.com 的 IP 是多少」。这一步出问题,后面全部作废——用户连的根本不是你的服务器。
| 手法 | 怎么发生 |
|---|---|
| 注册商账号被撞 | 攻击者登录你的域名后台,直接改 NS 记录 |
| DNS 投毒 | 污染递归解析器缓存,返回假 IP |
| 子域名接管 | blog.example.com 的 CNAME 指向一个你已删除的云服务,攻击者去把那个名字注册回来 |
这一站的可怕之处在于:你的服务器日志里什么都看不到。 流量根本没到你这儿。
② TLS 握手:证书是谁签的
拿到 IP 后建立 TLS 连接。风险点:
- 证书错发:某个 CA 给你的域名签了证书给别人(历史上真实发生过多次)。用 CAA 记录限定只有指定 CA 能签,用 CT 日志监控发现错发。
- 协议与套件过时:还开着 TLS 1.0、支持 RC4,中间人可降级。
- 证书过期:不是安全事故,但是可用性事故——而且非常常见。
对应章节:TLS 与证书。
③ 边缘(CDN / ALB):挡住的和挡不住的
请求到达边缘节点。这里通常做 TLS 终止、缓存、限流、WAF。
最常见的失效方式不是 WAF 规则不够好,而是攻击者根本不走边缘——他直接连你的源站 IP。你所有的边缘防护瞬间归零。
| 风险 | 说明 |
|---|---|
| 源站 IP 泄露 | 历史 DNS 记录、邮件头、证书 CT 日志、/phpinfo 全都能泄 |
| 缓存投毒 | 让 CDN 缓存一个被污染的响应,分发给所有人 |
| 限流缺失 | 登录接口被撞库、短信接口被刷 |
④ Nginx:配置比软件更容易出事
回源到你的 Nginx。这一层的漏洞绝大多数不是 Nginx 的锅,是配置写错了:
# 少一个斜杠 —— 经典的路径穿越
location /static {
alias /var/www/static/;
}
# 攻击者请求 /static../etc/passwd 就能跳出目录还有请求走私:当 Nginx 和后端对「这个请求到哪结束」理解不一致时,攻击者可以把一个请求藏在另一个里面,绕过所有前置检查。
⑤ 应用:输入变成指令的地方
请求进入你的代码。这一层的问题可以归成两大类:
第一类:数据被当成了代码。
| 送到哪 | 变成什么 | 叫什么 |
|---|---|---|
| 数据库 | SQL 语句 | SQL 注入 |
| 系统 shell | 命令 | 命令注入 |
| 模板引擎 | 模板表达式 | SSTI |
| 浏览器 | HTML / JS | XSS |
| LDAP / XML / 正则 | 各自的语法 | 各类注入 |
同一个根因:把不可信数据拼进了某种语法结构里。所以防御手段也同源——参数化,而不是转义。
第二类:该拦的没拦。
- 没验身份(认证缺陷)
- 验了身份没验权限(越权 / IDOR,实战命中率最高的一类)
- 让服务器替攻击者发请求(SSRF)
- 让攻击者传了个能执行的文件(上传)
⑥ 数据与外呼:横向移动的起点
应用查数据库、调第三方 API。攻破应用之后,攻击者关心的是还能摸到什么:
- 数据库账号是不是超级用户?能不能读别的库?
- 服务器上有没有云厂商的元数据服务(
169.254.169.254)?拿到临时凭据就能横向到整个云账号。 - 环境变量里有没有其它系统的密钥?
这就是最小权限存在的意义:假设应用一定会被攻破,那时它手上的权限决定了损失范围。
回程:响应也是攻击面
请求打完了,响应回来的路上同样有风险,而且更容易被忽略:
| 响应侧问题 | 后果 |
|---|---|
缺 Content-Security-Policy | XSS 无成本利用 |
缺 X-Frame-Options / frame-ancestors | 点击劫持 |
Cookie 缺 HttpOnly / Secure / SameSite | 会话被盗、CSRF |
| 错误页把堆栈吐出来 | 泄露路径、版本、SQL 结构 |
Server: nginx/1.18.0 | 直接告诉扫描器该用哪个 exp |
用一条命令看看你自己的站
在读后面的章节前,先对自己的站跑一遍,看看暴露了什么:
curl -sSI https://你的域名/ | grep -iE "server|x-powered-by|strict-transport|content-security|x-frame|x-content-type|referrer-policy|permissions-policy"理想结果是:看不到 Server 的具体版本、看不到 X-Powered-By,而后面那几个安全头都在。如果输出寥寥无几,那这个专栏对你就很值。
小结
- 攻击面远不止「表单输入」,它沿着请求路径分布在六站上。
- 越靠前的层被打穿,后面的防御越是白做——所以专栏从域名开始,不从 XSS 开始。
- 应用层的问题可归成两类:数据被当成代码、该拦的没拦。
- 响应侧同样是攻击面,而且是投入产出比最高的一块(加几个头就能挡掉一批攻击)。
下一部分从最前面那一站开始。👉 注册商与域名账号安全