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

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

[复制链接]
发表于 2004-5-31 00:23:03 | 显示全部楼层 |阅读模式
发布日期:2001-11-27
) t1 q$ Z1 r7 M9 g: o- h" z7 P文章内容:$ D+ \+ C& L; a0 W+ W: t
--------------------------------------------------------------------------------
- b# k4 U7 c" N3 L2 K8 ^9 [2 }! [; r
作者:san(小许) san@nsfocus.com ! `3 ]7 y) R! g/ `

0 {8 A# ~0 R+ W0 @5 `* n4 }--------------------------------------------------------------------------------
# C* o! i' `/ k, L4 M$ i8 I6 Q; Y; o- A) t9 @
前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题,以
6 s6 }$ ]" G$ e2 L7 x6 S# S0 C及如何通过应用程序漏洞突破系统,这篇文章我们来通过对php的一些服务器端特性来进行配8 Q! [$ A% k8 W4 Q- i4 q
置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题,对用户输入进行严格的+ V$ a5 F% `9 y9 m/ X( T
过滤,但是常在岸边走哪有不湿鞋,吃烧饼哪有不掉芝麻,人有失蹄马有失手,连著名的
2 r9 m+ t- `$ V! `7 ]* sphpnuke、phpMyAdmin等程序都出现过很严重的问题,更何况象我等小混混写的脚本。所以现
5 p. q# A9 f$ U在我们假设php脚本已经出现严重问题,比如象前一阵子phpnuke的可以上传php脚本的大问题( o9 C9 a" @9 Z# f3 M5 v4 r% H
了,我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。
! C6 k& U' y) q
! K7 A% r6 ^3 n1 A. v
2 E0 K9 \5 E  o! A1、编译的时候注意补上已知的漏洞 ) `$ J# w, i, ]: ?

