网站防止CC攻击的方法,CC攻击原理及防范方法

网站防止CC攻击的方法,CC攻击原理及防范方法,第1张

网站防止CC攻击的方法,CC攻击原理及防范方法

一、CC攻击原理:
CC攻击的原理是攻击者控制一些主机向对方服务器连续发送大量数据包,导致服务器资源耗尽直至崩溃。CC主要用于消耗服务器资源。大家都有这样的经历:当一个网页被大量人访问时,打开网页很慢。CC就是模拟多个用户(有多少用户就有多少线程)不断访问需要大量数据 *** 作(也就是大量CPU时间)的页面,造成服务器资源的浪费。CPU长时间处于100%,总是有无穷无尽的连接,直到网络拥塞,正常访问暂停。

二。CC攻击的类型:
CC攻击有三种,直接攻击、代理攻击和僵尸网络攻击。直接攻击主要针对存在重要缺陷的WEB应用。一般来说,这种情况只在编程有问题的时候才会发生,这种情况比较少见。僵尸网络攻击有点类似于DDOS攻击,从WEB应用层面无法防御。所以代理攻击就是CC攻击者通常 *** 作一批代理服务器,比如说100个代理,然后每个代理同时发出10个请求。这样,如果WEB服务器同时收到1,000个并发请求,它会在发送请求后立即断开与代理的连接。避免代理返回的数据阻塞自己的带宽,这样它就不能发起第二个请求。此时,WEB服务器将对响应这些请求的进程进行排队,数据库服务也是如此。因此,正常的请求将在队列的后面处理。就像你去食堂吃饭,一般排队的人不到十个,今天前面有一千人,所以轮到你的几率很小。此时页面打开会极其缓慢或者空白。

三。CC攻击和DDoS攻击的区别
1)什么是DDOS攻击?

DDoS攻击是分布式拒绝服务攻击,DDoS攻击是一种基于传统DoS攻击的攻击。单一的DoS攻击通常是一对一的。随着计算机和网络技术的发展,DoS攻击的难度越来越大。于是DDoS攻击应运而生,它的原理很简单:计算机和网络的处理能力提高了10倍,用攻击飞机攻击已经不行了。然后DDoS就是用更多的傀儡机发动攻击,比以前更大规模的攻击受害者。常用的DDoS软件有:LOIC。

这里补充两点:第一,DDOS攻击不仅可以攻击电脑,也可以攻击路由器,因为路由器是一种特殊类型的电脑;第二,网速决定了攻击的好与快。比如你在网速有限的环境下,他们的攻击效果不明显,但是网速快更有效。

2)什么是CC攻击?
3)两者的区别
DDoS是针对IP的攻击,而CC攻击的是服务器资源。

