let warn = alertwindow.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]
即代表它是纯净无污染的。alert()
等能够输出信息的方法进行测试,这时候我们可以先对原生alert()
进行劫持,向其输入追踪信息的代码,最后才把原函数释放出去。当恶意用户在测试alert()
的时候就会立即被我们追踪,而他本人却无从察觉。
注:图中的序号表示的是JavaScript黑技术的实现顺序
这里面是通过在存在漏洞的信任网站下正常登入,然后切换到已经恶意网站(这个时候信任网站不能登出),这时在恶意网站会吧返回的JavaScript脚本和信任网站返回的cookie
一起重新发送给信任网站,从而获取信任网站的敏感信息
注意事项:
1、信任网站(步骤2)返回的内容必须是JSON数组,如果是JSON
对象的话那么会发生JavaScript错误,但是我们可以在返回的时候检测返回的类型,如果是对象的话,那么我们也是可以在对象的前后加上中括号
2、劫持与JavaScript Hijacking技术的关系是在步骤五上面体现的,在步骤五的实现上是一定要通过JavaScript劫持去重写对象中的方法,从而记录信任网站中敏感信息的功能,所以JavaScript Hijacking的实现与劫持密不可分
3、信任网站必须响应一个GET
请求
总结
关于JS的函数劫持,也不是什么新鲜的东西,只是在最近的工作中遇到了这个知识点感觉比较陌生,所以花了一些时间进行了研究,并把结果记录下来。以上就是这篇文章的全部内容了,如果发现有什么错漏的地方欢迎指正!