宝哥软件园

javascript函数劫持分析

编辑:宝哥软件园 来源:互联网 时间:2021-09-07

什么是javascript的函数劫持?

函数劫持,顾名思义,就是在函数运行之前劫持函数,添加我们想要的函数。当这个函数实际运行时,它不再是原来的函数,而是我们添加的函数。这是钩子函数的常见原理之一。

乍一看,这像是函数的重写。重写一个函数也可以理解为一种函数劫持,但是这种方式很恶心。作为劫持者,我们应该遵守职业道德,在获得绑架的好处后原封不动地送还人,所以我们必须在合适的地方召回功能的原始功能。

推而广之,其实我们经常会遇到“劫持”这个概念。比如某个网站被运营商劫持,在浏览网站时会弹出运营商的广告。

实例分析

现在让我们举一个简单的例子,劫持alert()函数并添加一个小函数:

让warn=alertwindow.alert=(t)={ if(确认('你好吗?))警告提醒('帮助我.')您可以打开开发人员工具并尝试这个示例。你会发现,只有当你在确认中点击确定,帮助我才会弹出!

接下来,我们封装这一部分的内容,成为一个通用函数:

const check=(obj,method,fun)={ let orig=obj[method]obj[method]=fun(orig)}首先我们定义一个劫持函数,先保存原来的函数,然后执行自定义函数,在自定义函数内部调用原来的函数。

然后我们劫持confirm()函数:

劫持(窗口,'确认',(原始)={返回(文本)={警报('帮助我PLZ!')如果(原始呼叫(这个,文本)){提醒('你看起来很好,我要走了,再见!')} else { alert('HOLD ON!我来了!')}}})这个函数的功能很简单,就不详细解释了。只需拨打确认()。

反劫持

创建一个新页面,打开您的开发人员工具控制台,输入alert,您将看到以下输出:

函数alert(){[本机代码]}然后使用本文开头的代码劫持alert(),然后在控制台中重新输入alert,您将看到以下输出:

函数(t)={ if(确认('你好吗?))warn(t)}从上面的例子可以知道,如果一个函数被劫持了,我们只需要直接打印出来。【原生代码】表示系统的原生功能是纯净无污染的。

函数劫持的作用

除了在函数中添加函数,我们还可以使用函数劫持来跟踪恶意用户的信息。通用XSS攻击将通过使用诸如alert()之类的方法进行测试,这些方法可以输出信息。这时我们可以劫持原生alert(),将跟踪信息的代码输入其中,最后释放原来的功能。当恶意用户测试alert()时,我们会立即跟踪他,但他并不知道。

JavaScript劫持和JavaScript劫持黑客技术

注:图中序号表示JavaScript黑科技的实现顺序

这是在易受攻击的可信网站下正常登录,然后切换到恶意网站(此时可信网站无法注销)。此时,恶意网站返回的JavaScript脚本将与可信网站返回的cookie一起重新发送到可信网站,从而获取可信网站的敏感信息

注意事项:

1.可信网站返回的内容(步骤2)必须是JSON数组。如果是JSON对象,会出现JavaScript错误,但是我们可以在返回的时候检测返回的类型。如果是object,我们也可以在object前后加括号。

2.劫持和JavaScript劫持技术之间的关系体现在第5步中。在步骤5的实现中,对象中的方法必须通过JavaScript Hijacking重写,以记录信任网站中敏感信息的功能。因此,JavaScript劫持的实现离不开劫持

3.信任网站必须响应GET请求

摘要

JS的函数劫持并不是什么新鲜事,但是在最近的工作中遇到这个知识点就比较奇怪了,所以花了一些时间去研究和记录结果。以上就是本文的全部内容。如果您发现任何错误或遗漏,请纠正我!

更多资讯
游戏推荐
更多+