WEB攻击---一招致敌(一只猫累死一个Apache)
elli 2002-04-12 09:55:01 接触Apache已经一年多了,读过它绝大部分源代码,不得不佩服老外设计之巧妙。
Apache主体部分只是个框架,它在各个阶段分别去调各模块对应的函数,整个结构层次分明,其设计可称经典之作。还有其它一些方法也值我们借鉴,比如用pool来管理内存和文件。呵呵,建议大家有空读读。
好归好,BUG是难免的。今天,我想谈如何用一根电话线累死一个Apache。这本来是我无意中想到的,可以说是原创吧,呵呵,如果与别人雷同,纯属偶然,如果没有雷同呢,转载时请注明出处及作者(elli)。
闲话少说,一个Web服务器可以是通过100M的带宽与外面连接的。要想用一只猫就想搞死它,可能吗?呵呵,别急,古人云:四两拨千斤。等着瞧,让我先说说Apache的工作流程:
以Apache 13.XX为例,在WIN32下,它是多线程工作的,而在Linux下,它是多进程工作的。为了方便起见,只以Linux为例,两者都差不多。
0) 浏览器向Apache建立连接。
1) Apache的某个空闲进程得到连接。
2) Apache等待浏览器发请求头。
3) 浏览器向Apache发送请求。
4) Apache处理请求。
5) Apache响应请求。
6) 非Keep-Alive的请求,到些结束,否则转到2。
如果按照常规的浏览器和Web服务器间的交互,想累死一个Web服务器,那成本可大了。让我们仔细看看,不难发现,每个一个浏览器的请求都会有一个Apache的进程来处理。呵呵,那是不是我用1024个浏览器就可以把Apache累爬下呢?在稍好一点的PC机上运行的Apache,每秒钟都可以响应上千个请求。这样做的话,没有把Apache累爬下,你自己可能都受不了。
常言说,有力使力,无力用巧。我们不用真的去累它,拖住它就行。我先创建一个连接到,它会占用Apache一个进程,但我并不急于把请求发给它,但是Apache却不得不等待,也就是说这个进程并不能干活。哈,有了,我建上1024个连接!有Apache同时起1024个进程的吗?然后我用select函数等待,只有一个连接被关掉,我马上再建一个。就这么简单!
另个一方面,如果Apache那边关掉这个连接,TIME_WAIT将发生在服务器那边,它将不得不等上2*MSL的时间后,它才能重用这个Socket。只要你不断的连接,即使Apache关掉这个连接,最终也可能导致它没有socket可用了。
我只是在局域网内做过实验,4秒后,Apache停止响应!
*请大家注意*
我并不是想教大家如何去掉一个网站,我也不是一个Hacker。我Post这几段话在这里,目的有两个:一是用Apache的同志最好防到这一点一下(不过很难哟)。另外,我现参与一个Server的设计,TIME_WAIT的问题搞得我头都大了, 有谁有办法能解决TIME_WAIT的问题的?
如果谁想做这种测试,又不想自己去写代码的,可以留下您的EMAIL。不过请注意,一切后果自负!!!哈哈,给分的先发。