找回密码
 注册
查看: 4980|回复: 0

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

[复制链接]
发表于 2004-5-31 00:23:03 | 显示全部楼层 |阅读模式
发布日期:2001-11-27
- W4 D  d+ Y+ n. c0 j文章内容:4 e) H( G+ t) I1 n
--------------------------------------------------------------------------------. _8 p8 K3 W* E* C% X& f. Y. ]
! \& _% c& t7 _* W1 K3 i
作者:san(小许) san@nsfocus.com
/ Y, h+ S% i# n7 _/ }$ k1 O+ @; J2 c- I: L. ?8 Z4 v6 c, _: l
--------------------------------------------------------------------------------1 E0 V! h9 r9 o' y( f4 x# u
$ w" D7 @# K( Q  f
前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题,以) _; i, z3 Z6 q7 K1 C
及如何通过应用程序漏洞突破系统,这篇文章我们来通过对php的一些服务器端特性来进行配
( o( R% p; j! `; q0 f( i, l5 `) w置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题,对用户输入进行严格的$ r  s6 Z( B6 H
过滤,但是常在岸边走哪有不湿鞋,吃烧饼哪有不掉芝麻,人有失蹄马有失手,连著名的
# `2 S* u1 V( ~. Fphpnuke、phpMyAdmin等程序都出现过很严重的问题,更何况象我等小混混写的脚本。所以现
  R5 E, }! r! Q在我们假设php脚本已经出现严重问题,比如象前一阵子phpnuke的可以上传php脚本的大问题+ H0 Q  R$ d* T  U. T
了,我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。 5 B2 f0 U, F' h  g( }$ q' y7 _
  _* w$ S* C" U
& `( j+ }. e* i( m1 o1 o9 T, n
1、编译的时候注意补上已知的漏洞
* G& {3 |2 q) v2 q: l; r; m
6 K/ u* ^# F$ Z$ Q6 u6 `5 @从4.0.5开始,php的mail函数加入了第五个参数,但它没有好好过滤,使得php应用程序能突5 N! z( J5 _% i& H# Z' ^5 [& d% ]
破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源  q, m) ~1 v8 t9 @6 C5 G% [
码包里ext/standard/mail.c文件,禁止mail函数的第五参数或过滤shell字符。在mail.c文件
, l' ?1 P$ A- {* Y7 r. k+ f& Q的第152行,也就是下面这行:
3 S0 O* c: k" M9 ?, j5 y/ p; ^+ _2 I$ ?3 ^# Q2 |
if (extra_cmd != NULL) {
& m) N: G; h& J2 J8 J/ w  w
( P9 F/ F* W' b9 ?" }后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php
9 |5 R9 K+ U0 J. V' `那么我们就修补了这个漏洞。 " d9 s" R6 j+ M" l
/ C, O/ L# I# {! v

, C# Y$ `  t3 W2、修改php.ini配置文件 & M# Q' ]% S2 m

3 E  k6 f, r' K" t1 m+ ]以php发行版的php.ini-dist为蓝本进行修改。 ) v) H+ y1 }+ f; _; X
: \* }/ Z8 H" f5 D7 q$ z
1)Error handling and logging
/ @% M: J7 _; ^4 S5 ?; h: q在Error handling and logging部分可以做一些设定。先找到:
0 Z! p, z& r3 D7 c& p4 Zdisplay_errors = On " U4 s% @9 T  Y
! q7 J$ r' p% |* a: V5 n" d
php缺省是打开错误信息显示的,我们把它改为: 9 v9 n% x( d8 U6 I

, L& r* ^0 |7 d2 }7 o; Cdisplay_errors = Off
. l- }7 t+ {- M# a$ t  v2 _
# b# M. M) U' q- v  R关闭错误显示后,php函数执行错误的信息将不会再显示给用户,这样能在一定程度上防止攻
+ s" e  s" A, E$ q9 t4 v击者从错误信息得知脚本的物理位置,以及一些其它有用的信息,起码给攻击者的黑箱检测造
6 R# w5 T# S2 X2 a成一定的障碍。这些错误信息可能对我们自己有用,可以让它写到指定文件中去,那么修改以
: p8 K# c' Q" U! w7 ~5 W9 |. D7 X下:
0 `$ ~1 V  s6 Z. e8 e; [7 c2 g
( N: i: i1 B" Clog_errors = Off 1 s+ D/ v$ Z3 y$ j% P0 c

( i  j3 i0 w  V" b/ i改为:
# G/ w, |: t  Q! `: Ilog_errors = On   x0 J  [* C9 _8 E4 M* K4 `! q
% V8 `2 C, [0 x* m7 a) K3 `
以及指定文件,找到下面这行: 2 n/ @* z6 {: [2 J6 n
( R) a, a% Y9 o: r
;error_log = filename
4 T0 Y+ M8 w9 z
0 X( `' a# ~5 N去掉前面的;注释,把filename改为指定文件,如/usr/local/apache/logs/php_error.log ! W& v- f: W2 N" L

4 i  `! Q  Y9 M/ f' m! jerror_log = /usr/local/apache/logs/php_error.log
5 R2 {( p7 x0 M7 E( X7 o5 G0 [9 M5 ^4 \/ q4 D
这样所有的错误都会写到php_error.log文件里。
/ f* W) R/ V, ?' i4 z5 r; B: n; X8 S$ o& p1 E: v
2)Safe Mode 7 g+ k* ~& V- y

9 N) r0 S3 K7 w" G) {  F. j8 ephp的safe_mode功能对很多函数进行了限制或禁用了,能在很大程度解决php的安全问题。在% L7 V4 E0 \* \4 j8 X
Safe Mode部分找到:
' _! L/ o% I; y0 D% G: k; D. E4 Q7 i7 N% q2 {( _
safe_mode = Off $ l$ x+ ?5 M9 k- l; {
0 F& B. M! H# F: Z
改为:
: Q' {5 T; S' {3 o& n- \9 s! L' h" J5 j
safe_mode = On 2 q# m/ L8 W6 b' V1 O/ N7 z' S. F

: i9 g+ ~8 E# p# s+ D这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和``被禁止,其它/ ^, \7 p  j6 F3 T
的一些执行函数如:exec(), system(), passthru(), popen()将被限制只能执行
  g) V: W  N  V  F8 Psafe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序,找到以下: * o) z0 Y9 y* u& E$ M
* E/ v+ _6 H' a# a& u4 H* P
safe_mode_exec_dir = 6 n, u# }7 Y% O% r4 M

  ]2 q/ |- @- m/ p指定要执行的程序的路径,如: $ I6 `( j1 s- @3 L& B
8 ?. f+ C9 p4 C( u( Q
safe_mode_exec_dir = /usr/local/php/exec ) S: K: j- z4 q% v
  b& N8 W. A+ q, A4 Z9 a7 H' r
然后把要用的程序拷到/usr/local/php/exec目录下,这样,象上面的被限制的函数还能执行
# j4 v& u4 T1 C3 E  }5 A, J) c该目录里的程序。
6 z7 D. e5 Z! C& I1 ~0 f
4 B' @" t5 f2 T关于安全模式下受限函数的详细信息请查看php主站的说明: ! B7 e9 T( U) E# Q
http://www.php.net/manual/en/features.safe-mode.php
6 z) \# e/ ]2 ~7 M. j& _( }, ^- k, n  a
3)disable_functions
( T$ ?: W' f+ I$ \: I1 W( d* \  ^4 N  r+ P" a
如果你对一些函数的危害性不太清楚,而且也没有使用,索性把这些函数禁止了。找到下面这
1 B5 z# N2 d  O行:
7 N% |/ j' D$ |  b! |! m) Q3 }& _4 S/ z5 V. J7 r
disable_functions = 0 c! j% A. C2 z3 Z

/ D- T* n0 K! u在”=“后面加上要禁止的函数,多个函数用”,“隔开。 9 i( I0 v( Y, O
# S, l9 F& \' H! j3 {& w' D* y' A1 v
7 L2 U- v0 x, l* Y& b9 V8 W
3、修改httpd.conf - {4 w$ w) d+ ]' G
8 F. S' x9 Q- ~' [$ {0 }9 E& }
如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作' [: T, ^, K2 `, b( E7 m
路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行: ) p& I1 e* Q7 I* R
9 f" _9 v3 H4 g1 X  G( G
<Directory /usr/local/apache/htdocs>
+ c; t' n3 ?) R* B( h- g2 D) C* Nphp_admin_value open_basedir /usr/local/apache/htdocs % o7 W' s7 U4 G3 i8 X2 B4 i
</Directory>   ]6 Z4 g7 r0 ]; k3 _1 g6 M3 k

1 ?) b& B5 C( F6 H% F5 n# {5 T这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打$ v0 l. A' N: {
开的话会提示这样的错误:
- v0 P9 j; j. V. @. w$ _
  t7 ]( E0 y- h) ^: RWarning: open_basedir restriction in effect. File is in wrong directory in
