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 相关文章推荐
淘宝搜索框效果实现分析
Mar 05 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
Jan 16 Javascript
jQuery.query.js 取参数的两点问题分析
Aug 06 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
Dec 04 Javascript
js字符串转换成xml对象并使用技巧解读
Apr 18 Javascript
Bootstrap实现带动画过渡的弹出框
Aug 09 Javascript
总结十个Angular.js由浅入深的面试问题
Aug 26 Javascript
详解JS数组Reduce()方法详解及高级技巧
Aug 18 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
Feb 21 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
Apr 01 Javascript
Vue切换Tab动态渲染组件的操作
Sep 21 Javascript
js前端对于大量数据的展示方式及处理方法
Dec 02 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网站备份程序代码分享
2011/06/10 PHP
ThinkPHP之import方法实例详解
2014/06/20 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
Java servlet面试题
2012/03/04 面试题
师范毕业生自我鉴定
2014/01/15 职场文书
班级德育工作实施方案
2014/02/21 职场文书
少年闰土教学反思
2014/02/22 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
海洋科学专业求职信
2014/08/10 职场文书
门面房租房协议书
2014/08/20 职场文书
资产运营委托书范本
2014/10/16 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
全民创业工作总结
2015/08/13 职场文书
python 破解加密zip文件的密码
2021/04/22 Python
详解Vue3使用axios的配置教程
2022/04/29 Vue.js