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

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

[复制链接]
发表于 2004-5-31 00:23:03 | 显示全部楼层 |阅读模式
发布日期:2001-11-271 J' M# r/ M; E
文章内容:4 i9 B  W# p' E( j* o" X! f5 v- h
--------------------------------------------------------------------------------
# y9 w9 v& S$ m/ b: [  ]+ S8 s' _3 ~$ V1 q# K: Z; s
作者:san(小许) san@nsfocus.com
% D1 j/ B' b; f
) k6 z3 k; F  C: c--------------------------------------------------------------------------------
- U7 X/ W6 X0 V  V) H: x! l
( [- L4 P# A" z: b1 X1 Z% |前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题,以1 G3 U% O7 c! ?: D( d( M
及如何通过应用程序漏洞突破系统,这篇文章我们来通过对php的一些服务器端特性来进行配9 t, ^% V8 F' |1 B2 t% P9 G
置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题,对用户输入进行严格的
5 M* k+ |. `, K) i过滤,但是常在岸边走哪有不湿鞋,吃烧饼哪有不掉芝麻,人有失蹄马有失手,连著名的
* b$ ]; m$ q" Y/ B% j8 r0 Mphpnuke、phpMyAdmin等程序都出现过很严重的问题,更何况象我等小混混写的脚本。所以现
! g  @% }& r: l1 `) B. z3 U在我们假设php脚本已经出现严重问题,比如象前一阵子phpnuke的可以上传php脚本的大问题) @/ Y$ h% c; i% E/ J; d
了,我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。 , u* a$ [! @7 |- R7 k. H

) d. @1 w- e; j0 T! n. T5 m. {1 i2 `
1、编译的时候注意补上已知的漏洞 & o( T6 b* \8 X. ?

: i  S' a0 [/ l) M" t! O. b, H) n从4.0.5开始,php的mail函数加入了第五个参数,但它没有好好过滤,使得php应用程序能突
7 k* D& Z8 U5 A4 b6 J) D& O/ b破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源
$ q7 C) u# I  A) G' Z码包里ext/standard/mail.c文件,禁止mail函数的第五参数或过滤shell字符。在mail.c文件  w7 w) A8 O' m
的第152行,也就是下面这行: $ X: @. V" z1 s# @" S- {

! H( p: ~( H7 Sif (extra_cmd != NULL) { ( R6 e; g4 e- k. h; @: K

% h3 z' w5 z# ~后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php 5 C! ^- g% {2 ^" Q' r4 {3 `# x) X/ t
那么我们就修补了这个漏洞。 * z1 u9 J, K- z! b+ m

: a: B1 D) ?+ B# `- D9 o+ D; b* H2 `9 f% P" r/ X% T
2、修改php.ini配置文件 * e( P: S4 C, G. b% ]3 K, N% R; S1 m
: L1 M# V$ P; M5 H0 k
以php发行版的php.ini-dist为蓝本进行修改。
. G  d7 ]8 y6 O' e9 Q
4 ]1 Q% {8 P! Z9 ?7 S1)Error handling and logging 8 y1 @  f+ u/ x4 d1 H
在Error handling and logging部分可以做一些设定。先找到: 5 |  ]/ q; |8 d& Y$ j3 z
display_errors = On
$ G/ `4 I! y& F1 C% y& q5 P3 l
) s' v5 ?- M7 T4 H. G2 t$ tphp缺省是打开错误信息显示的,我们把它改为: 6 o8 I+ d# Z+ `

