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

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

[复制链接]
发表于 2004-5-31 00:23:03 | 显示全部楼层 |阅读模式
发布日期:2001-11-27* d3 C' D' i; a
文章内容:5 W: f  O$ M$ P/ v: j' T
--------------------------------------------------------------------------------. W" R4 @, g2 I0 B+ j  u2 w

/ X: s7 S' N) L作者:san(小许) san@nsfocus.com 0 q( g4 N5 @4 z4 p, a
5 X. _- \& F8 t& R
--------------------------------------------------------------------------------7 W( D0 `' h; q2 e, m

+ l+ p2 e0 l2 _1 O' F/ H0 F前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题,以! L4 D7 R% a. k* @
及如何通过应用程序漏洞突破系统,这篇文章我们来通过对php的一些服务器端特性来进行配
% K0 \  f& Q9 {# d4 L% a% X置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题,对用户输入进行严格的, }0 [+ o5 C; Z! F
过滤,但是常在岸边走哪有不湿鞋,吃烧饼哪有不掉芝麻,人有失蹄马有失手,连著名的
, Z# \" @! p! x) s' b  ~( i9 [, }phpnuke、phpMyAdmin等程序都出现过很严重的问题,更何况象我等小混混写的脚本。所以现3 Q$ i, q2 k9 x$ T
在我们假设php脚本已经出现严重问题,比如象前一阵子phpnuke的可以上传php脚本的大问题
' S  u' E5 @8 ~" a$ K了,我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。 + i# H7 f/ j1 f. V
# \, j" O0 s' ^9 ~
4 Q# Y6 C+ b5 N: g4 l
1、编译的时候注意补上已知的漏洞
" l7 {$ n7 K+ ?0 f# \# ?! O7 u) R7 ~' b( u/ I( Y
从4.0.5开始,php的mail函数加入了第五个参数,但它没有好好过滤,使得php应用程序能突& u7 ^6 B, n6 \3 M; r/ E' ]9 m" b
破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源
; Y! C, q7 I3 h8 O9 m8 P码包里ext/standard/mail.c文件,禁止mail函数的第五参数或过滤shell字符。在mail.c文件
% |4 G; L% ?6 w- H1 V5 n9 e) p; M* N的第152行,也就是下面这行:
" F/ Q5 e0 K, y8 v7 }
- t3 U6 o: j. J7 B7 Iif (extra_cmd != NULL) { , x2 d, \- B. ?

+ a& d9 A0 g6 w3 W* Q后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php 8 D- m, Y8 B: j  [
那么我们就修补了这个漏洞。
: F" L# ~4 d5 \* b6 b* I, U. j+ h/ E0 ~# Y9 J

7 `2 V/ |9 |* o4 a2、修改php.ini配置文件   k" d3 _  E0 w3 `, q

$ k  a7 b% I( l2 \: ?以php发行版的php.ini-dist为蓝本进行修改。
% K7 d% C; z! m' ?. X" j
5 ]1 }: c8 y2 h5 u' P6 P( T1)Error handling and logging % z' O2 L" f9 y8 b4 W
在Error handling and logging部分可以做一些设定。先找到:
) r4 t. ~' k9 W( l% @" c5 S% w, idisplay_errors = On
5 q# e3 {0 ~- Q& g4 t4 s5 i0 i
" ^; i) m! C! X+ r, }# _" Gphp缺省是打开错误信息显示的,我们把它改为: ! E; o- Z+ F  q* H" [
. ~& G5 J' Y9 H+ r1 m
display_errors = Off
1 j0 n( X2 I  M! a" t$ K
; D. \5 X9 I5 {8 m关闭错误显示后,php函数执行错误的信息将不会再显示给用户,这样能在一定程度上防止攻
$ P" I! D/ f# I) e1 R6 l7 {击者从错误信息得知脚本的物理位置,以及一些其它有用的信息,起码给攻击者的黑箱检测造
$ O* z) q9 p- _. E成一定的障碍。这些错误信息可能对我们自己有用,可以让它写到指定文件中去,那么修改以
4 r8 q# J# C/ @& C: j下: 4 N& Q2 O! H& ~4 M) h; L+ M

* S) t) X5 ?8 D. i, T( vlog_errors = Off 5 T. g. N0 R  F- x

0 Y# Z5 `  S  h; \) |改为:
& s) H  E3 S- [* `log_errors = On 0 x+ D5 j( v* k
- r: k6 O3 D* V, t
以及指定文件,找到下面这行:   {  P9 B7 |% F1 T
: n. Q9 x2 F5 F& _
;error_log = filename
* Q8 ~8 }* O  v; c* a$ R  `, a& ?8 ?
去掉前面的;注释,把filename改为指定文件,如/usr/local/apache/logs/php_error.log + O  R  G: q  }+ b3 t* i. u
3 O* r" I+ [) k: B5 `
error_log = /usr/local/apache/logs/php_error.log
! N# L" [6 ^. f( O4 e! X# M
1 ^; j) x' N) ]: [0 ~这样所有的错误都会写到php_error.log文件里。
+ w7 _% I+ ?9 L, v  @
& O% {, Q/ R5 O" g5 }4 ?% F2)Safe Mode ! O2 l4 X2 S- L* T( T2 {# b7 U+ Y

7 T& p! V+ \) P1 G/ Q  e& Q4 ]  n  c' sphp的safe_mode功能对很多函数进行了限制或禁用了,能在很大程度解决php的安全问题。在' D; G  R, X2 Z1 a0 E9 O  n
Safe Mode部分找到:
% |  j& s( C7 f  f1 Y! ]; w  t* A. U, W4 l
safe_mode = Off . f! p9 z7 s9 c0 Q/ w) H

* o6 ]3 |9 h+ @; A改为: 6 ~2 c) q6 @$ r# Z7 x$ [% u

0 u  G( w7 ?1 C3 j9 U/ rsafe_mode = On
! [* t" Z- M9 j& r9 N! k0 Z
1 _  o7 y  i5 b; ?3 f这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和``被禁止,其它
9 m8 k8 h" o# P5 z1 r3 H的一些执行函数如:exec(), system(), passthru(), popen()将被限制只能执行
# J% J6 r% C: \- vsafe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序,找到以下:
3 n+ ?6 K; }) ]" c7 `6 I/ [$ P" u7 _, J$ |  g7 v  k$ C, o& Q
safe_mode_exec_dir =
. M% z9 c! f7 k2 @8 K8 c. U5 }+ V! k; q) x& n& s
指定要执行的程序的路径,如: 0 P/ r6 k5 J! c' v0 p
. d3 k) n. g6 }3 v. D4 r- o6 T
safe_mode_exec_dir = /usr/local/php/exec
% F) W" S- c; M" z  Y# @  ~9 h4 x: Q- m  ?# B
然后把要用的程序拷到/usr/local/php/exec目录下,这样,象上面的被限制的函数还能执行
& e7 C% u4 T! t4 S+ ?( j. g该目录里的程序。
, C4 B2 W" V/ D. t1 H
0 C: d! O6 t/ E+ @4 o' J6 c关于安全模式下受限函数的详细信息请查看php主站的说明:
' |- R4 p, X% @2 h, o2 d+ Khttp://www.php.net/manual/en/features.safe-mode.php
3 f4 Y+ w0 q+ X' u0 [! n8 V5 s1 q+ `) i) o, D/ x/ ^
3)disable_functions
- {0 ~+ e7 S4 {" o9 Y3 u9 N8 B4 L4 ~- i
如果你对一些函数的危害性不太清楚,而且也没有使用,索性把这些函数禁止了。找到下面这
$ e* p' ]$ N0 j0 d行: 3 [/ Q, A# ]$ J) c2 y1 [
/ e3 ~& G* D  s" S9 U
disable_functions =
8 `! S. Y! L) I7 p- V4 w; e, S+ a
在”=“后面加上要禁止的函数,多个函数用”,“隔开。 5 O1 \$ j. F& \  [# Q

. p2 m, d- c" D* J5 Z( n$ A, N  W. s: [4 e
3、修改httpd.conf ; |5 _3 j7 g4 Y
5 _- W4 S9 w8 r# }" h
如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作* V( u4 G( B9 ?3 e7 T8 O2 U
路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行: 6 L$ t) ?) k3 O7 v
5 h3 L- ?# @- Y- v0 N% S' ]
<Directory /usr/local/apache/htdocs>
7 b6 S8 w& k8 w; u7 Iphp_admin_value open_basedir /usr/local/apache/htdocs
; s/ v/ O1 `7 k- X7 c</Directory> 2 b; ]7 l- O: P
0 y- G# i* |6 j6 a: i: W3 n
这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打: N+ X' ~+ ]9 c* {8 q: k
开的话会提示这样的错误:
4 \' K6 h2 f8 Z7 ]
/ }- `& a$ A, a' ]Warning: open_basedir restriction in effect. File is in wrong directory in + [% j5 t( }" Z; Q4 m
/usr/local/apache/htdocs/open.php on line 4 : l  u0 G* K6 g9 |
/ ]$ a  w# t# r9 i" c+ a- n9 H( ~
等等。 6 T; M' ~' Z2 o1 k4 G9 j) i' m6 _
6 s3 A2 ~2 p1 h: L! r% f! F

, p( e2 }" \, y4、对php代码进行编译
( q* R; u' k# ^; z3 ?; H0 m. v. [# Q; e4 m, @8 ?( `! m
Zend对php的贡献很大,php4的引擎就是用Zend的,而且它还开发了ZendOptimizer和
1 ]3 l# h- s. i/ n  tZendEncode等许多php的加强组件。优化器ZendOptimizer只需在http://www.zend.com注册就; n; G: D) G: W( T4 r4 e6 w- b
可以免费得到,下面几个是用于4.0.5和4.0.6的ZendOptimizer,文件名分别对于各自的系统1 b. r- [" f4 j6 ^+ C
- N- O8 K( p: g* {
' S* p/ j; \/ a5 Q  U
ZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz , _5 c* A) @, Q" t, V2 g
ZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz
% v! C% `& ]* x4 l7 [ZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz
* H- i" J7 v3 Z, U& AZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip ; @4 C4 T: X! c) B% ^
" k; W5 v8 a% \3 \/ Z) h
优化器的安装非常方便,包里面都有详细的说明。以UNIX版本的为例,看清操作系统,把包里
1 ?" q) D- e2 U. i( l  T的ZendOptimizer.so文件解压到一个目录,假设是/usr/local/lib下,在php.ini里加上两句
# K3 f+ `0 e, I  W+ E: H1 ?) o# Y$ A( q: D$ j% A- i8 B" q
6 ~% C7 Z! @8 e# r4 K7 @; U4 N
zend_optimizer.optimization_level=15 + y5 ^! E# G1 h  \
zend_extension="/usr/local/lib/ZendOptimizer.so"   }1 Q5 |0 w2 C/ @: o' Y
  e0 ?9 T9 B" m# R' Q' W
就可以了。用phpinfo()看到Zend图标左边有下面文字:
! z+ u) R+ g( E! V# w
2 U! d/ F( q2 A  wwith Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies 0 \3 |5 o$ @( t) I' s

! R; {: X; L. r8 w; P) Y7 d那么,优化器已经挂接成功了。 # K" _$ s4 K% d6 h  ]  P+ Q6 T

/ l- q! i5 o+ }. [但是编译器ZendEncode并不是免费的,这里提供给大家一个http://www.PHPease.com的马勇设
4 k! V8 o9 N* S  d计的编译器外壳,如果用于商业目的,请与http://www.zend.com联系取得许可协议。
% ]: M0 T1 A8 l: Z3 {
) i/ H  h/ H9 e7 ?8 o4 B; }/ Q( @php脚本编译后,脚本的执行速度增加不少,脚本文件只能看到一堆乱码,这将阻止攻击者进
/ `% a) t9 B6 o( D: K' u6 S7 r一步分析服务器上的脚本程序,而且原先在php脚本里以明文存储的口令也得到了保密,如
( @0 g$ N- r1 H% x1 `: X  \mysql的口令。不过在服务器端改脚本就比较麻烦了,还是本地改好再上传吧。 0 ]2 _8 X- B: @0 }* d
) P9 i9 Z) u0 H% m2 N% W

