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 相关文章推荐
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
jquery实现鼠标滑过小图时显示大图的方法
Jan 14 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
Jul 04 Javascript
AngularJS基础 ng-focus 指令简单示例
Aug 01 Javascript
COM组件中调用JavaScript函数详解及实例
Feb 23 Javascript
Webpack中css-loader和less-loader的使用教程
Apr 27 Javascript
React-Native 组件之 Modal的使用详解
Aug 08 Javascript
echart简介_动力节点Java学院整理
Aug 11 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
Dec 22 Javascript
微信小程序与公众号实现数据互通的方法
Jul 25 Javascript
如何在vue-cli中使用css-loader实现css module
Jan 07 Vue.js
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
Mar 01 Vue.js
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
提问的智慧
2006/10/09 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
php适配器模式简单应用示例
2019/10/23 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
python异常和文件处理机制详解
2016/07/19 Python
单链表反转python实现代码示例
2018/02/08 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
python write无法写入文件的解决方法
2019/01/23 Python
python如何进行矩阵运算
2020/06/05 Python
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
高三霸气励志标语
2014/06/24 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers