找回密码
 注册
搜索
查看: 4886|回复: 0

[转载]通过对php一些服务器端特性的配置加强php的安全

[复制链接]
发表于 2004-5-31 00:23:03 | 显示全部楼层 |阅读模式
发布日期:2001-11-271 W: ~* \$ }6 R/ r) w( V
文章内容:
+ u0 \; k" i" T( v--------------------------------------------------------------------------------( q5 a5 X) O* w( ?" ~

/ T  k: s8 y8 d作者:san(小许) san@nsfocus.com
. V/ g, F3 u: M$ j0 ^2 Z% [
! p1 y- E( i  [% h6 m2 U1 e--------------------------------------------------------------------------------
; k% P$ E( N9 ^% l* ?  T/ s4 i2 Q; }! d
前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题,以
7 |6 v) d# G( c) O及如何通过应用程序漏洞突破系统,这篇文章我们来通过对php的一些服务器端特性来进行配. y7 S% K& H! \1 |, I. ?  `
置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题,对用户输入进行严格的1 \& h5 Q6 |8 R6 F( H
过滤,但是常在岸边走哪有不湿鞋,吃烧饼哪有不掉芝麻,人有失蹄马有失手,连著名的
8 R1 N. Q' X; gphpnuke、phpMyAdmin等程序都出现过很严重的问题,更何况象我等小混混写的脚本。所以现
" D  B. e3 }$ a6 m8 j( k$ E3 ]在我们假设php脚本已经出现严重问题,比如象前一阵子phpnuke的可以上传php脚本的大问题8 ^, C0 z/ \( R# @4 h' [
了,我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。 % v; r( w6 |8 {

/ x: ~) \; a  e: T6 A. w. Q& L: }* p. g! y6 E" ]3 ~) d' F# j
1、编译的时候注意补上已知的漏洞 . {; z# K" m! ]& \" I/ k# F- a5 a) Z

7 r4 i9 c8 M+ E( `0 w从4.0.5开始,php的mail函数加入了第五个参数,但它没有好好过滤,使得php应用程序能突, [( u! |, j7 C
破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源9 a; q; ]  `1 t
码包里ext/standard/mail.c文件,禁止mail函数的第五参数或过滤shell字符。在mail.c文件
+ F$ L9 G7 ?4 f4 v的第152行,也就是下面这行: 3 i6 {/ k5 u& Y' B$ x( T

% |# c: a) r* m3 vif (extra_cmd != NULL) { 8 }7 d( ~1 L/ u- K3 S$ f" S: G; \

' @  v# U, Y  N$ R! ]8 i2 i后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php
2 J1 c' m' R- i8 S; W& p3 U3 u那么我们就修补了这个漏洞。 / I1 R! E  s+ A' Q4 i" S
( z0 c# ^) V0 G9 G! _4 t0 P

6 H9 F' _3 `  D6 i9 g# t# m2、修改php.ini配置文件 $ J% Z3 L( U5 G- L
% b& ^; D' Z" U7 ^' i# y# p3 d
以php发行版的php.ini-dist为蓝本进行修改。 ; L  x* Y) v9 e, @0 f$ J

) E; R7 X8 N0 C5 N' W& ^1)Error handling and logging 6 P2 r) O! H# C+ o: R( S
在Error handling and logging部分可以做一些设定。先找到:
: B; W0 q2 j/ y# N* {$ Cdisplay_errors = On 2 X# H% Q+ V& I% z( V

& `# i8 w  E" ?# T+ D) @5 _php缺省是打开错误信息显示的,我们把它改为:
# D8 t0 t6 F% L( Z7 E8 l9 N" R& o
display_errors = Off 6 S  b- g6 x+ `% h

0 L# d) {4 H& [" m/ o- c# ?关闭错误显示后,php函数执行错误的信息将不会再显示给用户,这样能在一定程度上防止攻8 {! ]: a4 s# G. ]9 i, d9 M
击者从错误信息得知脚本的物理位置,以及一些其它有用的信息,起码给攻击者的黑箱检测造
$ t* M  l6 Q6 y  ]5 o8 Y成一定的障碍。这些错误信息可能对我们自己有用,可以让它写到指定文件中去,那么修改以
4 ]. b) W8 m' p7 {9 t7 h: p下: - o% p2 U9 i5 y# Q/ i4 S
% ^5 r2 q0 w( }( D
log_errors = Off
1 p+ Q: v! g7 i
. n$ B! d7 J0 f& `0 R改为:
/ c) L9 m1 U) Y& U4 ]log_errors = On
: s  Y  F. `8 |* {) Q# C8 |
) F3 k/ T' x! z! S以及指定文件,找到下面这行: 6 v& t& Y, F  n/ ?7 y+ z% z8 b

4 \( L& H( K3 `  U9 i% N7 i;error_log = filename
. d6 t1 V$ p/ ]9 h9 `) r: m( M8 N, V4 w/ K! B- i4 ?
去掉前面的;注释,把filename改为指定文件,如/usr/local/apache/logs/php_error.log
+ B" {- d* R6 T/ g  ?& `9 z' L1 O9 k9 `( f
error_log = /usr/local/apache/logs/php_error.log - `5 l6 n; ?# n( d8 o4 \: D
  l) X3 u3 T. `& X) K8 ?
这样所有的错误都会写到php_error.log文件里。 " u% I% ]1 ]6 v* I  w/ B8 }

8 ^4 l3 r# K7 U) t2)Safe Mode
( {6 o& b; F  p
. U( D/ l$ a# u" k, U0 aphp的safe_mode功能对很多函数进行了限制或禁用了,能在很大程度解决php的安全问题。在! p" D6 J; b  o( k# f; Z
Safe Mode部分找到:
1 y8 K3 Y7 a2 r% o% ?0 P) v& M  A( _4 j+ h) \' O
safe_mode = Off
- ~# o1 ^' X6 ]- m% @) F1 t- ^" a3 l
改为:
' n& _" O3 e' p5 d
6 a  x& E$ `" _) Gsafe_mode = On : u# m( W. K9 u2 _" A; f2 Q
$ J' y- X: e' o2 G. k; K+ U7 t6 R
这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和``被禁止,其它
: h$ a4 q8 W2 t8 M的一些执行函数如:exec(), system(), passthru(), popen()将被限制只能执行
1 n. A: B/ Q9 H8 Z6 d, {* W, C5 wsafe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序,找到以下: # t& s7 ~% M& \3 s

6 C% {! i1 O0 \/ |3 g6 ^2 n9 `+ @# Dsafe_mode_exec_dir =
2 t2 G& A6 u+ N0 C$ b4 ]2 W+ n! x$ ]( T
指定要执行的程序的路径,如: 6 u4 d& C' y: ~# B+ G) s* k

0 [# K: g# W9 F0 R/ H" ~safe_mode_exec_dir = /usr/local/php/exec ) i( f8 }  _7 N2 e
: S" C3 f% J! P# Q' D) N4 Z0 @9 W! R
然后把要用的程序拷到/usr/local/php/exec目录下,这样,象上面的被限制的函数还能执行1 k! G& e/ Y; i) A# h: `% C4 c
该目录里的程序。
) c+ M/ {3 B4 I+ v, e! k; ~$ S8 o% f
关于安全模式下受限函数的详细信息请查看php主站的说明: 7 s, f7 a3 d# K2 r( \5 T7 X
http://www.php.net/manual/en/features.safe-mode.php 7 |+ K# B2 T. g" i. y& A, S( ?

- a2 S1 s6 P6 E# }8 C0 b/ y3)disable_functions : B4 R4 W: T* R# ?3 [* Z3 Z
- A$ f+ J5 c+ i# {2 v
如果你对一些函数的危害性不太清楚,而且也没有使用,索性把这些函数禁止了。找到下面这  f4 W# G8 S  b# n) L
行:
; c5 [9 @  t2 _# T% n; I
& d- Y/ n/ f+ n2 ?* {, tdisable_functions = % S* H4 I0 i4 g; H, J8 ^

3 O0 h4 M+ ]. ?0 F在”=“后面加上要禁止的函数,多个函数用”,“隔开。
4 o* \4 a# V0 J7 q
7 A  ^' ~$ n' W6 \, W" r# w6 l
3、修改httpd.conf : ?* r+ J3 l4 k, f/ ]
2 L, R! O1 Y0 D5 C( N: }! n
如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作
4 P% U/ n4 i( |, w$ E/ Q路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行:
- @& R& {1 t: i/ Q' m3 u
; w  j: @  B/ b8 \9 r' J<Directory /usr/local/apache/htdocs>
9 g+ y6 X$ G4 N1 u# v4 Cphp_admin_value open_basedir /usr/local/apache/htdocs
( }0 ~2 G0 K( ?+ f( I</Directory>
7 k7 F4 F- l, o  ~& S/ Y& Y- \; r) G
这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打( ]6 x5 f  K; R( T6 \# P; P
开的话会提示这样的错误: ' q- G& q$ Y. J: r. T

. M9 |; Z0 \7 j. n3 X) xWarning: open_basedir restriction in effect. File is in wrong directory in
2 A8 I. D4 l, A/usr/local/apache/htdocs/open.php on line 4
2 H0 l/ r# k' M& ^( O+ g7 G' e' P9 L2 e- L* U) L9 l( m0 Z
等等。
+ Z! V* r2 {) j% U; k* S. j9 z- W: y* z- ?3 O8 {
- C. L: K5 s8 X  w! s1 u" `; d8 s) U
4、对php代码进行编译
6 T( C/ V7 h5 J% S% U+ E) I: Q! a" G/ b, m$ w
Zend对php的贡献很大,php4的引擎就是用Zend的,而且它还开发了ZendOptimizer和' [3 M' w. V; R$ M% E2 z; B# {
ZendEncode等许多php的加强组件。优化器ZendOptimizer只需在http://www.zend.com注册就
/ q; q3 n' o+ d0 l. X可以免费得到,下面几个是用于4.0.5和4.0.6的ZendOptimizer,文件名分别对于各自的系统' w5 d% b/ a3 m" G$ ^3 f) F1 V
1 g* O( C, ]% Q
5 Z7 y1 T% l: P& s+ ^
ZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz 6 k0 P: c3 D$ T3 X1 ^4 r  g
ZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz
; ?0 H0 W* c6 g7 p$ D% }& OZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz 5 s5 `6 X& m4 o' r4 U
ZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip   J# {( l+ f6 P. }

9 J% b8 ]' X7 D+ F优化器的安装非常方便,包里面都有详细的说明。以UNIX版本的为例,看清操作系统,把包里8 Z% _% ~( z( F$ \4 f! ]- e
的ZendOptimizer.so文件解压到一个目录,假设是/usr/local/lib下,在php.ini里加上两句" b  k  _! E' N4 I/ w
# {; f0 ~2 N+ T; B

3 t, p3 }0 R3 u* h& g) bzend_optimizer.optimization_level=15
2 F- W6 l( e! k: A8 rzend_extension="/usr/local/lib/ZendOptimizer.so" % c9 y+ P9 }1 @
+ C8 ]: f5 I; M- F0 h) F
就可以了。用phpinfo()看到Zend图标左边有下面文字:
6 X2 O: I$ e/ }  ^2 x  \
' [4 c+ ~: b& dwith Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies 2 T5 }0 o; B! A0 A) a$ p
/ V& W7 L& s4 [! t  A4 @, X
那么,优化器已经挂接成功了。 $ s8 k: J$ C8 V( t( D, l1 h
, i6 V& U6 k6 K; `
但是编译器ZendEncode并不是免费的,这里提供给大家一个http://www.PHPease.com的马勇设
% S5 U; U; q$ Z9 R4 F计的编译器外壳,如果用于商业目的,请与http://www.zend.com联系取得许可协议。 * x6 I- h- X: U' f! f

% K+ W& c; p1 d  T) v4 E- @4 rphp脚本编译后,脚本的执行速度增加不少,脚本文件只能看到一堆乱码,这将阻止攻击者进
, D# Z6 s# V! {& L8 ^. |一步分析服务器上的脚本程序,而且原先在php脚本里以明文存储的口令也得到了保密,如8 ?! ^3 Q2 ]. L' A$ @+ e3 |! Y
mysql的口令。不过在服务器端改脚本就比较麻烦了,还是本地改好再上传吧。
, x( o7 J: ?3 A6 p3 C; W- w: e
0 V' p* o9 k) R" ^8 L6 m' g' |# d
  y7 r/ a  g5 b( o5、文件及目录的权限设置
9 e9 t2 |% s+ J$ C$ X% q
' \2 R$ J# Z8 X) |% @web目录里除了上传目录,其它的目录和文件的权限一定不能让nobody用户有写权限。否则,
8 s2 b- D7 \8 I( V% K1 c5 B8 s; G* [攻击者可以修改主页文件,所以web目录的权限一定要设置好。 % W: \% z! c, }- ]6 f
, d0 ?; `# F" p. G0 i
还有,php脚本的属主千万不能是root,因为safe_mode下读文件的函数被限制成被读文件的属: q' d7 R" C! ^; ~+ F& n
主必须和当前执行脚本的属主是一样才能被读,否则如果错误显示打开的话会显示诸如以下的
8 ^9 J/ H  A. j错误:
4 _1 x$ m2 N* i) |9 T
6 ]0 [  e0 v& b# u) s7 eWarning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
4 G4 ~, k6 ^; o8 ~# q8 y: O; kallowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php ' f) s6 m4 L2 C4 k- L4 B8 K3 m
on line 3
/ T0 B' E1 I  f3 R& Y% I1 ]! K1 a' ]6 w0 ~0 t& r
这样我们能防止许多系统文件被读,比如:/etc/passwd等。 - r& r- S8 ]: D5 |/ ]
上传目录和上传脚本的属主也要设成一样,否则会出现错误的,在safe_mode下这些要注意。
% I+ o$ Z2 u3 {! u7 t2 z- p3 r' S, D0 s, g" |7 L0 {+ H$ q
1 h5 b3 H% k9 U6 {+ x" u+ ~+ w
6、mysql的启动权限设置
% `( S3 H! l# V0 F, w, P$ t( S* I" `+ C: v2 A( a6 Y$ e' z, ]# k% m
mysql要注意的是不要用root来启动,最好另外建一个mysqladm用户。可以在/etc/rc.local等5 i  {. U3 O) ~* e2 t: {
系统启动脚本里加上一句:
8 l1 c; W! z% I/ u- {; W  U6 t
su mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start" 0 D" q4 p9 u. Q3 u* H8 \9 N" K
1 P! b: }* y; Q0 n
这样系统重启后,也会自动用mysqladmin用户启动mysql进程。   |! G8 ]1 Z% \! r9 y

3 w4 g2 y  c+ s$ W$ w8 m
' L5 ^% Z2 E( z1 _7、日志文件及上传目录的审核及
0 @7 E* b/ L( m# q9 a+ P! Q  i+ E1 I: s' @, u3 L. f" v) M' ?$ M
查看日志和人的惰性有很大关系,要从那么大的日志文件里查找攻击痕迹有些大海捞针,而且
/ ]3 T( j- Y/ [2 g# i0 ]8 W* P& w也未必有。web上传的目录里的文件,也应该经常检查,也许程序有问题,用户传上了一些非
( O  {: X/ u+ c7 H8 Q9 p法的文件,比如执行脚本等。
: E% n7 ]  w$ {- d* r* D) M: d7 ?: S
# {0 a, u5 Q" ?- j+ F( I+ E" P4 x8 u  u" m+ V7 R+ y
8、操作系统自身的补丁
' g9 J7 x) e8 f4 J% |! C5 [7 }; x6 U7 p% A, I. X. |6 \
一样,给系统打已知漏洞的补丁是系统管理员最基本的职责,这也是最后一道防线。 6 F+ \: X3 k) M2 K$ T9 n$ M& K/ ?

8 _7 E) ]7 I' G* Q+ v8 R3 Z6 L6 z9 T: K, b8 i: E, M
经过以上的配置,虽然说不上固若金汤,但是也在相当程度上给攻击者的测试造成很多麻烦,7 W4 `! z& @( z7 |' l' B
即使php脚本程序出现比较严重的漏洞,攻击者也无法造成实际性的破坏。
: y0 U( ]7 A4 {6 X- s如果您还有更古怪,更变态的配置方法,希望能一起分享分享;) 6 o2 r, x' {# C9 I' r5 l' ^) x, Y

8 N$ M, V. o+ H, `/ b5 Y. I5 Z7 p6 G  X( _: S. @
参考资料:
. M# e, z) t, N3 M$ ~6 B3 _' `) NPHP Manual   _0 o6 Y- H% D
http://www.zend.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-6-18 12:29 , Processed in 0.019179 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表