源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

javascript的函数劫持浅析

  • 时间:2021-06-07 01:44 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:javascript的函数劫持浅析
[b]javascript的函数劫持是什么?[/b] 函数劫持,顾名思义,即在一个函数运行之前把它劫持下来,添加我们想要的功能。当这个函数实际运行的时候,它已经不是原本的函数了,而是带上了被我们添加上去的功能。这也是我们常见的钩子函数的原理之一。 乍一看上去,这很像是函数的改写。函数的改写也可以理解为是函数劫持的一种,但是这种方式太恶心了。作为一个劫持者,在绑票获得好处以后也应该遵守职业道德,把人原封不动地还回去,所以我们得在合适的地方把函数原本的功能给重新调用回来。 推而广之,其实“劫持”这一概念我们经常会遇到,比方说某网站被运营商劫持了,在浏览该网站的时候会弹出运营商的广告。 [b]举例分析[/b] 现在我们来举个简单的例子,劫持一下alert()函数,为它增添一点小小的功能:
let warn = alert
window.alert = (t) => {
 if (confirm('How are you?')) warn(t)
}

alert('Help me...!!!')
可以打开开发者工具尝试一下这个例子,你会发现只有你在[code]confirm[/code]里面点击了OK,才会弹出[code]Help me...!!![/code] 。 接下来我们把这部分的内容封装一下,成为一个通用的函数:
const hijack = (obj, method, fun) => {
 let orig = obj[method]
 obj[method] = fun(orig)
}
首先我们定义了一个[code]hijack[/code]函数,它会先把原函数给保存下来,然后执行自定义函数,而原函数将会在自定义函数内部进行调用。 然后我们来劫持[code]confirm()[/code]函数:
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!!')
 }
 }
})
这段函数的功能很简单就不详细说明了,直接调用[code]confirm()[/code]你就知道了。 [b]反劫持[/b] 新建一个页面,打开你的开发者工具控制台,输入[code]alert[/code],你会看到这样的输出:
function alert() { [native code] }
然后使用本文开头的那段代码,把[code]alert()[/code]劫持一下,再重新在控制台输入[code]alert[/code],你会看到这样的输出:
function (t) => {
 if (confirm('How are you?')) warn(t)
}
通过上述的例子可以知道,要看一个函数是否被劫持了,只需要直接把它打印出来即可。针对系统原生的函数,[code] [native code][/code]即代表它是纯净无污染的。 [b]函数劫持的作用[/b] 除了为函数增加功能以外,还能够利用函数劫持去追踪恶意用户的信息。一般的XSS攻击会先利用[code]alert()[/code]等能够输出信息的方法进行测试,这时候我们可以先对原生[code]alert()[/code]进行劫持,向其输入追踪信息的代码,最后才把原函数释放出去。当恶意用户在测试[code]alert()[/code]的时候就会立即被我们追踪,而他本人却无从察觉。 [b]JavaScript劫持与JavaScript Hijacking黑客技术[/b] [b][img]http://files.jb51.net/file_images/article/201609/2016926144745719.jpg?201682614481[/img] [/b] 注:图中的序号表示的是JavaScript黑技术的实现顺序 这里面是通过在存在漏洞的信任网站下正常登入,然后切换到已经恶意网站(这个时候信任网站不能登出),这时在恶意网站会吧返回的JavaScript脚本和信任网站返回的[code]cookie[/code]一起重新发送给信任网站,从而获取信任网站的敏感信息 [b]注意事项:[/b]      1、信任网站(步骤2)返回的内容必须是JSON数组,如果是[code]JSON[/code]对象的话那么会发生JavaScript错误,但是我们可以在返回的时候检测返回的类型,如果是对象的话,那么我们也是可以在对象的前后加上中括号      2、劫持与JavaScript Hijacking技术的关系是在步骤五上面体现的,在步骤五的实现上是一定要通过JavaScript劫持去重写对象中的方法,从而记录信任网站中敏感信息的功能,所以JavaScript Hijacking的实现与劫持密不可分      3、信任网站必须响应一个[code]GET[/code]请求 [b]总结[/b] 关于JS的函数劫持,也不是什么新鲜的东西,只是在最近的工作中遇到了这个知识点感觉比较陌生,所以花了一些时间进行了研究,并把结果记录下来。以上就是这篇文章的全部内容了,如果发现有什么错漏的地方欢迎指正!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部