0 引子
1 构想
主流微博都提供了短URL服务,像新浪的t.cn,QQ的url.cn。这两个短URL服务的访问量都不小,估计能有几千万的日PV。短URL除了URL短化,也提供了访问的跳转功能,这个跳转有点像镜子的反射,如果把两个镜子对着照会发生什么,相信我们都知道。那要是两个短URL网站相互跳转会如何呢?当然,这个场景其实和镜子的“无限”成像还是有区别,但是可以让一个被转化后的URL在访问时发生多次的转跳。
举例,把某个网址A,在两个短URL网址站反复的转化,假设我们做个100次,那么这个最终的短URL(假设为A1)被访问时,将在浏览器发生100次的跳转,给两个网站总共发送100次请求。再考虑,如果这个最终的A1被传播开(如被微博上的大号转下),那对短URL网站也算是一次DDOS攻击了。如果把这个生成的URL(A1)放在HTML标签中(如IMG),那即使不直接点开链接,浏览器也可能发送多个请求,从而产生攻击行为。
这个过程可以简单示意如:
这个URL(u50)就是上面说的可用于攻击的A1,只要访问A1,一个和上面流程相反的跳转过程就会发生,于是便让访问者的浏览器不知不觉中发起了100次请求。
以上纯属构思,以下为尝试过程。
2 尝试
2.1 方法1,两个(多个当然也OK)网站之间跳转。就拿t.cn和url.cn来实验。
尝试的过程没那么顺利,我相信这个问题两家网站可能也考虑到。至少新浪的 t.cn 做了些特殊处理。举个实际例子。网址http://www.baidu.com (记为A)在 url.cn 会生成
但要绕过这个限制也不难,互联网上提供短URL跳转服务的网站多得很。新浪也不可能一个不漏,随便google一下“urlshortener” , 可以找到不少服务。挑一个不太知名网站,t.cn就老实的做转化了。这样按前文所说的方法,就可以实现利用两短URL网站来生成攻击URL了。
跑题说下跳转方式,一般的HTTP重定向使用302(“Moved Temporarily“)状态码
说到跳转方式,是因为t.cn和url.cn的跳转处理有差异,t.cn用的是302跳转,而url.cn用的是301跳转。对于一个短URL跳转服务,更合理的是用301,这样相同浏览器对于同一个转化后的URL只会请求一次转化。t.cn用的302,会增加不少没必要的请求量,同时也更容易受到短URL攻击(当然,每次都请求的好处是方便统计,也更容易做跳转的控制),。综上,对于通过301来跳转的短URL攻击只能生效一次(同一浏览器),相对没那么有趣。后续内容主要针对t.cn。
2.2 方法2,单个短URL网站跳转
上一个方法需要搭上不知名的第三方短URL网站,不太厚道。于是想,能否只用一个短URL网站实现这种跳转。这里的一个问题需要考虑,对同一个URL像t.cn 只会映射到同一个短URL,同时对于t.cn为前缀的合法URL是不做转化的,这个思路看似不可行。
不过从经验来说,URL字符串处理是个容易出错的过程,我只试了一次,就找出个一个可以利用的BUG来。上面提到的
目标URL
1)一次转化生成
2)用
3)用
4)用
5)用
最终的URL(A1)http://t.cn/zO5YXKe
3
2.2里说的本站跳转还是可能从实现角度避免的。而构造多个短URL网站参与的攻击行为则很难从根本上避免。因为,我们不能预先区分一次跳转是正常的还是恶意的,而且这类网站也不可能对全部同类网站去做特殊处理。所以,以下说几点方案也只是权宜之策。
- 如果不是出于统计目的,跳转建议用301,一方面可以减少请求,另一方面减少受攻击的可能性。
- 从源URL到短URL的映射,需要一个细致的URL字符串归一化处理。例如大小写,端口处理还会有不少细节要处理,可参考相关RFC
- 白名单机制,像新浪对url.cn所做的特殊处理,对于白名单内的短URL直接请求得到源URL。当然这个方法一方面很难做全,另外也有效率上问题。
- 频度控制,简单而粗暴的方法,对于发生短时大量请求的用户,暂时封禁。这个方法虽然保护了服务器,但是容易误伤,而且有用户体验问题。
