很多盆友都知道卡尼金定律。一桶水的更大体积不是由它的最大面积决定的,而是由它的最小面积决定的。服务器也是。服务器的安全系数也是由其最敏感的区域决定的。如果最敏感的区域有多重风险,服务器也会有多重风险。DDOS也是如此。如果你的服务器有一个资源消耗的区域,限制不够,那么马上就会成为别人DDOS的目标。比如SYN-FLOOD,使用的是服务器的半连接,比完全连接消耗更多的资源,而SYN发起方只需要不断分包,根本不需要多少资源。好的DDOS攻击一定是建立在自身资源消耗非常少,导致对方资源消耗非常大的基础上的。否则比如ICMP-FLOOD和UDP-FLOOD必须和别人有一样的网络带宽,对方的服务器就要自己掏钱买资源。效率极低,而且非常容易被别人发现。现在任何一种人都没有基本的用处。
CC攻击的基本原理
CC主要用于攻击网页。大家都有这样的亲身经历,在访问一个社区论坛时,如果社区论坛越大,访问者越多,网页的打开速度就会越慢,对吗?!一般来说,访问的人越多,社区论坛的网页越多,数据库查询越大,被访问的频率越高,占用的服务器资源也就越可观。现在,明白为什么很多空服务商说人不用提交社区论坛,在线聊天室等项目了吧。
静态网页不需要服务器有多少资源。甚至可以说可以马上从运行内存中读取,但是社区论坛就不一样了。我觉得一个帖子,系统软件一定要去数据库查询,告诉我有没有看帖子的管理权限。如果有,输入并阅读帖子的内容,并显示信息——至少有两个数据库查询访问过这里。如果数据库查询量是200MB,那么系统大概需要在这里的200MB数据信息室空中进行搜索。它必须占用多少CPU资源和时间?如果我搜索一个关键词,那么时间会更加充裕,因为之前的搜索可以限制在一个很小的范围内,比如用户的权限只查看客户列表,帖子内容只查看帖子列表,找到了就可以立即终止搜索,搜索无疑会对所有数据信息进行一次解析,这需要花费大量的时间。
CC充分利用了这个特性,模拟几个客户端(有多少个客户端就有多少个进程)不断访问(访问这些需要大量数据和信息的网页,也就是大量的CPU时间)。很多盆友问,为什么要申请代理?因为代理可以合理地隐藏他们的真实身份,他们也可以避开所有的服务器防火墙。因为大部分的服务器防火墙都会检查高并发的TCP/IP连接数,如果超过一定的数量和一定的频率,就会被认为是连接泛滥。代理攻击的应用也可以很好的维护连接。你在这里推数据信息,代理给你发送到对方服务器,你就可以立刻断开。代理会继续保持与对方的连接(我理解有人用2000个代理造成35万高并发连接)。
很多盆友我都不太能认识。让我来描述一下。我们假设服务器A对Search.asp的求解时间一定是0.01S(线程同步只是分时,对结果没有坏处)。换句话说,他可以保证一秒钟一百个客户端的搜索请求,服务器允许更大的60s的连接时间。然后,我们使用CC模拟来模拟120个客户端的高并发连接。一分钟后,服务器的请求是7200次,解决了6000次,那么就剩下1200个高并发连接数。有盆友想说:失联!输了!但是问题服务器是按照先到先得的顺序丢的,这1200是在最后10秒进行的。想甩掉他们吗?!现在还早。经过计算,当服务器满了,开始失去连接时,应该有7200个高并发连接数按顺序存储。然后服务器刚开始120/s就失去连接,大家都是120/s开始连接,服务器总是有无穷无尽的连接,服务器的CPU是100%并且维持很长时间。然后,失去连接的60秒服务器无法解决,新的连接也无法解决。
蝴蝶:我们假设服务器解决搜索问题只需要0.01S,也就是10ms(你可以去每一个有开放时间的社区论坛看看这个速率),每个人的申请流程也只有120。很多服务器的失联时间远远超过60S,每个人的申请流程也远远超过120。你能想象这有多恐怖吗?此外,如果远程服务器被推送并断开连接,则连接的维护由代理完成。而当服务器收到SQL请求时,毫无疑问会进入序列,不管连接是否已经断开,而服务器是高并发的,所以没有按顺序实现,导致大量请求进入运行内存,给服务器造成了更大的压力。
自然CC也可以这样攻击FTP,也可以完成TCP-FLOOD,经过测试都是合理的。
预防模式
说完了进攻的基本原理,大家无疑会问,那怎么防守呢?我不知道如何阻止服务器防火墙的应用,除非你完全屏蔽网页的访问。我的方式是根据网页的写法来完成答辩。
1.应用Cookie验证。目前Penyou说CC中也允许Cookie,但是这里的Cookie适用于所有连接,所以开启IPCookie验证是可以的。
2.使用进程。这种区分比Cookie更方便。既能通过IP验证,又能阻止更新。它可以区分网页中的更新,但如果是更新就不允许访问,也不赋予更新标记。给出一些示例性编码,会话:
1然后
会话("刷新")=会话("刷新")1
Response.redirect"index.asp"
结束条件
那样的话,客户的第一次访问会使Refresh=1,第二次访问,一切正常,第三次不允许他访问,就认为是更新了。可以再加一个timemain参数,让允许访问的时间,从而限制耗时的网页访问,对所有正常客户基本没有伤害。
3.根据代理推送的HTTP_X_FORWARDED_FOR参数辨别应用代理攻击设备的真实IP,完全可以找到发起攻击的人。自然不是所有代理服务器都推,但是很多代理都推这个主参数。详细编码:
那个会转换成CCLog.txt,它的记录文件格式是:realIP[proxyIP]time。你看看哪个真实IP频繁出现,就知道谁在攻击了。这段代码被制作成一个Conn.asp文件,而不是将这些文件连接到数据库查询,这样所有的数据库查询都可以连接到这个文件,然后攻击者就可以立即被发现。
4.还有一种方法就是把必须统计数据的句子放在重定向之后,让对方必须先访问一个有区分的网页,然后重定向过去。
5.在有多个工作站的服务器上,严格限制每个工作站允许的IP连接数和CPU使用时间是一种非常合理的方式。
CC的防御要从编码开始。其实一个好的网页编码要讲究这种货,SQL也介绍了。它不仅是一个入侵工具,也是一个DDOS空的不足,所以大家在编码的时候要注意。比如一个服务器发起了5000行CC攻击,但是并没有反映出什么,因为它所有的数据库访问和查询请求在会话中都必须有一个任意的主参数,都是静态网页,没有实际作用。突然发现它有一个联系外部服务器的请求,要花很长时间,没有验证。当我开始800行攻击时,服务器立即过载。
编码层的防御必须一点一点的学习。一个不正确的脚本编码会对所有的站甚至所有的服务器造成伤害。小心点!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)