對www.xici.net西祠衚衕自動登陸的引數分析

NO IMAGE

這些大網站一般登陸的時候都是對資料包進行了一些處理,西祠衚衕作為這麼大的網站肯定也是這樣,今天拿到這個站點分析了下,只分析登陸過程。登陸地址在這裡:

http://www.xici.net/user/logon_proc.asp?login_type=logform&cityidlog=0&gotoUrl=

 

通過抓包發現,登陸需要如下的引數和值:

Password 
UserCode 370091F92A48871EAA35C46E5B5C95FF
UserName postapp1
cityid 0
gotoUrl 
keyCode 1313547343712
logpath user/logon_proc.asp?login_type=logform&cityidlog=0&gotoUrl=
verifyimg asd

 

有幾個欄位需要解釋下,userCode是處理後的password,關鍵就是這個值的處理過程。

1:keyCode的值為keyCode new Date().getTime()
2:驗證的請求地址為/service/verifyimg.asp?xNow=[keycode]的值
3:logpath的值為 location.href.substring(location.host.length 8) 也就是當前請求地址的uri
4:verifyimg就是驗證碼的值
5:UserCode是處理後的的密碼,處理函式為:

Logon.UserCode.value = H2(H2(Logon.Password.value,8)   "-"   document.cookie.substr(document.cookie.indexOf("SessionID")   10, 16), 8);

 

 

其中H2的函式如下:

function C(x,l){function B(n,c){return (n<<c)|(n>>>(32-c));}function S(x,y){var l=(x&0xFFFF) (y&0xFFFF);var w=(x>>16) (y>>16) (l>>16);return (w<<16)|(l&0xFFFF);}function M(q,a,b,x,s,t){return S(B(S(S(a,q),S(x,t)),s),b);}function F(a,b,c,d,x,s,t){return M((b&c)|((~b)&d),a,b,x,s,t);}function G(a,b,c,d,x,s,t){return M((b&d)|(c&(~d)),a,b,x,s,t);}function H(a,b,c,d,x,s,t){return M(b^c^d,a,b,x,s,t);}function I(a,b,c,d,x,s,t){return M(c^(b|(~d)),a,b,x,s,t);}function BH(b){var h="0123456789ABCDEF";var s="";for(var i=0;i<b.length*4;i  ){s =h.charAt((b[i>>2]>>((i%4)*8 4))&0xF) h.charAt((b[i>>2]>>((i%4)*8))&0xF);}return s;}x[l>>5]|=0x80<<((l)%32);x[(((l 64)>>>9)<<4) 14]=l;var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;for(var i=0;i<x.length;i =16){var oa=a;var ob=b;var oc=c;var od=d;a=F(a,b,c,d,x[i 0],7,-680876936);d=F(d,a,b,c,x[i 1],12,-389564586);c=F(c,d,a,b,x[i 2],17,606105819);b=F(b,c,d,a,x[i 3],22,-1044525330);a=F(a,b,c,d,x[i 4],7,-176418897);d=F(d,a,b,c,x[i 5],12,1200080426);c=F(c,d,a,b,x[i 6],17,-1473231341);b=F(b,c,d,a,x[i 7],22,-45705983);a=F(a,b,c,d,x[i 8],7,1770035416);d=F(d,a,b,c,x[i 9],12,-1958414417);c=F(c,d,a,b,x[i 10],17,-42063);b=F(b,c,d,a,x[i 11],22,-1990404162);a=F(a,b,c,d,x[i 12],7,1804603682);d=F(d,a,b,c,x[i 13],12,-40341101);c=F(c,d,a,b,x[i 14],17,-1502002290);b=F(b,c,d,a,x[i 15],22,1236535329);a=G(a,b,c,d,x[i 1],5,-165796510);d=G(d,a,b,c,x[i 6],9,-1069501632);c=G(c,d,a,b,x[i 11],14,643717713);b=G(b,c,d,a,x[i 0],20,-373897302);a=G(a,b,c,d,x[i 5],5,-701558691);d=G(d,a,b,c,x[i 10],9,38016083);c=G(c,d,a,b,x[i 15],14,-660478335);b=G(b,c,d,a,x[i 4],20,-405537848);a=G(a,b,c,d,x[i 9],5,568446438);d=G(d,a,b,c,x[i 14],9,-1019803690);c=G(c,d,a,b,x[i 3],14,-187363961);b=G(b,c,d,a,x[i 8],20,1163531501);a=G(a,b,c,d,x[i 13],5,-1444681467);d=G(d,a,b,c,x[i 2],9,-51403784);c=G(c,d,a,b,x[i 7],14,1735328473);b=G(b,c,d,a,x[i 12],20,-1926607734);a=H(a,b,c,d,x[i 5],4,-378558);d=H(d,a,b,c,x[i 8],11,-2022574463);c=H(c,d,a,b,x[i 11],16,1839030562);b=H(b,c,d,a,x[i 14],23,-35309556);a=H(a,b,c,d,x[i 1],4,-1530992060);d=H(d,a,b,c,x[i 4],11,1272893353);c=H(c,d,a,b,x[i 7],16,-155497632);b=H(b,c,d,a,x[i 10],23,-1094730640);a=H(a,b,c,d,x[i 13],4,681279174);d=H(d,a,b,c,x[i 0],11,-358537222);c=H(c,d,a,b,x[i 3],16,-722521979);b=H(b,c,d,a,x[i 6],23,76029189);a=H(a,b,c,d,x[i 9],4,-640364487);d=H(d,a,b,c,x[i 12],11,-421815835);c=H(c,d,a,b,x[i 15],16,530742520);b=H(b,c,d,a,x[i 2],23,-995338651);a=I(a,b,c,d,x[i 0],6,-198630844);d=I(d,a,b,c,x[i 7],10,1126891415);c=I(c,d,a,b,x[i 14],15,-1416354905);b=I(b,c,d,a,x[i 5],21,-57434055);a=I(a,b,c,d,x[i 12],6,1700485571);d=I(d,a,b,c,x[i 3],10,-1894986606);c=I(c,d,a,b,x[i 10],15,-1051523);b=I(b,c,d,a,x[i 1],21,-2054922799);a=I(a,b,c,d,x[i 8],6,1873313359);d=I(d,a,b,c,x[i 15],10,-30611744);c=I(c,d,a,b,x[i 6],15,-1560198380);b=I(b,c,d,a,x[i 13],21,1309151649);a=I(a,b,c,d,x[i 4],6,-145523070);d=I(d,a,b,c,x[i 11],10,-1120210379);c=I(c,d,a,b,x[i 2],15,718787259);b=I(b,c,d,a,x[i 9],21,-343485551);a=S(a,oa);b=S(b,ob);c=S(c,oc);d=S(d,od);}return BH(Array(a,b,c,d));}function H2(s,z){function SB(s){var b=Array();var m=(1<<z)-1;for(var i=0;i<s.length*z;i =z)b[i>>5]|=(s.charCodeAt(i/z)&m)<<(i%32);return b;}if(!z)z=16;return C(SB(s),s.length*z);}