* p1 S1 x9 e. Idisplay_errors = Off
+ u( k$ n- W! z: p7 f+ r. H/ }( v2 C4 T- g7 \' }
关闭错误显示后,php函数执行错误的信息将不会再显示给用户,这样能在一定程度上防止攻
" h% V- K) V, a: z2 t9 }$ `4 {击者从错误信息得知脚本的物理位置,以及一些其它有用的信息,起码给攻击者的黑箱检测造9 C" w0 |  @, P) C4 j0 O3 A
成一定的障碍。这些错误信息可能对我们自己有用,可以让它写到指定文件中去,那么修改以4 s2 R) X. n5 o! l, {( }  p; \# x
下:
# T0 `2 Y/ f8 E0 Y3 N4 e
' z) D6 [" B7 slog_errors = Off 5 d. c' g7 K9 B9 e( A( r+ T0 Z+ w

  }  T7 z! v7 l. ~5 D$ L  K改为:
# C- F; I0 W: W8 \$ t& _4 Qlog_errors = On 6 |) I- g  S* [; m5 C' {/ _! m( {- D
9 F$ u; y& {9 A: W! ?
以及指定文件,找到下面这行:
  S& C4 }' J$ F1 U# u* k$ p3 A9 c' o9 m( Z. o- U
;error_log = filename
" y" b1 X0 k3 I- ]0 S
! p% a( l. _5 T" c去掉前面的;注释,把filename改为指定文件,如/usr/local/apache/logs/php_error.log 2 h& L2 u6 n# |! ~8 s( x
( g0 o1 J) C# e/ m
error_log = /usr/local/apache/logs/php_error.log
, ~1 ]& _1 q1 t. W9 m7 W2 e. \1 a$ l1 T( O  e8 [
这样所有的错误都会写到php_error.log文件里。
; ?5 r  b) a7 }! z, x) Q
0 @. L9 L4 X2 q0 s7 A/ r2)Safe Mode ) q7 z: z5 k, K
' s! d4 Q. V/ ~4 z, E3 o" Q
php的safe_mode功能对很多函数进行了限制或禁用了,能在很大程度解决php的安全问题。在
; Q2 A: Y* D" |/ j0 |) i9 ?Safe Mode部分找到: . s9 K) v2 m8 Z( d

) i% i& B$ e; _& Q8 ~2 \safe_mode = Off
  U# A2 D2 |( [9 c0 L6 r8 T2 `
