CC 攻击的防御(-)通过 Cookie 抵挡 CC 攻击

2016-03-02 09:03:02 +08:00
 AlexaZhou

背景

CC 攻击发生在 TCP/IP 协议的第七层,一般方式是在很短的时间里对网站发起大量请求,消耗目标服务器的资源,使目标网站负载过高而不能访问。

CC 攻击和 UDP Flood, TCP SYN Flood 这类位于 TCP/IP 第四层的攻击相比,对自己的资源消耗更少,对服务器的攻击强度更高,有四两拨千斤的效果。如果防御不好,呵呵,一台笔记本打垮一整个服务器集群也不是不可能。

而一般人对网络攻击是怎样进行的,以及怎样进行防御了解的都不多,这也就给了攻击者可乘之机。我这段时间在开发 VeryNginx ,对这部分正好有所研究。于是写成《 CC 攻击的防御》系列文章,主要探讨 CC 攻击的原理,以及一些可能的防御思路。希望能对大家有所帮助,如同在我无知的时候,互联网上其他无私分享知识给我的人一样。

文中描述的全部方法都已经编写成代码,并实际测试通过,包含在开源项目 VeryNginx 中。开箱即可使用,并且还包含其他诸多强大功能。

传送门: https://github.com/alexazhou/VeryNginx

攻击方式

为了进行防御,我们首先要了解我们对手的攻击方式。

通常发起 CC 攻击是使用专门的攻击工具,同时模拟成多个用户,向目标网站发起多个请求,一般这些软件为了防止地址被屏蔽,还内置通过代理攻击的功能。可以通过多个代理服务器对目标发起攻击,使封 IP 的防御方式变的失效。

防御思路

因为 CC 攻击通过工具软件发起,而普通用户通过浏览器访问,这其中就会有某些区别。想办法对这二者作出判断,选择性的屏蔽来自机器的流量即可。

初级

普通浏览器发起请求时,除了要访问的地址以外, Http 头中还会带有 Referer , UserAgent 等多项信息。遇到攻击时可以通过日志查看访问信息,看攻击的流量是否有明显特征,比如固定的 Referer 或 UserAgent ,如果能找到特征,就可以直接屏蔽掉了。

中级

如果攻击者伪造了 Referer 和 UserAgent 等信息,那就需要从其他地方入手。攻击软件一般来说功能都比较简单,只有固定的发包功能,而浏览器会完整的支持 Http 协议,我们可以利用这一点来进行防御。

首先为每个访问者定义一个字符串,保存在 Cookies 中作为 Token ,必须要带有正确的 Token 才可以访问后端服务。当用户第一次访问时,会检测到用户的 Cookies 里面并没有这个 Token ,则返回一个 302 重定向,目标地址为当前页面,同时在返回的 Http 头中加入 set cookies 字段,对 Cookies 进行设置,使用户带有这个 Token 。

客户端如果是一个正常的浏览器,那么就会支持 http 头中的 set cookie 和 302 重定向指令,将带上正确的 Token 再次访问页面,这时候后台检测到正确的 Token ,就会放行,这之后用户的 Http 请求都会带有这个 Token ,所以并不会受到阻拦。

客户端如果是 CC 软件,那么一般不会支持这些指令,那么就会一直被拦在最外层,并不会对服务器内部造成压力。

高级

高级一点的,还可以返回一个网页,在页面中嵌入 JavaScript 来设置 Cookies 并跳转,这样被伪造请求的可能性更小

Token 生成算法

Token 需要满足以下几点要求

Token 随 IP 地址变化是为了防止通过一台机器获取 Token 之后,再通过代理服务来进行攻击。一致性则是为了避免在服务器端需要存储已经生成的 Token 。

推荐使用以下算法生成 Token ,其中 Key 为服务器独有的保密字符串,这个算法生成的 Token 可以满足以上这些要求。

Token = Hash( UserAgent + client_ip + key )

16374 次点击
所在节点    站长
43 条回复
AlexaZhou
2016-03-02 11:16:32 +08:00
@lecher

拦住搜索引擎是个问题,最好只是在被攻击的时候开启这个功能,平时关闭掉
jarlyyn
2016-03-02 11:40:12 +08:00
@AlexaZhou

我用过这个方法,而且是用的带 html 的 js 的。

同时我自己也写过简单的爬虫。用 phantomjs 之类的话,所有无痕的方式基本都没有用。

如果只是普通的 curl 的话,那么 html 静态页+固定 cookie 也足够了。大不了定时修改一下。

http://blog.jarlyyn.com/site/blogi/100
AlexaZhou
2016-03-02 11:49:00 +08:00
@jarlyyn