1 h, t  |( U. X: F从4.0.5开始,php的mail函数加入了第五个参数,但它没有好好过滤,使得php应用程序能突+ F2 O6 A3 y1 J" s% r. N
破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源' m6 u! H8 `; {
码包里ext/standard/mail.c文件,禁止mail函数的第五参数或过滤shell字符。在mail.c文件
; @4 \+ b$ y) P. [+ S9 ?的第152行,也就是下面这行:
" [8 g7 v6 g8 R6 s# G3 o) C" Y% I; c7 z. M
if (extra_cmd != NULL) { . i0 w* `9 Y5 ?% p% W5 n/ L7 T

! ~! C3 y( y: P后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php . F+ w" d0 k  }) x2 R& E, F
那么我们就修补了这个漏洞。 $ A3 J9 v( d+ J
  r8 n5 k# {/ l( M' h. ^' Z5 [( h
1 K) ?3 B" k( }6 l. Z: S: L
2、修改php.ini配置文件
4 ?9 f! v$ I) ]
  ^& c/ f+ c+ }# p. W( E. T9 t以php发行版的php.ini-dist为蓝本进行修改。
5 D) N' Q0 z; l9 ]  X/ j9 r5 ?( G9 b6 O7 W( l
1)Error handling and logging
2 t& J3 h' i) s在Error handling and logging部分可以做一些设定。先找到: ; h; Y' x3 x! ^: [7 {3 i
display_errors = On 4 a" d" D0 ?& M8 z5 j9 o
! v4 K) a- u! c, N+ m  }6 P# y
php缺省是打开错误信息显示的,我们把它改为:
0 P% Y. |- q; C, r8 ~6 Z% c! z9 E" S/ F
display_errors = Off
/ h9 T/ C4 _  p5 _2 f6 L1 L* N1 ^2 L- w! K0 k
关闭错误显示后,php函数执行错误的信息将不会再显示给用户,这样能在一定程度上防止攻
/ C9 O1 a8 u! u4 c击者从错误信息得知脚本的物理位置,以及一些其它有用的信息,起码给攻击者的黑箱检测造
0 C! d3 T. V9 K4 j8 y/ f% D成一定的障碍。这些错误信息可能对我们自己有用,可以让它写到指定文件中去,那么修改以$ K3 K& Y5 ]9 x8 K
下:
' L/ m4 N. r! [/ G1 C( ^, q6 C: T
log_errors = Off % b- W, T; J' R% K4 k

# n9 G+ n! ~7 E" {1 H6 P改为:
/ T: J" C4 E" b! I8 zlog_errors = On
* R+ h% A# L, f$ E9 m, @& {. ], O. p
以及指定文件,找到下面这行:
( T- d% n) K; F' y# L
, L+ N, A! g  x  @3 w" S- t;error_log = filename
4 C, n7 h) _1 a9 m% N3 W9 B. @0 L0 ~- v+ k- s% r( D! p
去掉前面的;注释,把filename改为指定文件,如/usr/local/apache/logs/php_error.log ; n; D- V7 W9 v- y; Q& k! E

" o4 p- e9 W# D# qerror_log = /usr/local/apache/logs/php_error.log
9 z2 f, z* f# S, q# }; x  K( G! d% m) o7 B$ ?
这样所有的错误都会写到php_error.log文件里。 ; n, c! N4 f$ `6 y

  i  h" L' W4 k/ Z8 I* A2)Safe Mode
4 a6 t2 d2 }$ k* ]; A2 `4 s5 t$ F* S0 s! n1 ^
php的safe_mode功能对很多函数进行了限制或禁用了,能在很大程度解决php的安全问题。在
; U, |: B& o) a, S" pSafe Mode部分找到: 4 O; S" A5 g6 x+ ~1 g$ F

5 D2 y& P6 ^, o+ E( }safe_mode = Off   M& y& {8 J8 M# V3 S8 U8 D

# p$ [9 A( P2 \9 l# b, ~3 E改为: $ b% E4 V2 i3 F

8 N! L0 [4 @* k# ?; e" Csafe_mode = On
% b% f' f  s8 A, M9 l  D' ~
+ U8 s6 }, `1 a! l& p# H8 J这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和``被禁止,其它
5 C: E; Y- a7 [. z: n* C& K的一些执行函数如:exec(), system(), passthru(), popen()将被限制只能执行
" j7 s6 M  T: _safe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序,找到以下:
3 |  J! e, l  U1 T) A( i( W4 y$ @- `2 |' r
# |' x9 I& h9 J9 {safe_mode_exec_dir = 7 `$ I5 _3 V  W- V1 q* v1 K

5 |; f  Y7 E9 U2 L; z) B* A7 I% n指定要执行的程序的路径,如: $ g; Q- S4 L5 G6 G  z% G

9 A* i4 @; o7 z0 Y' X: Q% R8 J# vsafe_mode_exec_dir = /usr/local/php/exec $ Y( S  r) K* K5 y+ G+ X" }; y+ A
1 K4 P. m' h0 d: j$ e( m  f; ^) j
然后把要用的程序拷到/usr/local/php/exec目录下,这样,象上面的被限制的函数还能执行
" S2 @# V$ z9 v1 L/ a( L2 N% y- D: A9 H该目录里的程序。
+ Y8 w& d, z- ?' z; C: W
3 p: `/ w8 J7 [& Q, K8 f关于安全模式下受限函数的详细信息请查看php主站的说明: , C+ L. {, B8 t  S4 `3 a" S
http://www.php.net/manual/en/features.safe-mode.php
0 `: h/ p5 r" W2 a
3 C8 e* ~* O  P3)disable_functions 7 l* S; _$ J- G
) k$ Q3 `& R5 ]3 A" p
如果你对一些函数的危害性不太清楚,而且也没有使用,索性把这些函数禁止了。找到下面这; l- y, I0 `: i
行: 0 q0 X4 {( U/ H2 ^8 G) l$ P

$ ?5 N" P8 J' ?3 {1 K' bdisable_functions = & R9 E3 Z/ y& O' \8 u" e6 f
; P, R( `8 \8 L8 g7 b
在”=“后面加上要禁止的函数,多个函数用”,“隔开。 $ t/ k! I* r7 j