6 C4 K7 S* Q2 T/usr/local/apache/htdocs/open.php on line 4 & c: m+ _4 a1 t

* p9 f7 \, H) V9 ~* ?等等。
5 e/ ]& z# N. H
6 N8 M9 M7 D& K* h+ A7 g$ L- Q! p1 A# G6 T. b2 |- u
4、对php代码进行编译 5 |3 g0 e! |' ?6 C. D7 b. Y, Y

! k# G1 Y! n( Y' k) `  t6 {. PZend对php的贡献很大,php4的引擎就是用Zend的,而且它还开发了ZendOptimizer和
  }$ Y8 c6 G: T* f: i7 LZendEncode等许多php的加强组件。优化器ZendOptimizer只需在http://www.zend.com注册就: H4 Y9 s) F$ J) ?7 S+ N4 T
可以免费得到,下面几个是用于4.0.5和4.0.6的ZendOptimizer,文件名分别对于各自的系统" F& J; n- B& J
:
  q$ z+ s1 f8 \6 i+ F% e* R8 D
" u. R- x( s1 T+ nZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz
: w# n7 G9 \; tZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz
  Z) L2 G, S5 L8 t5 ^3 T# O; jZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz
; t/ o8 _* m8 h# k5 P0 R4 Z/ V+ \7 HZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip
! N; S/ @7 B2 J& K" W* F2 F4 r+ ~. X" V1 N( R8 I8 j3 b* W
优化器的安装非常方便,包里面都有详细的说明。以UNIX版本的为例,看清操作系统,把包里  r( c% z' }, U* o
的ZendOptimizer.so文件解压到一个目录,假设是/usr/local/lib下,在php.ini里加上两句+ u0 Z2 L7 ?9 b6 |+ N& I
:
4 t4 Y0 o8 }: X( @) L. T
3 u% m2 }/ b8 w5 izend_optimizer.optimization_level=15 0 ?# W# Y/ Y( r8 s/ \& {
zend_extension="/usr/local/lib/ZendOptimizer.so" " s0 }2 B8 e6 e' f. O; X6 z