'防止CC攻击 DimCC_Info(4),strInfo,strTemp IfSession("CC_Info")=""Then CC_Info(0)="cclog.txt"'日志文件名 CC_Info(1)=Request.ServerVariables("HTTP_X_FORWARDED_FOR") CC_Info(2)=Request.ServerVariables("REMOTE_ADDR") CC_Info(3)=4'N秒内禁止刷新当前页面 CC_Info(4)="badip.txt"'IP黑名单文件名 Session("CC_Info")=CC_Info(0)&"|"&CC_Info(1)&"|"&CC_Info(2)&"|"&CC_Info(3)&"|"&CC_Info(4) Else strInfo=Split(Session("CC_Info"),"|") CC_Info(0)=strInfo(0) CC_Info(1)=strInfo(1) CC_Info(2)=strInfo(2) CC_Info(3)=strInfo(3) CC_Info(4)=strInfo(4) EndIf ConstchkRefresh=1'0关闭防刷新 ConstchkProxy=1'0关闭代理验证 ConstchkBadIP=1'0关闭IP黑名单 IfSession("BadIP")=""Then strInfo=ReadFile(CC_Info(4)) IfstrInfo=""ThenstrInfo="williamlong.info" Session("BadIP")=strInfo Else strInfo=Session("BadIP") EndIf '/*第一层判断,N秒内禁止刷新*/ IfchkRefresh=1Then IfSession("RefreshTime")=""Then Session("RefreshTime")=Now() Else IfDateDiff("s",Session("RefreshTime"),Now())<CInt(CC_Info(3))Then SaveLogCC_Info(0),CC_Info(1)&"["&CC_Info(2)&"]"&Now()&vbCrLf Response.Write("系统繁忙,请稍候再试!错误代码001") Response.End() Else Session("RefreshTime")=Now() EndIf EndIf EndIf '/*第二层判断,代理禁止查看*/ IfchkProxy=1Then IfCC_Info(1)<>""Then IfInStr(strInfo,CC_Info(1))=0Then strTemp=CC_Info(1)&vbCrLf IfInStr(strInfo,CC_Info(2))=0Then strTemp=strTemp&"["&CC_Info(2)&"]"&vbCrLf EndIf SaveLogCC_Info(4),strTemp strInfo=strInfo&strTemp Session("BadIP")=strInfo EndIf '记录CC攻击日志 SaveLogCC_Info(0),CC_Info(1)&"["&CC_Info(2)&"]"&Now()&vbCrLf Response.Write("系统繁忙,请稍候再试!错误代码002") Response.End() EndIf EndIf '/*第三层判断,IP黑名单禁止查看*/ IfchkBadIP=1Then IfInStr(strInfo,CC_Info(2))>0Then Response.Write("系统繁忙,请稍候再试!错误代码003") Response.End() EndIf EndIf 'ForReading=1,ForWriting=2,ForAppending=8 FunctionSaveLog(filename,filecontent) OnErrorResumeNext Dimfso,thisfile filename=Server.MapPath(filename) Setfso=CreateObject("Scripting.FileSystemObject") IfErr<>0Then Response.Write("写入文件"&filename&"失败,可能您的系统不支持FSO!") Response.End() EndIf Setthisfile=fso.OpenTextFile(filename,8,True) thisfile.write(filecontent) thisfile.Close Setfso=Nothing EndFunction FunctionReadFile(filename) OnErrorResumeNext Dimfso,thisfile Setfso=CreateObject("Scripting.FileSystemObject") IfErr<>0Then Response.Write("读取文件"&filename&"失败,可能您的系统不支持FSO!") Response.End() EndIf Setthisfile=fso.OpenTextFile(Server.MapPath(filename),1,True) ReadFile=thisfile.ReadAll thisfile.Close Setthisfile=Nothing Setfso=Nothing EndFunction

Apache服务器现在被广泛使用,有三种简单的方法来保护它。

Mod_reqtimeout:在Apache2.2.15之后,默认情况下已经包含了这个模块,用户可以配置从客户端接收HTTP头和HTTP体的超时和最小速率。如果客户端无法在配置的时间内发送标题或正文数据,服务器将返回408请求超时错误。配置文件如下所示:

<IfModulemod_reqtimeout.c> RequestReadTimeoutheader=20-40,MinRate=500body=20,MinRate=500 </IfModule> mod_qos:Apache的一个服务质量控制模块,用户可配置各种不同粒度的HTTP请求阈值,配置文件如下: 复制代码 <IfModulemod_qos.c> /#handleconnectionsfromupto100000differentIPs QS_ClientEntries100000 /#allowonly50connectionsperIP QS_SrvMaxConnPerIP50 /#limitmaximumnumberofactiveTCPconnectionslimitedto256 MaxClients256 /#disableskeep-alivewhen180(70%)TCPconnectionsareoccupied QS_SrvMaxConnClose180 /#minimumrequest/responsespeed(denyslowclientsblockingtheserver,keepingconnectionsopenwithoutrequestinganything QS_SrvMinDataRate1501200 </IfModule>

Mod_security:一个开放源代码的WAF模块,具有针对慢速攻击保护的特殊规则,配置如下:

SecRuleRESPONSE_STATUS“@streq408”“phase:5,t:none,nolog,pass,setvar:ip.slow_dos_counter=+1,expirevar:ip.slow_dos_counter=60,id:’1234123456′” SecRuleIP:SLOW_DOS_COUNTER“@gt5”“phase:1,t:none,log,drop, msg:’ClientConnectionDroppedduetohighnumberofslowDoSalerts’,id:’1234123457′”

传统的流量清洗设备主要通过阈值的方式来防御CC攻击。在某个时期,某个客户的请求访问量过大,超过了阈值。清洗设备返回验证码或JS码。这种保护的基础是攻击者在肉鸡上使用DDoS工具模拟大量http请求,一般无法解析服务器返回的数据,更不用说JS这样的代码了。所以清理设备在拦截HTTP请求时,会返回一段特殊的JavaScript代码,正常用户的浏览器会处理并正常跳转,不影响使用,而攻击者则会攻击空。

