类型:服务器面积大小:62.3M语言:中文评分:5.0标签:立即下载。首先,我来说说这个被攻击网站的大致部署。这个网站主要是nginx mysql php,有两个服务器,分别是web和数据库。网络只开放80个端口。操作系统是centos,而数据库服务器在内部网中。攻击者的手段其实很简单。使用webbench网站压力测试工具向服务器发送大量请求,在发送每一个请求之前,数据库都会进行对应,然后读取内容并最终显示出来,导致数据库和web之间的数据交换量很大,甚至导致mysql达到最大连接数,请求被拒绝,攻击者有很多时间,所以他不停地更换浮动ip,所以直接用防火墙屏蔽ip是没有意义的。
一开始,我做的是用php获取攻击者的代理头,判断webbench是否来访。如果是死,真的有效,数据库也不会超过限制。但是对方频繁发送请求,导致网络带宽被严重消耗。好像还得考虑其他方法,最后想出了一个解决方案,实际测试发现是可行的,就分享给大家了。其实我练习的原理很简单。使用php获取用户代理头来判断是否是webbench源码。如果是,在服务器上写一个shell文件。这个文件的内容就是封杀IP的规则。
然后用chmod函数修改这个文件,使其可以执行,然后用cron服务读取这个文件执行,并阻塞ip。整个过程完全自动化,无需人工干预。另外给我发邮件通知我一个倒霉的人在封杀的时候被杀了,那就行了。
具体实现代码如下:
IF(isSet($ _ SERVER[' HTTP _ USER _ AGENT '])和Trim($ _ SERVER[' HTTP _ USER _ AGENT '])!='') {
$ _ SERVER[' HTTP _ USER _ AGENT ']=StRTLower($ _ SERVER[' HTTP _ USER _ AGENT ']);
IF(StriStr($ _ SERVER[' HTTP _ USER _ AGENT '],' webbench ')!==False){ 0
$ p='/home/www/web bench . sh ';
$ _ SERVER[' REMOTE _ ADDR ']=ISset($ _ SERVER[' REMOTE _ ADDR '])?$ _ SERVER[' REMOTE _ ADDR ']: ' unknow ';
span style=' color: # ff0000'File_Put_Contents($p,' #!/bin/bash nip tables-I INPUT-s { $ _ SERVER[' REMOTE _ ADDR ']}-j DROP;n ',LOCK _ EX);
/span Chmod(p,0755美元);
chown($p,' www ');
span style=' color: # ff0000'函数sMail($to,$tit,$ msg){ 0
IF(Filter_var($to,FILTER _ VALIDATE _ EMail)=' '){ 0
ThrownewException('错误的电子邮件地址!');
}
$tit='=?UTF 8号?“b,”. Base64_Encode($tit)。=';
$msg=str_replace('n . ',' n . ',$ msg);//如果在一行的开头找到句点,Windows将删除该句点。要避免此问题,请将单个周期替换为两个周期。
Return Mail($to,$tit,$msg,' from : no-reply @ ADM . boss ADM.com . tw '。n。内容类型:文本/html;charset=utf-8 ');
}
Smail ('see7di @ gmail.com ','[webbench再次开始t]!',日期(' Y-m-d H:i:s ',时间())。{ $ _ SERVER[' REMOTE _ ADDR ']} ');/span
标题(' location :http://127 . 0 . 0 . 1 ');
die();
}
}
后来我又做了一个调整,把邮件部分写入shell文件,不再用php发送邮件,因为这样会把你的邮箱炸开,把上面的代码修改成:
IF(isSet($ _ SERVER[' HTTP _ USER _ AGENT '])和Trim($ _ SERVER[' HTTP _ USER _ AGENT '])!='') {
$ _ SERVER[' HTTP _ USER _ AGENT ']=StRTLower($ _ SERVER[' HTTP _ USER _ AGENT ']);
IF(StriStr($ _ SERVER[' HTTP _ USER _ AGENT '],' webbench ')!==False){ 0
$ p='/home/www/web bench . sh ';
$ _ SERVER[' REMOTE _ ADDR ']=ISset($ _ SERVER[' REMOTE _ ADDR '])?$ _ SERVER[' REMOTE _ ADDR ']: ' unknow ';
File_Put_Contents($p,' #!/bin/bash nip tables-I INPUT-s { $ _ SERVER[' REMOTE _ ADDR ']}-j DROP; ne CHO ' { $ _ SERVER[' REMOTE _ ADDR ']}-` date ` ' | mail-s ' webbinch-www . 7di . net ' see 7di @ Gmail.com n ',LOCK _ EX);
chmod(p,0755美元);
chown($p,' www ');
标题(' location :http://127 . 0 . 0 . 1 ');
die();
}
}