# L# I+ n. b. ^8 F: S; C$ e5、文件及目录的权限设置
2 u% A# t' [" s  V6 p) d1 G) D' B- H3 h6 `7 D
web目录里除了上传目录,其它的目录和文件的权限一定不能让nobody用户有写权限。否则,
3 Q; |) ^' p! z$ r" z: [: z攻击者可以修改主页文件,所以web目录的权限一定要设置好。 0 O2 e, m% t3 N/ O8 e* m. H) Q

! ?5 a+ H% i: Q, e) [$ m9 N) J, r还有,php脚本的属主千万不能是root,因为safe_mode下读文件的函数被限制成被读文件的属6 d5 l0 T* W$ g8 V
主必须和当前执行脚本的属主是一样才能被读,否则如果错误显示打开的话会显示诸如以下的& S9 j2 \+ ^2 j/ \* q" Y  y& K, ], Q
错误:
+ W0 [& y% H2 Q) J2 v# A
/ h5 E9 d" R8 [7 F5 @8 gWarning: SAFE MODE Restriction in effect. The script whose uid is 500 is not % @8 q( K8 v2 W2 X5 e
allowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php 9 a: Q! ?' d& s) H; O8 N) {" g
on line 3 / j, J/ {1 F* P6 F! u: u
: X* x1 n% L8 v( J
这样我们能防止许多系统文件被读,比如:/etc/passwd等。
+ z/ i4 }  l- ?  a' n# z& l上传目录和上传脚本的属主也要设成一样,否则会出现错误的,在safe_mode下这些要注意。
* W/ X6 V% S; B+ L; w% ^: [2 Z( n6 l9 K" q* ?) m

% n- f1 V- _; T6、mysql的启动权限设置
3 G% q; A* D& x! F4 |6 Z& o
! u1 Y7 F9 }% ?; F6 n" Z  l; emysql要注意的是不要用root来启动,最好另外建一个mysqladm用户。可以在/etc/rc.local等
) n8 w3 f. `& D0 j系统启动脚本里加上一句:
; {6 P0 k; D/ {' L+ O7 S
; ~/ u8 D* e. h) j7 T- ~/ csu mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"
& i# l8 U$ m" \9 r5 t# L+ ^- e, C1 A3 u+ u
这样系统重启后,也会自动用mysqladmin用户启动mysql进程。 2 C" J% N: \5 I5 I- ^. [( L- ~3 J
( _7 T( L0 K8 S1 u, h
. n/ K6 N$ v+ R- ^- o8 r
7、日志文件及上传目录的审核及
- k; ^* _" r9 l  k9 i3 x+ h, m/ f% x$ }2 D9 {$ x
查看日志和人的惰性有很大关系,要从那么大的日志文件里查找攻击痕迹有些大海捞针,而且
$ F+ p- u& R: o0 j1 j* C也未必有。web上传的目录里的文件,也应该经常检查,也许程序有问题,用户传上了一些非
9 w3 d4 A1 x; h法的文件,比如执行脚本等。 2 F) R+ M' Z% W4 K: F4 x- ^
- {, |: H4 {2 G7 @" o; O. O

; r  Q3 I  |$ @$ o3 \8、操作系统自身的补丁 * e: `" ]' D& F! v5 x. G

0 U, F; P  m# Z( v  d一样,给系统打已知漏洞的补丁是系统管理员最基本的职责,这也是最后一道防线。
: G2 \7 b6 B) U7 E4 W. ~+ K( N; _2 u, d4 |

  w8 m+ t, H7 \" U经过以上的配置,虽然说不上固若金汤,但是也在相当程度上给攻击者的测试造成很多麻烦,
/ f  s* B3 l1 g6 Y( A2 d+ ^即使php脚本程序出现比较严重的漏洞,攻击者也无法造成实际性的破坏。
- ]) X0 V! `" `( z如果您还有更古怪,更变态的配置方法,希望能一起分享分享;) ; S! L( P" W, \

5 `: H  w. |& H0 l# P& |; K. I  I; {$ H1 |( t/ I! [
参考资料:
8 {8 x& G, O8 A, P- `. LPHP Manual
# m- M: k4 _0 d; D) Ihttp://www.zend.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:03 , Processed in 0.020964 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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