对 CC 攻击者来说,在使用固定或者唯一 Token 的情况下,攻击成本是有差别的。

很多攻击软件是可以设置 http 头的,如果使用固定 Token ,攻击者只需要在本机获取一次 Token ,然后设置好 http 头就可以直接发起攻击了,攻击成本低的可以...

但是如果使用可变 Token ,基本市面上所有 CC 软件全都无法使用了

这样就需要使用 phantomjs 这类的软件,这类工具一般是设计用来作为爬虫的,对攻击来说,速度太慢了
willis
2016-03-02 13:15:28 +08:00
这不就是 opencdn 的做法嘛 nginx +lua
AlexaZhou
2016-03-02 13:18:48 +08:00
@willis

可能是,好像加速乐也有这样的防护措施

主要是一般人对这个都不怎么了解,写出来科普一下
yanyandenuonuo
2016-03-02 13:44:24 +08:00
Token = Hash( UserAgent + client_ip + key )
一个局域网内两台相同配置的机器使用同一版本浏览器访问那 UserAgent 和 client_ip 应该都一样了吧
woodrat
2016-03-02 13:44:58 +08:00
还可以 302 到一个验证码页面
AlexaZhou
2016-03-02 13:47:58 +08:00
@yanyandenuonuo

这种情况 Token 是一样的
AlexaZhou
2016-03-02 13:48:13 +08:00
@woodrat

嗯,可以的
Strikeactor
2016-03-02 13:58:24 +08:00
和防爬虫一个道理, token 放一部分到前端去生成,同时函数加密,攻击者只有自己实现一遍 token 生成函数和在服务器上跑 JS 两种选择,成本都不小

不过我还是更倾向于 Nginx 限制高并发,结合防火墙直接 ban 掉高并发的 IP 。毕竟 CC 的 IP 一般不会太多,有大量 IP 资源的估计就直接 D 了
brance
2016-03-02 14:06:08 +08:00
666
AlexaZhou
2016-03-02 14:17:26 +08:00
@Strikeactor

非常赞同。

Nginx 限制并发也是一种很好的防御方式,实际上我倾向多种防御方式结合使用,单一的防御方式总有被攻击者绕过的可能性,混合策略就很难绕过,防御效果会比较好

PS :后续也打算在 VeryNginx 中加入根据请求频次进行屏蔽的防御方式
x14oL
2016-03-02 14:21:59 +08:00
@AlexaZhou python 大法好,写一个多进程异步加代理的 cc 工具其实成本不高的。
AlexaZhou
2016-03-02 14:35:09 +08:00
@x14oL

如果自己写一个工具,还需要实现:

1 ,能通过多个代理服务器来发起请求,不然单 IP 很容易被封掉
2 ,对于通过 JavaScript 来设置 cookies 的,需要外挂一个 js 的执行环境,或者读懂 js 的算法,并在 Python 里实现一次

总之成本还是不低
AlexaZhou
2016-03-02 14:35:39 +08:00
@x14oL

ps :我也是 Python 党
Yamade
2016-03-02 14:42:36 +08:00
我有一个问题:如果 VeryNginx 前面套了一个 cdn 的话,然后攻击者强制使用清除缓存的头,那么 VeryNginx 是不是把 cdn 的节点拦截了?
lhbc
2016-03-02 14:52:11 +08:00
@Yamade 这种方式不适合跑在 CDN 后面
AlexaZhou
2016-03-02 14:58:51 +08:00
@Yamade

会,这种浏览器行为检测会无差别的拦截非浏览器流量, cdn 应该也会被拦截到

如果在有 CDN 的情况下使用这种防御方式,应该需要在逻辑中加入专门的规则来放过来自 CDN 的请求

一种方式是由请求路径来判断,一般来说放在 CDN 的是静态文件,而针对静态文件作 CC 攻击是没有太大意义的,所以可以判断如果是静态文件的路径,就不进行这个检测。此外还可以根据 IP 或者 CDN 服务器特有的请求头(如果有的话)来判断

VeryNginx 的话本身支持定义复合规则来匹配请求,所以简单配置就可以做到这一点,并不需要另外编写代码

最后就是使用强制清除缓存的 Http 请求头,并不一定能使 CDN 服务器发出回源请求吧?
Slienc7
2016-03-02 15:05:02 +08:00
很久之前就这么做了,不过我是用来防止蜘蛛的...
AlexaZhou
2016-03-02 16:10:20 +08:00
@xgowex

😓,可怜的蜘蛛就掉坑里爬不出来了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/260392

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX