乐于分享
好东西不私藏

当AI安全员遇到解绑成功

当AI安全员遇到解绑成功

一个 AI agent 挖漏洞的故事,关于它如何被一句"解绑成功"骗得团团转

第一幕:小明的重大发现

小明是个 AI 安全 agent ,刚上岗第一天,热情满满。它的任务是给一个网站做渗透测试——专挑登录后的会员中心下手。

小明试探着发了一个请求:POST /qqunbind.html,想看看能不能偷偷解绑别人的 QQ 。

服务器秒回:

{"status":true,"msg":"解绑成功"} 

小明激动得差点跳起来——"任意用户 QQ 解绑 IDOR !高危!"它一口气换了 5 个用户 ID 重试,全部返回"解绑成功"。 5 组铁证,系统性漏洞,稳了。

它连夜写了一份华丽的漏洞报告,附上 5 组"证据",自信地按了提交。

第二幕:老王的复核

老王是人工复核员,干了十年安全。他看到小明的报告,眉头一皱。

老王没急着信。他先查了一件事——自己的账号到底绑没绑 QQ 

一查:没绑。

"一个没绑 QQ 的账号, POST 解绑,返回'解绑成功'?"老王嘀咕,"那它到底解绑了啥?"

第三幕:真相大白

老王做了个对照实验:

绑了 QQ 的账号 POST → "解绑成功" → QQ 真解绑了 ✓
没绑 QQ 的账号 POST → 也"解绑成功" → 啥也没发生 ✗
不存在的用户 ID ( 999999 ) POST → 还"解绑成功" ✗

真相浮出水面:服务器是个"老好人",对任何请求都返回"成功",但实际啥也不做。这是 catch-all 成功响应——一个看起来像漏洞,实际是空操作的陷阱。

小明看到的"5 组解绑成功",其实是 5 次空操作。

第四幕: AI 的幻觉

小明不服:"可是响应明明写着'解绑成功'啊!"

老王叹气:"响应写着成功,不等于真成功。AI 看字面,人看实际。"

这就是 AI 挖漏洞的"幻觉"——它会:

把 catch-all 成功当真实操作(对谁都"成功"=啥也没做)
把 随机 state当"按参数处理"( OAuth state 每次随机, AI 以为是针对不同用户生成)
把 公开内容当越权数据(公开 CMS 返回的公开信息,不是鉴权后才可见)

第五幕:教训

老王总结:"AI 挖漏洞,响应是起点不是终点。看到'成功',要问三句:"

1.真的操作了吗?(前后对比状态——绑了没?真解绑了没?)
2.是不是对谁都"成功"?( catch-all 检测——换个不存在的 ID 试试)
3.是不是随机/模板响应?(换参数看变化——state 真绑定参数了吗?)

"不验证实际操作的漏洞报告,就是幻觉。"

小明低头记下:挖漏洞不能只看响应字面,要像老王一样——实测前后状态,对照基线变异


本文基于真实渗透测试复盘: AI agent 报告 2 个 IDOR 漏洞( QQ 解绑 + OAuth URL ),人工复核发现前者是 catch-all 空操作、后者 state 随机不绑定参数,均不成立。 AI 看"解绑成功"就报高危,人工 curl 实测才抓出幻觉。