" w3 n+ J* g& ~) n1 v0 x1 ^/ F就可以了。用phpinfo()看到Zend图标左边有下面文字:
6 a3 X% _/ o6 p9 a* q+ h# h) G& m2 T) j# x* N, ]5 C$ p
with Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies
; ?; ]6 \+ W4 m" F2 Q9 e3 A9 @/ i) x" _% s! I  L
那么,优化器已经挂接成功了。
- H( y: |) b- |$ |6 S, x
' w. {9 }" j2 U& L/ s$ p+ q# u# Z但是编译器ZendEncode并不是免费的,这里提供给大家一个http://www.PHPease.com的马勇设
% \! z0 Z: z6 t: z8 t/ j计的编译器外壳,如果用于商业目的,请与http://www.zend.com联系取得许可协议。 . c6 J9 @* n, l* L
/ I* @# y9 f% O6 @$ _
php脚本编译后,脚本的执行速度增加不少,脚本文件只能看到一堆乱码,这将阻止攻击者进
  c( q) |5 H, I1 a一步分析服务器上的脚本程序,而且原先在php脚本里以明文存储的口令也得到了保密,如
3 I8 b/ h" a. W' C- u- hmysql的口令。不过在服务器端改脚本就比较麻烦了,还是本地改好再上传吧。   o' d4 O" P  Z; i( B. a+ J  N
3 c2 Q$ t" J' k. c: X) Q

& B3 [# n, _) V" D5、文件及目录的权限设置
+ h4 ^0 U0 U: L( W) z' A8 X0 ~
# C( T- H9 |* N- Cweb目录里除了上传目录,其它的目录和文件的权限一定不能让nobody用户有写权限。否则,
4 Y0 @3 n- Y& I) p9 r* s' L$ x攻击者可以修改主页文件,所以web目录的权限一定要设置好。 8 C! W$ H- P3 l2 ~1 m
0 C3 a, g1 I% V! j& ?. l: X
还有,php脚本的属主千万不能是root,因为safe_mode下读文件的函数被限制成被读文件的属- s* E% D1 H* b% O4 k
主必须和当前执行脚本的属主是一样才能被读,否则如果错误显示打开的话会显示诸如以下的) U$ n" B2 }! r% E5 ^8 Z4 [
错误: ' o. V6 J/ w* d9 D& e, G5 P
) A& C/ p: x' M. y' x$ A# L5 U# O
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
& m, u, c2 S. {# x% \. tallowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php % E) I% m. q: p  }- H" K: ^7 ~' ^
on line 3
( V; s6 m9 y8 B# j" U& U3 a' Z! N' q' m9 ^& j
这样我们能防止许多系统文件被读,比如:/etc/passwd等。 4 C! p" q. \$ |0 K, j- p; ]+ u" x
上传目录和上传脚本的属主也要设成一样,否则会出现错误的,在safe_mode下这些要注意。
+ l" v+ k4 m9 [1 s/ k9 Q/ v
8 H# o# i4 [3 ~9 K0 l. g2 V! i6 T6 A# _$ r0 w8 S
6、mysql的启动权限设置
% q  b" n% }% @5 x- _8 o0 F5 R. I$ e
mysql要注意的是不要用root来启动,最好另外建一个mysqladm用户。可以在/etc/rc.local等; k( w/ ^& _7 C2 H# t1 U
系统启动脚本里加上一句: & H% N1 A2 R1 e, b6 A# Q

, g$ J: x! E5 H' g6 O) Hsu mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"
2 q) L& E+ Q/ n% ]. L- q0 A" W1 N& u3 c6 s2 ^
这样系统重启后,也会自动用mysqladmin用户启动mysql进程。
. O+ c: Q7 A0 _7 }9 G, d0 j7 h; k4 y, H
0 h" Z# R+ f# W  V# d
7、日志文件及上传目录的审核及 : ~' o% j% f- D4 V& k