对于慢速攻击,仍然可以通过返回验证码或者JS代码来达到一些效果。但根据慢攻的特点,可以辅助以下保护方式:1。计算循环中的消息数量。在TCP连接中,HTTP请求消息中消息太多或太少都是有问题的。如果一个周期的消息数很少,那么可能是慢攻;如果一个周期内的消息数量非常大,则可能是CC攻击。2.限制HTTP请求头的最大许可时间。超过最大允许时间,如果数据还没有传输,可能是慢攻击。

简单的NginxCC预防方法

实验
Nginx配置

http{ limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s; server{ #限制每ip每秒不超过20个请求,漏桶数burst为5 #brust的意思就是,如果第1秒、2,3,4秒请求为19个, #第5秒的请求为25个是被允许的。 #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。 #nodelay,如果不设置该选项,严格使用平均速率限制请求数, #第1秒25个请求时,5个请求放到第2秒执行, #设置nodelay,25个请求将在第1秒执行。 limit_reqzone=oneburst=1nodelay; } }

上面样本的配置是什么意思?

$binary_remote_addr表示:客户端IP地址
zone表示漏桶的名称
rate表示nginx处理请求的速度
burst表示峰值

具体请参考官方文档:ModuleNGX_http_limit_req_Module。

模拟请求

这里我们需要ApacheBenchmark作为一个小工具来生成请求。

//1用户向服务器发送100s的请求。

ab-t100-c1-vvvexample.com

Nginx配置示例1

http{ limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s; server{ limit_reqzone=oneburst=1nodelay; } }

Ab测试结果如下:

成功的数据请求数失败的请求数每秒成功的请求数
110019438101.1950.98
210017651100.6550.99
39725733410126791100.0001
5999

Nginx上上述失败请求生成的错误日志如下所示。

2015/05/0912:48:57[error]6564#0:*2219limitingrequests,excess:1.273byzone"one",client:10.0.2.2,server:example.com,request:"GET/HTTP/1.0",host:"example.com" 2015/05/0912:48:57[error]6564#0:*2220limitingrequests,excess:1.272byzone"one",client:10.0.2.2,server:example.com,request:"GET/HTTP/1.0",host:"example.com" 2015/05/0912:48:57[error]6564#0:*2221limitingrequests,excess:1.271byzone"one",client:10.0.2.2,server:example.com,request:"GET/HTTP/1.0",host:"example.com" 2015/05/0912:48:57[error]6564#0:*2222limitingrequests,excess:1.270byzone"one",client:10.0.2.2,server:example.com,request:"GET/HTTP/1.0",host:"example.com" 2015/05/0912:48:57[error]6564#0:*2223limitingrequests,excess:1.269byzone"one",client:10.0.2.2,server:example.com,request:"GET/HTTP/1.0",host:"example.com" 2015/05/0912:48:57[error]6564#0:*2224limitingrequests,excess:1.268byzone"one",client:10.0.2.2,server:example.com,request:"GET/HTTP/1.0",host:"example.com"

如果是上面ab测试中失败的请求,nginx的limit_req模块会返回503给客户端,浏览器显示这个。

Nginx配置示例2

在配置2中,我将突发增加到10。

http{ limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s; server{ limit_reqzone=oneburst=10nodelay; } }

成功的数据请求数失败的请求数每秒成功的请求数
111019042100.1441.09
21112271101.7141.09
3111184444411116468101.2851.09
51111

Nginx配置示例3

在样本2的基础上,我们去掉了nodelay。

http{ limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s; server{ limit_reqzone=oneburst=10; } }

成功的数据请求数失败的请求数每秒成功的请求数
1960100.2231.09
2980100.2380.97
31000100.7610.99960100.0740.95
5970100.027

从这里的数据可以看出,如果去掉nodelay这个参数,成功请求的次数在100左右,失败请求的次数变成了0。为什么?
当有nodelay参数时,nginx正常情况下会及时处理当前请求,并向客户端回复数据,但如果超过limit_req_module的限制,则会向客户端返回503。
当没有nodelay参数时,nginx正常情况下会及时处理当前请求,并将数据回复给客户端。但是如果超过limit_req_module的限制,这个请求会被缓存“先理解一下就好”,以后再处理,所以不会出现大量失败的请求。
存在的问题

limit_req_module虽然可以在一定程度上防止CC攻击,但是有误杀的概率。国内宽带用户的IP地址已经大量联网,很有可能几百人共用一个IP。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/755376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-30
下一篇 2022-04-30

发表评论

登录后才能评论

评论列表(0条)

保存