9 k3 z! t- }% a7 K. {) ^( s' _% f/ ?, I' E. [
3、修改httpd.conf
- E- y) j8 A- U
& V; o9 w/ o; h! d8 w如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作/ y. S9 [0 {& X$ _) |  \
路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行: 4 B, s0 ~! R5 ~; L+ e1 s

: c  W- z/ y, Y8 H" S<Directory /usr/local/apache/htdocs> ; J* [, N' ^) W; Y- C; x0 E3 l1 \! R
php_admin_value open_basedir /usr/local/apache/htdocs
7 u, c1 q% Z; {/ t( d</Directory>
' I  J+ z% w- r( t- ^2 U) z7 m( Y1 S7 b5 @2 f- ^; n9 o/ W
这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打
) n$ ]$ X8 W- K# c- G7 ?' _8 E开的话会提示这样的错误:
# d$ L( S( m- B, }
& x/ @, b$ Y( k8 zWarning: open_basedir restriction in effect. File is in wrong directory in
) j/ g- c+ D- v) Z/usr/local/apache/htdocs/open.php on line 4 + ^& A  _+ O2 J% G) _$ u

  F2 f: A0 f3 j7 b等等。 5 @* g5 S/ z3 G7 W4 }: o7 n
" F& w& }+ g4 x4 v

