新钓鱼技术——页面双生
字数 1375 2025-08-22 12:23:36
页面双生(Twin Pages)钓鱼技术详解
一、技术概述
页面双生(Twin Pages)是一种新型网络钓鱼攻击技术,攻击者通过创建两个相互依赖的网页——主页面和副页面,利用目标的浏览习惯和行为模式进行攻击。该技术的核心特点是:
- 动态渲染:只有当目标同时打开这两个页面时,副页面才会动态渲染成钓鱼网页
- 隐蔽性强:单独打开任意一个页面都显示正常内容,难以被察觉
- 规避检测:减少被反病毒工具或其他安全机制发现的机会
二、攻击原理
攻击流程
- 用户打开主页面(显示正常内容)
- 用户通过主页面中的链接或自动弹窗打开副页面
- 两个页面通过特定机制互相确认对方的存在
- 确认后,副页面动态渲染为钓鱼页面(如伪造登录页面)
- 用户误以为是正常登录流程,输入敏感信息
技术依赖
- 窗口间通信:使用
window.name和localStorage进行页面间状态同步 - 动态内容渲染:根据状态标记决定是否显示钓鱼内容
- 用户行为利用:依赖用户同时保持两个页面打开的习惯
三、技术实现细节
主页面构建(test.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Main Page</title>
<script>
// 标记主页面已打开
function markMainPageOpened() {
window.name = 'main'; // 设置窗口名称,便于副页面识别
localStorage.setItem('mainPageOpened', 'true'); // 在localStorage中标记
}
// 检查副页面是否已打开,并准备钓鱼页面渲染
function checkTwinPageStatus() {
if (localStorage.getItem('twinPageOpened') === 'true') {
// 标记准备显示钓鱼页面
localStorage.setItem('showPhishing', 'true');
}
}
// 页面加载时执行的函数
window.onload = function() {
markMainPageOpened(); // 标记主页面已打开
checkTwinPageStatus(); // 检查副页面是否已打开
// 页面卸载时清理localStorage,防止数据泄漏
window.onbeforeunload = function() {
localStorage.removeItem('mainPageOpened');
localStorage.removeItem('showPhishing');
};
// 通过消息发送通知副页面
window.addEventListener("message", function(event) {
if (event.origin !== window.location.origin) return; // 确保消息来源可靠
if (event.data === "twinPageOpened") {
localStorage.setItem('twinPageOpened', 'true'); // 标记副页面已打开
localStorage.setItem('showPhishing', 'true'); // 准备渲染钓鱼页面
}
});
};
</script>
</head>
<body>
<h1>Welcome to the Main Page</h1>
<p>This is a normal page. It will display as usual.</p>
<p>You can interact with the page as you normally would.</p>
<!-- 示例按钮,模拟向副页面发送信息 -->
<button onclick="window.open('twinPage.html', 'twin')">Open Twin Page</button>
</body>
</html>
关键技术点
- 窗口标识:通过
window.name = 'main'设置窗口名称供副页面识别 - 状态存储:使用
localStorage存储和检查页面状态:mainPageOpened:标记主页面已打开twinPageOpened:标记副页面已打开showPhishing:控制是否显示钓鱼内容
- 页面通信:通过
window.addEventListener("message", ...)实现跨页面通信 - 清理机制:在
onbeforeunload事件中清理localStorage,避免留下痕迹
四、防御措施
用户层面防护
- 避免同时打开多个不明页面:特别是通过链接自动打开的页面
- 检查URL:在输入敏感信息前仔细核对网站域名
- 使用密码管理器:自动填充可避免输入到伪造页面
- 启用多因素认证:即使密码泄露也能提供额外保护
技术层面防护
- 禁用不必要的JavaScript:钓鱼页面常依赖JS实现动态渲染
- 使用反钓鱼浏览器扩展:如Netcraft Extension等
- 监控localStorage使用:异常频繁的localStorage操作可能是钓鱼信号
- 实施内容安全策略(CSP):限制页面加载外部资源
企业防护建议
- 员工安全意识培训:识别新型钓鱼技术
- 邮件过滤:拦截包含可疑链接的邮件
- 网络监控:检测异常页面访问模式
- 终端防护:部署能检测此类攻击的安全软件
五、检测方法
-
静态分析:
- 检查网页代码中是否存在可疑的localStorage操作
- 查找跨页面通信代码(window.postMessage等)
-
动态分析:
- 单独打开页面观察内容
- 同时打开多个页面观察行为变化
- 监控网络请求是否在特定条件下触发
-
行为分析:
- 检测页面是否根据其他标签页状态改变行为
- 检查是否有隐藏的窗口/标签页操作
六、总结
页面双生技术代表了钓鱼攻击的演进方向,其特点是:
- 高度隐蔽:单一页面显示正常内容
- 动态触发:依赖用户行为触发恶意内容
- 规避检测:传统基于单一页面分析的检测方法可能失效
防御此类攻击需要结合技术防护和用户教育,保持对新型攻击技术的认知更新,才能有效防范此类精心设计的钓鱼攻击。