( I5 u- K: e# C& l4 q! h查看日志和人的惰性有很大关系,要从那么大的日志文件里查找攻击痕迹有些大海捞针,而且3 c8 x4 _+ e' R8 u/ \+ [
也未必有。web上传的目录里的文件,也应该经常检查,也许程序有问题,用户传上了一些非! c' [/ g$ h9 }# |' r3 O
法的文件,比如执行脚本等。
$ \5 U) ~6 [5 f% i
& z# a0 G$ e& \, T# o
0 [9 ?, }$ N2 {2 M( c% J7 O8、操作系统自身的补丁
" d  A- a' ]/ \6 j( c1 M
5 a4 j0 p, a" x  }8 `$ V一样,给系统打已知漏洞的补丁是系统管理员最基本的职责,这也是最后一道防线。
) n' a2 c; R) {( N$ e, N
/ |4 X" p' t7 v$ W/ w' Z; G
: ^) e% j  Y) P( [- D7 A经过以上的配置,虽然说不上固若金汤,但是也在相当程度上给攻击者的测试造成很多麻烦,
* l3 {( U% C) W; W' M: d. h" j, v即使php脚本程序出现比较严重的漏洞,攻击者也无法造成实际性的破坏。
) g& ~' t* [! X( |- ^) ~/ J# v如果您还有更古怪,更变态的配置方法,希望能一起分享分享;)
8 }; o" V7 V- \' r& c4 p6 z1 [2 B- h4 ?- s8 X4 e- L

+ q7 A- J8 v' O% L; |参考资料:
5 Y6 Y1 p% g0 |6 @PHP Manual * F: w' ]% A; ^: \3 v/ h9 D9 B
http://www.zend.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 06:16 , Processed in 0.017159 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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