& i7 _" ~) s7 ]) {9 }0 Q# `改为: ' P& S5 C9 K" Z* w- p# B
) a+ O  B; x4 N5 ^( Q8 p( a; v/ n
safe_mode = On - U& o+ n$ q( ]+ q# Q- y+ a
( m% }/ u7 `* K; U) f: ]8 R) ~
这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和``被禁止,其它
" p& v( y- O0 B0 Q: ~的一些执行函数如:exec(), system(), passthru(), popen()将被限制只能执行
1 {9 Y7 q( Y2 }1 e8 ^$ ^safe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序,找到以下:
! b# j& t( W: l. @8 I! L' a3 {3 w8 y% x- B% ]7 l5 l/ Y- e- k
safe_mode_exec_dir =
1 P( z4 |3 ?% f9 x( ^) P9 J4 K3 c6 g- N8 W" k7 S
指定要执行的程序的路径,如:
$ s# t  z) e5 \8 M4 D0 X9 y5 ^$ S% |* \+ H
safe_mode_exec_dir = /usr/local/php/exec
* x3 h7 ^1 E1 r4 c0 ~+ h6 u1 E6 \1 N2 a, t3 J5 f
然后把要用的程序拷到/usr/local/php/exec目录下,这样,象上面的被限制的函数还能执行
2 w8 h7 q4 l3 O' Z! t$ I9 `# F该目录里的程序。
8 j7 B9 Q  V" I/ Y. Y' J% h; F% L& I3 }$ x. }8 n$ \4 j
关于安全模式下受限函数的详细信息请查看php主站的说明:
8 A1 O' b$ {/ e" j3 K- s  Dhttp://www.php.net/manual/en/features.safe-mode.php ! {, W  E$ X$ k0 L
. Y0 L/ k. x2 @! A4 T; l" f
3)disable_functions / i" b1 i  a- C0 G, J
: G1 S, S( w: H
如果你对一些函数的危害性不太清楚,而且也没有使用,索性把这些函数禁止了。找到下面这  l( P3 g& n, _) A
行: . e7 H8 [+ D5 ]1 j

8 D8 G) ^& J: udisable_functions = 1 c' w# N! G' G

7 H4 w, ?8 D- ^4 ^9 n+ j' a在”=“后面加上要禁止的函数,多个函数用”,“隔开。 6 a  V0 x8 N. p4 `

' V" M. [6 I: ?. J6 Y; [: R$ l/ e- _. Z) i9 ^
3、修改httpd.conf
: h; l( l7 A, _% n( U1 n7 q- T5 e, Z7 |( a
如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作
/ y7 A" m5 v/ X( d3 h9 ]9 V) ]路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行:
: U5 e1 D( V) w  T- A9 g& D, I$ f& B
<Directory /usr/local/apache/htdocs> 5 |# a! C, c: e6 I3 C
php_admin_value open_basedir /usr/local/apache/htdocs
4 _* L7 A+ F. b7 t; ?. C5 r</Directory>
9 @* p$ ^/ ]7 K6 O5 a
1 b4 R3 G$ F! v8 C7 a( F这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打. P, ~- z& t. t0 f2 ^- {1 r8 V' m
开的话会提示这样的错误:
6 _& L4 N  A; z% P* }" w3 }7 @- R/ N1 D( Z- m
Warning: open_basedir restriction in effect. File is in wrong directory in ' O" Z/ ?# i2 l1 \5 U* V  D
/usr/local/apache/htdocs/open.php on line 4 , z$ J' S) e- R$ O, d* m
; N5 B, C* X4 y# R) c1 m  z& f
等等。 , |6 t8 w6 F8 i5 ?

: v) L, T! ], W' @6 [0 v+ M, B* `$ b, K7 j0 k$ ~: f, x
4、对php代码进行编译
" U) J& e# b5 E. C. h
. C! [- g# D0 |; r/ V) qZend对php的贡献很大,php4的引擎就是用Zend的,而且它还开发了ZendOptimizer和
! h  Q9 p, L3 J$ ^( h! n9 IZendEncode等许多php的加强组件。优化器ZendOptimizer只需在http://www.zend.com注册就# G7 I  ^( F( l' W# T
可以免费得到,下面几个是用于4.0.5和4.0.6的ZendOptimizer,文件名分别对于各自的系统
3 n0 Z1 H/ x: O2 B6 F- U
2 u$ k+ D, k3 }# M. ^' {: k" H! }1 A! u& J! E
ZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz ) A+ ^2 N: N$ q9 \9 I
ZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz 8 S% O' e1 o" o4 r0 ]; o" w8 N
ZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz
% {- {, a# a8 g3 k  U: mZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip
7 b+ [, i' R* E! a3 m9 x" ^. w& o- |7 X1 A
优化器的安装非常方便,包里面都有详细的说明。以UNIX版本的为例,看清操作系统,把包里
( f" U  _' t& L9 A. Q7 s的ZendOptimizer.so文件解压到一个目录,假设是/usr/local/lib下,在php.ini里加上两句
/ z% q1 w5 B4 g, F% I3 X$ J6 C
; I" \  ^7 N: E' [1 W/ @$ q; J$ l& u7 x& ?
zend_optimizer.optimization_level=15
( `4 G  p" c, K; C9 ]3 {+ d  dzend_extension="/usr/local/lib/ZendOptimizer.so" ; h+ J% g% a2 @0 g! D$ e

7 J, S9 o) p, B就可以了。用phpinfo()看到Zend图标左边有下面文字:
; L: m- u- }" _+ g3 _2 x1 j& T: q. D7 [3 u- B
with Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies 2 C4 r& d% _3 P+ E
" [3 {7 T/ `" m9 y5 G* ], E
那么,优化器已经挂接成功了。
0 o; {1 u5 v/ f- F' G# f5 s. m% E; H) b0 a# C% p: v8 d% R# ^! F4 _; Q
但是编译器ZendEncode并不是免费的,这里提供给大家一个http://www.PHPease.com的马勇设
9 w. ~$ w- H* g1 m2 u/ C/ }2 S计的编译器外壳,如果用于商业目的,请与http://www.zend.com联系取得许可协议。
2 L: M  Z" t. M2 S3 @! L3 D) Q
1 {5 B' [: a8 ?" {( fphp脚本编译后,脚本的执行速度增加不少,脚本文件只能看到一堆乱码,这将阻止攻击者进
( H5 e- j2 {  S1 D一步分析服务器上的脚本程序,而且原先在php脚本里以明文存储的口令也得到了保密,如8 k0 w* M# V) H0 l+ `8 l. U  e
mysql的口令。不过在服务器端改脚本就比较麻烦了,还是本地改好再上传吧。 0 N# N; s6 p! E+ \
! l9 x5 j! x8 j- X
. [! A1 Y, Z* y. z$ v  H# f  p
5、文件及目录的权限设置
/ Y  c6 N+ i5 \; _* i  V5 y- F
1 ^  G" ~  G) i, f8 [web目录里除了上传目录,其它的目录和文件的权限一定不能让nobody用户有写权限。否则,
/ r$ t. E% f7 M1 S0 w! {攻击者可以修改主页文件,所以web目录的权限一定要设置好。
2 A. h* x- }7 B6 ]% K, Q, N) J$ o3 k
还有,php脚本的属主千万不能是root,因为safe_mode下读文件的函数被限制成被读文件的属
: ~8 l! n6 B; z% R/ T% N7 h# {主必须和当前执行脚本的属主是一样才能被读,否则如果错误显示打开的话会显示诸如以下的2 X- E; L  A: |9 ]& s
错误:
5 z+ j* \! D6 C0 v$ W+ H& u
8 p: L+ T9 m& _! PWarning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
8 d/ ^8 Z3 ?! w1 U! tallowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php
& b8 h& U7 ^! o  [on line 3
5 v# t* Y9 x- B# X# o; p5 O% V
% V" U  P0 c" G, @+ x. v' K/ C这样我们能防止许多系统文件被读,比如:/etc/passwd等。 % ~$ a* Z# k& }- M, b# m# h2 j
上传目录和上传脚本的属主也要设成一样,否则会出现错误的,在safe_mode下这些要注意。
; `2 e2 G4 ?# x* M# _: a  P5 h" R( Y7 [0 h4 D

! p% n$ A; o1 q6、mysql的启动权限设置 5 i4 J  C, _/ v5 N( P
' Q% i& i2 @( M  ?
mysql要注意的是不要用root来启动,最好另外建一个mysqladm用户。可以在/etc/rc.local等. D) Q( B9 c- N# ?5 A
系统启动脚本里加上一句: : |2 g6 M6 K1 P$ g

# a! |# G! n  r# e+ esu mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start" ( f! q$ c6 q  C! w% H

& d, g. n( p" {7 R( ]这样系统重启后,也会自动用mysqladmin用户启动mysql进程。
# Z  U( ^) H/ d$ p$ S/ S1 W2 \/ r8 Z$ }& i8 I
2 y2 P1 M+ u0 O
7、日志文件及上传目录的审核及
# _% @  }1 C1 P+ y; r) {+ Y9 @
查看日志和人的惰性有很大关系,要从那么大的日志文件里查找攻击痕迹有些大海捞针,而且. Y2 i' F, u' Q) w: {( L1 u7 n
也未必有。web上传的目录里的文件,也应该经常检查,也许程序有问题,用户传上了一些非0 s2 t( R+ T' m( {; P- v' C
法的文件,比如执行脚本等。 $ \/ ]  @0 I3 o, Y& O* W
" ^5 y& b* Z3 i6 T" Y5 e/ L7 ^" _

& ?: ?) U# K* T! G8、操作系统自身的补丁
( k2 D5 I  x6 r$ q5 c! x: o2 i* n) P
, D: j$ n9 J& {5 C一样,给系统打已知漏洞的补丁是系统管理员最基本的职责,这也是最后一道防线。
! e" l- U& J& X% l# N* T0 n0 @3 A; `! v7 a+ W. [' {

; z, Y- T+ y( s$ q经过以上的配置,虽然说不上固若金汤,但是也在相当程度上给攻击者的测试造成很多麻烦,, S" d/ X0 P  U6 J
即使php脚本程序出现比较严重的漏洞,攻击者也无法造成实际性的破坏。 / Z3 q$ f( k2 S- N/ S3 k
如果您还有更古怪,更变态的配置方法,希望能一起分享分享;)
9 X! B5 `% x; J. L. o/ b0 I; b. ]' A" D# ?, j7 l5 Q5 q0 i; g- e
0 x  C- l% y& r4 g6 O$ y7 \
参考资料:
* E+ h# \$ R; [* |6 dPHP Manual 3 x9 W& d  g7 h  C- I
http://www.zend.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 02:21 , Processed in 0.034955 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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