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 indexOf函数使用说明
Jul 03 Javascript
javascript中call和apply方法浅谈
Sep 27 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
Feb 14 Javascript
js实现多张图片延迟加载效果
Jul 17 Javascript
深入浅析angular和vue还有jquery的区别
Aug 13 jQuery
vue-cli 打包使用history模式的后端配置实例
Sep 20 Javascript
JS如何获取地址栏的参数实例讲解
Oct 06 Javascript
泛谈JS逻辑判断选择器 || &&
May 24 Javascript
深入理解JS异步编程-Promise
Jun 03 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
Aug 10 Javascript
JS继承最简单的理解方式
Mar 31 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
Smarty+QUICKFORM小小演示
2007/02/25 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
分享php分页的功能模块
2015/06/16 PHP
开启PHP的伪静态模式
2015/12/31 PHP
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
vue插件实现v-model功能
2018/09/10 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
django 修改server端口号的方法
2018/05/14 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
对python模块中多个类的用法详解
2019/01/10 Python
Python3.5运算符操作实例详解
2019/04/25 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
Python如何获取文件指定行的内容
2020/05/27 Python
详解Python高阶函数
2020/08/15 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
自主招生自荐书
2013/11/29 职场文书
总账会计岗位职责
2014/03/13 职场文书
流动人口婚育证明
2014/10/19 职场文书
大连导游词
2015/02/12 职场文书
反腐倡廉观后感
2015/06/08 职场文书
于丹讲座视频观后感
2015/06/15 职场文书