javascript的函数劫持浅析


Posted in Javascript onSeptember 26, 2016

javascript的函数劫持是什么?

函数劫持,顾名思义,即在一个函数运行之前把它劫持下来,添加我们想要的功能。当这个函数实际运行的时候,它已经不是原本的函数了,而是带上了被我们添加上去的功能。这也是我们常见的钩子函数的原理之一。

乍一看上去,这很像是函数的改写。函数的改写也可以理解为是函数劫持的一种,但是这种方式太恶心了。作为一个劫持者,在绑票获得好处以后也应该遵守职业道德,把人原封不动地还回去,所以我们得在合适的地方把函数原本的功能给重新调用回来。

推而广之,其实“劫持”这一概念我们经常会遇到,比方说某网站被运营商劫持了,在浏览该网站的时候会弹出运营商的广告。

举例分析

现在我们来举个简单的例子,劫持一下alert()函数,为它增添一点小小的功能:

let warn = alert
window.alert = (t) => {
 if (confirm('How are you?')) warn(t)
}

alert('Help me...!!!')

可以打开开发者工具尝试一下这个例子,你会发现只有你在confirm里面点击了OK,才会弹出Help me...!!!

接下来我们把这部分的内容封装一下,成为一个通用的函数:

const hijack = (obj, method, fun) => {
 let orig = obj[method]
 obj[method] = fun(orig)
}

首先我们定义了一个hijack函数,它会先把原函数给保存下来,然后执行自定义函数,而原函数将会在自定义函数内部进行调用。

然后我们来劫持confirm()函数:

hijack(window, 'confirm', (orig) => {
 return (text) => {
 alert('HELP ME PLZ!!!')
 if (orig.call(this, text)) {
  alert('YOU SEEMS FINE AND I AM LEAVING, GOOD BYE!')
 } else {
  alert('HOLD ON! I AM COMING!!')
 }
 }
})

这段函数的功能很简单就不详细说明了,直接调用confirm()你就知道了。

反劫持

新建一个页面,打开你的开发者工具控制台,输入alert,你会看到这样的输出:

function alert() { [native code] }

然后使用本文开头的那段代码,把alert()劫持一下,再重新在控制台输入alert,你会看到这样的输出:

function (t) => {
 if (confirm('How are you?')) warn(t)
}

通过上述的例子可以知道,要看一个函数是否被劫持了,只需要直接把它打印出来即可。针对系统原生的函数, [native code]即代表它是纯净无污染的。

函数劫持的作用

除了为函数增加功能以外,还能够利用函数劫持去追踪恶意用户的信息。一般的XSS攻击会先利用alert()等能够输出信息的方法进行测试,这时候我们可以先对原生alert()进行劫持,向其输入追踪信息的代码,最后才把原函数释放出去。当恶意用户在测试alert()的时候就会立即被我们追踪,而他本人却无从察觉。

JavaScript劫持与JavaScript Hijacking黑客技术

javascript的函数劫持浅析

注:图中的序号表示的是JavaScript黑技术的实现顺序

这里面是通过在存在漏洞的信任网站下正常登入,然后切换到已经恶意网站(这个时候信任网站不能登出),这时在恶意网站会吧返回的JavaScript脚本和信任网站返回的cookie一起重新发送给信任网站,从而获取信任网站的敏感信息

注意事项:

     1、信任网站(步骤2)返回的内容必须是JSON数组,如果是JSON对象的话那么会发生JavaScript错误,但是我们可以在返回的时候检测返回的类型,如果是对象的话,那么我们也是可以在对象的前后加上中括号

     2、劫持与JavaScript Hijacking技术的关系是在步骤五上面体现的,在步骤五的实现上是一定要通过JavaScript劫持去重写对象中的方法,从而记录信任网站中敏感信息的功能,所以JavaScript Hijacking的实现与劫持密不可分

     3、信任网站必须响应一个GET请求

总结

关于JS的函数劫持,也不是什么新鲜的东西,只是在最近的工作中遇到了这个知识点感觉比较陌生,所以花了一些时间进行了研究,并把结果记录下来。以上就是这篇文章的全部内容了,如果发现有什么错漏的地方欢迎指正!

Javascript 相关文章推荐
javascript同步Import,同步调用外部js的方法
Jul 08 Javascript
Prototype Date对象 学习
Jul 12 Javascript
Javascript attachEvent传递参数的办法
Dec 14 Javascript
javascript中基本类型和引用类型的区别分析
May 12 Javascript
jQuery遮罩层效果实例分析
Jan 14 Javascript
JS+Canvas绘制时钟效果
Aug 20 Javascript
jQuery文字横向滚动效果的实现代码
May 31 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
Jun 13 Javascript
JS修改地址栏参数实例代码
Jun 14 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
Sep 17 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
Oct 22 Javascript
JavaScript中this的四个绑定规则总结
Sep 26 #Javascript
jQuery 选择器(61种)整理总结
Sep 26 #Javascript
jQuery tagsinput在h5邮件客户端中应用详解
Sep 26 #Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
Sep 26 #Javascript
几句话带你理解JS中的this、闭包、原型链
Sep 26 #Javascript
BootStrap下拉菜单和滚动监听插件实现代码
Sep 26 #Javascript
通过BootStrap实现轮播图的实际应用
Sep 26 #Javascript
You might like
php ZipArchive压缩函数详解实例
2013/11/06 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python自然语言编码转换模块codecs介绍
2015/04/08 Python
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
聊聊Python中的pypy
2018/01/12 Python
详解Python自建logging模块
2018/01/29 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
电工工作职责范本
2014/02/22 职场文书
师德演讲稿范文
2014/05/06 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
中班上学期个人总结
2015/02/12 职场文书
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python