這段程式碼對別的js程式碼沒有依賴,這個就是全部的程式碼了。其實解析完發現不復雜,複雜的是解析的過程。

好了,需要坐對應登陸程式的同學可以拿去用了。。

 

 

補充:下午的時候根據上午的一些資訊來搞,發現有一個cookie的key為HostId,如果這個不存在的話,登陸直接返回304的跳轉到首頁去,但是這個值經過下午的分析和判斷找到了在一個asp檔案中http://www.xici.net/service/verify.asp 這個檔案中的js有操作HostId的cookie程式碼。但是發現還是做了一些運算,不管用的,獲取不到真實的值。但是後來發現這個值就複製到程式碼中,手工新增這個cookie到cookieContainer中就可以了,正確和錯誤是不判斷的,只要有這個值就可以登陸成功了。

 

希望高手如果瞭解的話,看懂這個程式碼的話告知我下。

這個asp的程式碼如下:

<html>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<head>
<META http-equiv="Content-Type" content="text/html; charset=gb2312"></head>
<body style="margin:0 0 0 0" onload="setTimeout('o()',10);">
<INPUT type=hidden style="behavior:url(#default#userdata);" id=oHostId value="ba17d9f78604497a-6fb10414d744e42ca44472b117f423ed">
<SCRIPT LANGUAGE="JavaScript">
function verify_DoFSCommand(command, args){if(command == "set_Host"){var d = new Date();d.setTime((new Date()).getTime()   360000000000);document.cookie="HostID="   args   ";domain=xici.net;path=/;expires="   d.toGMTString();try{oHostId.load("xici.net");oHostId.setAttribute("HostID",args);oHostId.save("xici.net");}catch(e){}}}
function o(){if(document.cookie.indexOf("HostID") == -1){try{oHostId.load("xici.net");if(oHostId.getAttribute("HostID")){oHostId.value=oHostId.getAttribute("HostID");}}catch(e){}verify_DoFSCommand("set_Host", document.getElementById("oHostId").value);}}
</script>
<SCRIPT LANGUAGE="VBScript">
Sub verify_FSCommand(ByVal command, ByVal args)
call verify_DoFSCommand(command, args)
end sub
</SCRIPT>
<OBJECT ID=verify CLASSID="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" WIDTH="1" HEIGHT="1" CODEBASE="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"><PARAM NAME="MOVIE" VALUE="/_img/verify.swf"><PARAM NAME="FlashVars" VALUE="session=BA17D9F78604497A"><EMBED NAME="verify" SRC="/_img/verify.swf" WIDTH="1" HEIGHT="1" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer" FlashVars="session=BA17D9F78604497A"></EMBED></OBJECT>
</body>
</html>

可以很明顯看到,頁面載入的時候onload裡面呼叫函式0,函式o裡面出現對oHostId進行load,getAtribute,value的操作,我很納悶這個oHostId是指得這個裡面中的那個id為oHostId的隱藏域麼?input物件沒有load,getAttribute的這些方法啊,js高手給個說法,謝謝!