5 C1 U  R; @; U& {4、对php代码进行编译 4 e+ a2 X3 A* ]0 J
0 t$ Y/ N6 M+ L! K0 p7 A
Zend对php的贡献很大,php4的引擎就是用Zend的,而且它还开发了ZendOptimizer和
5 D7 H# t+ s3 k# S" t3 `; ?7 u* vZendEncode等许多php的加强组件。优化器ZendOptimizer只需在http://www.zend.com注册就
4 c; {: I2 M. ~, n, W可以免费得到,下面几个是用于4.0.5和4.0.6的ZendOptimizer,文件名分别对于各自的系统
4 C% P' U7 g! M$ c* S3 {& a, e, P. [3 C* a0 \

, h3 k4 E; C; ~. B! m/ \  R) vZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz
1 J5 V7 ]2 d( H9 f! x( v7 NZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz ! U1 \# z: I) Z/ J3 H. \
ZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz
& f, Z! Q$ U# }- z$ dZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip # k& h* L+ e& m/ L

: _/ M- d3 ~1 o0 v  R优化器的安装非常方便,包里面都有详细的说明。以UNIX版本的为例,看清操作系统,把包里
$ p4 ~% c" n" s3 F5 V( w) q$ Y$ w3 |: Z的ZendOptimizer.so文件解压到一个目录,假设是/usr/local/lib下,在php.ini里加上两句
' ]5 t- c4 }+ p9 f0 e
. F( r. M" Y3 Z5 ~
6 d& f. q: t- P( i+ {7 j4 g7 gzend_optimizer.optimization_level=15 % v7 T# x( r% n; Z
zend_extension="/usr/local/lib/ZendOptimizer.so"
! m7 z: f7 R; @: _5 E; t) j( G+ Y4 W; v0 C
就可以了。用phpinfo()看到Zend图标左边有下面文字:
  k/ a! ?( Q# G6 m3 D5 H& |8 u- U+ ?9 h
with Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies
2 O. s( y, H- L2 _- }4 [. w& [* e( Z7 a% R( T1 Q
那么,优化器已经挂接成功了。
+ H& K4 z$ H1 I+ C) c, [& m+ x7 z5 ?2 f3 m+ c
但是编译器ZendEncode并不是免费的,这里提供给大家一个http://www.PHPease.com的马勇设) P* y, v& C: X, W0 Z+ q) N
计的编译器外壳,如果用于商业目的,请与http://www.zend.com联系取得许可协议。 , v2 E  _2 z: j5 r$ a* f5 Z0 i

9 w0 V1 W  _  \3 K; g/ M+ Mphp脚本编译后,脚本的执行速度增加不少,脚本文件只能看到一堆乱码,这将阻止攻击者进
- R* l" i  w! a% h  E* t1 T( D一步分析服务器上的脚本程序,而且原先在php脚本里以明文存储的口令也得到了保密,如
0 E- ~3 x  z9 D$ ~mysql的口令。不过在服务器端改脚本就比较麻烦了,还是本地改好再上传吧。
# {. ]7 `! Z& H; p
6 j* A3 Z; l' l/ z3 m( O1 e
! R* U% v* F5 [1 K6 x) F: `' U5、文件及目录的权限设置
7 L1 K- s2 d8 A% Y, e8 u. H6 g7 r5 I
! {# j! b& q3 [6 s  Q# {3 Mweb目录里除了上传目录,其它的目录和文件的权限一定不能让nobody用户有写权限。否则,6 Q' ~) @8 e# }" z- m
攻击者可以修改主页文件,所以web目录的权限一定要设置好。 $ C$ c$ i$ c9 ^; r8 {/ U+ q
% n# [2 E, L: T7 K, C2 R
还有,php脚本的属主千万不能是root,因为safe_mode下读文件的函数被限制成被读文件的属
) y4 |) A  G6 e( [& l主必须和当前执行脚本的属主是一样才能被读,否则如果错误显示打开的话会显示诸如以下的7 \- t- r' C8 T6 R& Y
错误:
3 S* q2 ?, {0 N0 r% m$ g: {1 z2 P! u/ s2 x% j
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
6 m* G/ D' O; z, U& K: _allowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php
" _4 T0 b* z9 I0 C/ |on line 3 : ^! n" ?' g' N$ N1 K8 L, J
8 k- E( d1 p( {1 Q# {3 f
这样我们能防止许多系统文件被读,比如:/etc/passwd等。 0 W) v* q1 y! S7 b" d
上传目录和上传脚本的属主也要设成一样,否则会出现错误的,在safe_mode下这些要注意。 8 d/ x/ p7 X! ?- n3 a9 r

6 W9 ~# @4 J1 k1 B: C  G4 S3 E7 d% H& O+ a8 A7 n
6、mysql的启动权限设置 6 [9 u- l- f( Q4 G0 d6 \1 N
4 v* U* _/ f! @4 {
mysql要注意的是不要用root来启动,最好另外建一个mysqladm用户。可以在/etc/rc.local等
) i3 P3 x) F# S" {% E7 B系统启动脚本里加上一句:
6 G+ b2 }0 n& ^/ t$ E9 t4 \
- d7 N# s4 p9 J& M9 n" Ksu mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"
3 a1 R0 }1 P, P3 U( Z) u" Y% U& H
这样系统重启后,也会自动用mysqladmin用户启动mysql进程。
$ j) _$ U' o: T' y4 r9 c1 R5 @" t  T  g4 X7 A4 E9 T
: V9 X: K) V6 I, Q- H
7、日志文件及上传目录的审核及
# E. N  N) P# m1 m/ [/ }$ L; D9 A; g7 i2 I1 {1 C- J. l, A0 M6 _/ i
查看日志和人的惰性有很大关系,要从那么大的日志文件里查找攻击痕迹有些大海捞针,而且
  \- I! n6 m- I3 {  ]也未必有。web上传的目录里的文件,也应该经常检查,也许程序有问题,用户传上了一些非$ {* o- a: u6 V5 ]! ~3 y' i& u. D
法的文件,比如执行脚本等。
& q  G! ?$ y) V2 H3 Q/ S" M1 r( A8 O) ^% j/ Y

6 \) S7 e) S! a& _8、操作系统自身的补丁
. W0 ]" a* @- N0 V4 ^+ t
. E1 {& R$ |4 `* U9 H7 N一样,给系统打已知漏洞的补丁是系统管理员最基本的职责,这也是最后一道防线。
/ Q8 H& N, `% y; D% B3 p5 c8 i8 C: D  w/ O' H
5 h& A% X+ C) b+ x, m% c' g: |  s2 e
经过以上的配置,虽然说不上固若金汤,但是也在相当程度上给攻击者的测试造成很多麻烦,' U0 I( E2 D( c/ q. N$ N, W9 x
即使php脚本程序出现比较严重的漏洞,攻击者也无法造成实际性的破坏。 6 X2 U; ~$ ?! _' \; b
如果您还有更古怪,更变态的配置方法,希望能一起分享分享;)
1 V: o% D" I+ t) A4 L( s, M& Q1 M' D. ]* W6 O5 r2 n
, s' _8 {7 K$ R6 `% v6 @! Y6 I
参考资料:
: |6 A: W# Q. k+ h" r- VPHP Manual
1 `- s6 [. ~5 ?' r5 b; b5 Xhttp://www.zend.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 19:58 , Processed in 0.017630 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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