🚨 重要提醒
越权(BOLA)是 OWASP Top 10 里最容易被开发忽视、却最容易在护网中被红队当突破口的一类漏洞。
本文延续本专栏「蓝队护网 / SOC 防守全套学习清单」的思路,把「损坏的对象级别鉴权漏洞(BOLA)」里的攻击类型,套进一次真实的防守复盘流程:告警发现 → 遏制隔离 → 溯源取证 → 根除恢复 → 加固复盘。
不讲虚的,只走一遍蓝队真正会踩的坑。
- 专栏:蓝队技能学习
- 话题:越权 / BOLA / 溯源取证
- 难度:⭐⭐⭐⭐
- 适合:护网备赛 / SOC 研判 / Web 安全
0 前言:为什么把这两篇笔记串起来
本专栏之前分别写过两篇笔记:
- 一篇梳理了 BOLA(Broken Object Level Authorization,损坏的对象级别鉴权)的五种越权形态——未鉴权、参数可遍历(水平越权)、请求路径异常(路由绕过 / 垂直越权)、可遍历下载文件、鉴权凭证脆弱(伪造 Token);
- 另一篇是「蓝队护网 / SOC 防守全套学习清单」,按基础打底 → 安全设备 → 日志流量分析 → 应急响应取证 → MITRE ATT&CK 威胁狩猎 → 系统加固 → 脚本自动化九大模块排了优先级。
但很多同学反馈:「单看攻击类型记不住,单看防守清单又太散。」
所以这篇就用一次完整的越权防守复盘把两边粘起来——先还原攻击是怎么进来的,再看蓝队在每个阶段该干什么、用什么命令、看哪个事件 ID。你把它当成「清单的实战版」即可。
阅读建议:如果你还没看过那两篇基础笔记,建议先过一遍:BOLA 五种类型用来对号入座攻击手法,防守清单用来查每个阶段该用哪类工具。本文不再重复罗列定义,只讲「碰到时怎么办」。
1 场景还原:一次典型的水平越权告警
某周二凌晨,SOC 大屏跳了一条 WAF 告警:业务系统/api/order/detail?orderId=接口在 9 分钟内被同一源 IP 用连续递增的 orderId 高频请求,命中 WAF 的「越权 / 遍历」规则。
这是 BOLA 五种形态里最经典的「参数可遍历(水平越权)」——接口只校验了「是否登录」,没校验「这个订单是不是你的」。
1.1 攻击时间线(流量侧还原)
- 02:11:03源 IP 203.0.113.27 首次正常请求 orderId=10045,返回 200,业务正常。
- 02:11:18开始遍历:orderId=10046, 10047, 10048 …,UA 伪装成 Chrome,间隔约 0.8s。
- 02:19:51累计请求 612 次,其中 587 次返回 200 且响应体含他人订单号、手机号、地址——数据已泄露。
- 02:20:02WAF 命中「越权遍历」规则,触发告警推送至 SIEM;SOC 开始介入。
研判要点:判断「遍历」而非「正常翻页」的关键:同一会话、参数单调递增、响应体归属人与登录人不一致。三者同时成立,基本可以定性越权,不要被「用户在查自己订单」的借口带偏。
2 第一阶段:告警发现与初判
蓝队核心工作台是 SIEM(日志集中分析平台)。这条告警会同时出现在三个地方,要会关联着看:
- WAF 侧:越权 / 遍历规则命中,附原始 Payload 与响应码分布。
- Web 访问日志:Nginx/Apache access.log 里的高频单 IP、同 URI 不同参数。
- 应用日志:业务系统自身日志:同一 userId 短时间内查了大量不属于自己的 orderId。
初判命令(Linux 侧)
# 1. 按源 IP 聚合访问频次,锁定可疑源 awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20 2. 看这个 IP 到底请求了哪些 orderId(参数提取) grep "203.0.113.27" /var/log/nginx/access.log | grep -oP 'orderId=\K[0-9]+' | sort -n | uniq -c 3. 关联业务日志,看响应归属是否与登录人一致 grep "203.0.113.27" /var/log/nginx/access.log | awk '{print $7}' | sed -n 's/.orderId=([0-9]).*/\1/p' | while read id; do grep "order_id=$id" /opt/app/order.log; done如果第 2 步发现 orderId 跨度很大、且第 3 步里这些订单的 owner 与当前登录 userId 不一致——水平越权实锤,进入遏制阶段。
3 第二阶段:遏制与隔离
防守清单里写的标准应急 SOP 是遏制 → 根除 → 恢复 → 溯源 → 加固复盘,遏制永远第一优先,先止血再查因。
遏制动作清单
- 边界层:WAF / 防火墙把源 IP 203.0.113.27 拉黑,同时给该接口加临时限频规则(同会话 60s 内同接口 ≤ 30 次)。
- 接口层:通知研发对
/api/order/detail临时加对象归属校验(先堵漏洞,根治代码后面再说)。 - 账号层:冻结发起遍历的登录态(强制下线该 token),避免被当跳板继续横向。
# 防火墙拉黑(firewalld 示例) firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.27" reject' firewall-cmd --reload iptables 方式 iptables -I INPUT -s 203.0.113.27 -j DROP别一上来就重启:如果怀疑主机已失陷,禁止直接重启——会破坏内存里的取证证据(进程、网络连接、注入的内存马)。正确做法是先隔离网络、保留内存镜像,再决定处置。
4 第三阶段:溯源取证
这一步要回答三个问题:怎么进来的(攻击路径)、动了什么(影响范围)、还碰了什么别的(横向)。用 MITRE ATT&CK 杀伤链把行为挂上去,复盘才经得起推敲。
4.1 流量侧:Wireshark 还原攻击包
过滤语法:ip.addr == 203.0.113.27 && http.request.uri contains "orderId"
导出 HTTP 请求列表,看遍历节奏、是否带自动化脚本特征(固定 UA、无 Referer、间隔均匀)。
检查是否有二次回连:攻击者拿到数据后是否往外部 C2 发包(DNS 隧道 / ICMP 隐蔽通道)——一旦有,就不是越权这么简单了,要按失陷处置。
4.2 主机侧:Windows 事件日志(蓝队重中之重)
这几个事件 ID 是护网必背,研判失陷横向全靠它们:
| 事件 ID | 含义 | 防守关注点 |
|---|---|---|
| 4624 | 成功登录 | 看登录类型(3=网络、10=远程桌面),异常时间 / 异常源 IP 登录要重点排查 |
| 4625 | 登录失败 | 短时间高频失败=爆破痕迹 |
| 4688 | 进程创建 | 关注 powershell.exe、cmd.exe、wmic、certutil 等可疑子进程链 |
| 4104 | PowerShell 脚本块执行 | 抓编码 / 混淆命令,内存马、下载器常走这条 |
| 7045 | 新建服务 | 攻击者常用来做持久化后门(注册恶意服务自启) |
# 用 wevtutil 导出安全日志,再交给 LogParser / ELK 分析 wevtutil epl Security C:\forensic\sec.evtx PowerShell 快速筛 4624 / 4625(取证时常用) Get-WinEvent -LogName Security -MaxEvents 5000 | Where-Object { $_.Id -in 4624,4625,4688,4104,7045 } | Select-Object TimeCreated, Id, Message | Format-Table -AutoSize4.3 Linux 侧排查清单
| 排查项 | 位置 / 命令 | 找什么 |
|---|---|---|
| 登录痕迹 | /var/log/secure | 异常 IP 登录、sudo 提权 |
| Web 访问 | /var/log/nginx/access.log | 遍历 / 注入 / webshell 上传特征 |
| 异常进程 | ps aux / netstat -antp | 外联进程、监听非常规端口 |
| 持久化后门 | crontab -l / /etc/rc.local / systemd | 定时反弹、自启恶意服务 |
| SSH 后门 | ~/.ssh/authorized_keys | 被植入陌生公钥 |
| 临时恶意文件 | /tmp /dev/shm | webshell、提权脚本、挖矿 |
4.4 用 ATT&CK 把行为映射到战术
把上面查到的行为挂到杀伤链上,溯源报告才完整:
| ATT&CK 战术 | 本次对应行为 |
|---|---|
| 初始访问 | 合法账号登录(接口仅校验登录态,未校验对象归属) |
| 执行 | 遍历接口拉取数据(无代码执行,纯 API 滥用) |
| 凭据访问 | 泄露订单含手机号 / 地址(可用于社工钓鱼) |
| 数据渗出 | 587 条订单通过 HTTP 响应外带(待确认) |
| 横向移动 | 若发现 4624 异常登录 / 4688 可疑进程,则升级为失陷 |
取证工具速记:Windows 内存取证用 Volatility(提取内存木马、密码、隐藏进程);磁盘镜像用 FTK Imager 保全;海量 evtx 用 LogParser 或直接进 ELK 检索。先取证、后处置,证据链不能断。
5 第四阶段:根除与恢复
- 根除:删除攻击者留下的痕迹(如有 webshell 清文件、清定时任务、删陌生 SSH 公钥、删恶意服务)。
- 恢复:从干净备份还原受影响数据;重置受影响用户凭证;修复 orderId 接口的对象级鉴权(这是根治 BOLA 的关键,不是加 WAF 规则就完事)。
- 验证:用 OWASP ZAP / Burp 复测该接口,确认遍历已被阻断;回归测试业务功能未被影响。
6 第五阶段:加固复盘
复盘不是写完报告就结束,要落到可执行的加固项上。对应防守清单里的「资产梳理与漏洞管理」和「攻击面收敛」。
| 加固方向 | 具体动作 |
|---|---|
| 鉴权根治 | 所有涉及对象 ID 的接口加对象级鉴权:服务端校验「当前用户是否有权访问该 orderId」,而非只验登录 |
| 不可预测 ID | 对外 ID 用 UUID / 加盐哈希替代自增整数,降低遍历可行性 |
| WAF 规则沉淀 | 把本次越权特征写成 Sigma / WAF 规则,复用到同类接口,作为威胁情报沉淀 |
| 攻击面收敛 | 下线老旧未维护资产、关闭无用端口、删除测试站点(红队高频突破口) |
| 日志全覆盖 | 确认业务日志已全量进 SIEM,关键接口请求 / 响应可回溯 |
| 告警降噪 | 区分「正常翻页」与「越权遍历」,避免误报淹没真实攻击 |
7 防守反思:所谓「摸鱼」,是精准作为而非不作为
专栏名字叫「其实防守也摸鱼」,常被误解成防守就是混日子。走完这一遍流程你会发现恰恰相反:真正高效的蓝队,不是 7×24 死盯屏幕,而是把重复研判交给自动化,把人解放出来做威胁狩猎和加固复盘。
- 能自动化的别手动:爆破自动拉黑、告警自动分级、日志自动关联——靠 Shell / Python 脚本和 SOAR 剧本,别拿人肉 grep 当主力。
- 能前置的别后置:资产梳理、漏洞闭环、攻击面收敛、鉴权根治,这些事在护网前就该做完,而不是等告警来了再补。
希望这篇实战复盘能帮你把 BOLA 的攻击手法和防守流程真正串起来。下次在 SIEM 里看到「越权遍历」告警,你就能快速定位、果断遏制、精准溯源,最后把漏洞彻底堵上。