关于Ajax的执行,开发人员是这样想的“Ajax要做到,在用户浏览网页时应该感觉不到的它的执行(异步),不需要等待页面刷新就可以自动完成验证数据”,比如用户名是否可以注册等。每当我想到“感觉不到的它的执行”这句话,就会联想到还有很多网络安全相关的东西(比如木马)都希望可以做到在用户感觉不到执行,或者可以在用户感觉不到的时候做些什么。
许多“研究网络安全的朋友”都应该感觉到,微软的操作系统已经很久没有像以前那样可以“ms05039.exe www.microsoft.com 7758”拿到SYSTEM权限了。于是大家都把目光放到了浏览器上,希望用户一旦浏览某个网页就能自动下载真正的木马服务端文件,然后在后台执行,这样的网页被成为“网页木马”。这样做有几点明显的好处:
1、不必想方设法突破层层防火墙,局域网内用户会自己通过“反弹连接”方式被轻易的控制。
2、如果这个有木马的网页在点击率高的网站上,会有很大的攻击面,只要浏览该页就可能中木马,比苦苦的等待扫描结果爽的多。
3、发送的电子邮件也可以附带这样的网页。
于是各种各样的IE漏洞出现了,从刚开始想办法在用户浏览网页时“56K猫的网速竟然要在后台下载300K左右的木马服务端”,到各类“11k下载者”的出现,大家唯一的目的就是想做到“让用户感觉不到的时候执行”。也是出于这个目的,我决定再研究下把Ajax融入网页木马,让木马“悄悄的进庄,打枪的不要”。
研究Ajax首先要研究“XmlHttp”,来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议。客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft? XML Document Object Model (DOM)处理回应。通常一个简单的Ajax是这样写的:
从第四步开始,浏览器就不再等待服务器返回的结果,而是继续处理“其他的事情”,这就是“用户感觉不到的时候(异步执行)”,等服务器返回结果时,才开始处理服务器返回的信息,所以这个时候最适合去服务器下载木马。关于异步执行,有个比较形象的比方,小李和女朋友上街,看到一家女士专卖店,小李不愿意进去,就在门口等,这个时候,他可以选择两种方式:1、在门口一直等着女朋友出来(同步执行),之后继续逛街;2、两个人事先商量好,然后闪人,等女朋友出来时会打电话叫他回来,之后继续逛街。
Xmlhttp对象有4个属性,用来描述服务器返回的不同数据类型,让JAVASCRIPT的变量接收。开始研究时,我有个思路: Javascript语言的变量是弱类型的,变量被定义后,初始化为什么类型,就是什么类型的变量。其中有一个属性“responseStream”,返回“Ado Stream” 对象,该对象有个方法用来把返回的数据保存为文件,可以完成“下载木马”这个过程。于是写了个脚本,把返回的对象alert出来,竟然没有返回object,而是发生错误,提示类型不支持。于是搜索“responseStream”的资料, MSDN里没有详细信息,使用“.Net2005”编译器调试时看不到返回类型,code.google.com里也找不到相关代码(哪位大侠有相关可以操作responseStream的资料,麻烦给一份)。
破解网页木马加密篇:
为了继续研究,只好“探探虎穴”,在QQ群里查看聊天记录,找QQ尾巴给出的网站,这样的网站通常都是被挂了马的。开启杀毒软件后打开网站,果然报有病毒:
停止杀毒软件的实时监控,使用EditPlus编辑网页源代码,代码内容被加密了。
基于javascript的网页加密都是对称的,可以还原回来。代码很凌乱,可见这段代码的作者不希望大家能看到。排版后看的清楚些,把重要的拿出来:
加密流程如下:
我们其实不用关心具体加密解密算法是什么,只关心如何解密就可以了,下面是解密的流程:
这样加密后,用户看到的就是加密后的页面,而浏览器会自动执行解密流程。破解这样的加密很简单,把源代码另存为htm文件,然后修改代码,解密的结果在一个文本域输出。
再次使用浏览器打开看到了解密后的真实代码在文本域里。因为这段代码会被杀毒软件查杀,所以不能给出文字的,排版后再次抓图:
这段代码就是真正的网页木马代码。