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

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

[复制链接]
发表于 2004-5-31 00:23:03 | 显示全部楼层 |阅读模式
发布日期:2001-11-27
) \4 _: z- P1 A# ?1 ~& m  j% F+ @; p文章内容:
. g9 D5 b2 ?, W) N% u$ y2 G--------------------------------------------------------------------------------
9 O* ?$ d. `3 D, V3 W
9 b5 B/ q" E, X. ^9 O8 f; H作者:san(小许) san@nsfocus.com
5 t: J& K7 I- M/ b. b+ P% A- W# s: S  z  }
--------------------------------------------------------------------------------& B$ h" t& U/ h. ?* q+ y* B, {
+ W  P1 h1 m' Y! _0 C' h0 p6 E
前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题,以2 {9 w) E* N8 s+ ]1 H4 {
及如何通过应用程序漏洞突破系统,这篇文章我们来通过对php的一些服务器端特性来进行配
9 M8 u; r6 Y1 V7 ]3 y2 w置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题,对用户输入进行严格的1 p' V! q7 p, f1 L; P" k
过滤,但是常在岸边走哪有不湿鞋,吃烧饼哪有不掉芝麻,人有失蹄马有失手,连著名的
2 x& Q) @9 S( {8 `1 H7 Pphpnuke、phpMyAdmin等程序都出现过很严重的问题,更何况象我等小混混写的脚本。所以现" a  C* K% M) g! g
在我们假设php脚本已经出现严重问题,比如象前一阵子phpnuke的可以上传php脚本的大问题- E( I: d3 I+ `3 }* `+ J
了,我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。 ! g2 L: u0 Y' n) h3 V
  i# ?" c1 l% R* t) }8 x; q% e

, ~5 z- s5 m- j% k1 H# E% E. a" g1、编译的时候注意补上已知的漏洞 / H' |0 @3 G* p. i

: z8 i5 ?8 C6 y& _+ b( _从4.0.5开始,php的mail函数加入了第五个参数,但它没有好好过滤,使得php应用程序能突  u' S3 i3 N( h; R, x6 P
破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源, q9 L: |5 l3 y% Y& j" B  |
码包里ext/standard/mail.c文件,禁止mail函数的第五参数或过滤shell字符。在mail.c文件" m) o5 Z9 `6 L" S2 ]) c. F- ~  M
的第152行,也就是下面这行: 4 b! A2 h. G. E$ _, c4 ~9 @

/ X+ E" L% c& {& ?& ^if (extra_cmd != NULL) {
! y$ o5 L/ O  t) ]  |
) k4 x/ B( M  x; Y; k8 Q. {后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php   B0 i: i* I% z+ }( B1 l9 R
那么我们就修补了这个漏洞。 & J8 E$ Z  o  r& R3 D
% P" C* J$ y# ?. f6 B/ _
1 P. t% d% p' ^8 C5 t3 g
2、修改php.ini配置文件
. o. }( |1 J1 H' [1 k+ ^5 u
3 ^$ ~/ Y3 q0 i以php发行版的php.ini-dist为蓝本进行修改。
2 h2 P6 X4 a8 F8 n* I% i& `& I/ A
. {  d, X; d) {. w$ Y1)Error handling and logging 8 \0 b* d: E' w8 o
在Error handling and logging部分可以做一些设定。先找到:
9 t1 M2 L: ^2 c8 odisplay_errors = On
! E4 @# Q  V1 A3 ?
. ]# P& |+ g+ ~9 k" Y- {php缺省是打开错误信息显示的,我们把它改为:
7 w6 ?: [9 M; Q8 n3 T+ D8 p& b" o4 C4 y
display_errors = Off
0 n. e) k$ ?7 b9 P4 v/ J0 ?
. ^3 G& x+ T  U) V$ N2 f关闭错误显示后,php函数执行错误的信息将不会再显示给用户,这样能在一定程度上防止攻
4 O. [0 M+ k/ `( E击者从错误信息得知脚本的物理位置,以及一些其它有用的信息,起码给攻击者的黑箱检测造- ~  Y+ H; _9 f5 r; z; V; w
成一定的障碍。这些错误信息可能对我们自己有用,可以让它写到指定文件中去,那么修改以. A5 p! N+ U0 I0 R- g
下:
; M, r! U+ G7 P0 p$ i3 Y
4 S( Y' v4 u/ c! glog_errors = Off
+ i3 p) C$ L. R3 R/ J! n+ S1 h. B8 @1 v3 B
改为: 3 H! g- Y+ P2 _( c$ T, I/ ~
log_errors = On
* M' i: V5 v( o: }2 C( c# ]) q
- K  e' E# F9 w以及指定文件,找到下面这行:
& s* K# ^6 a( p4 U8 b8 C! G; O* c# U' ^3 j0 }6 c  F5 W& X& a* M
;error_log = filename
$ R, M7 s, |% t: W2 v3 c
3 K0 E0 D8 p/ T7 J( L去掉前面的;注释,把filename改为指定文件,如/usr/local/apache/logs/php_error.log 3 z; c) |4 @. {" S. e: B% j. p. K+ E
2 ^" x/ _- s9 _$ f) f
error_log = /usr/local/apache/logs/php_error.log
- y% \3 O; e) z# D& O
. x9 j- ^# D4 w/ x8 k这样所有的错误都会写到php_error.log文件里。
, S7 q# }2 Y3 E; n& [0 u% E( d% w* m5 y6 v8 u& z5 k
2)Safe Mode 3 _9 J% K* }( G& [/ b% a6 u) R4 z
2 T: ]; ?  C  j% A# C% V
php的safe_mode功能对很多函数进行了限制或禁用了,能在很大程度解决php的安全问题。在$ ^3 r! S" G- v% k
Safe Mode部分找到:
$ T$ {( ^& v9 B4 F% \2 I
, _, z9 c8 d+ asafe_mode = Off
9 y$ }& Y( |( ?( o3 p# @, F( Z6 N/ `9 L4 z
改为:
) B) |' Q, A3 g, c( ]+ T
& Y2 m; _( S8 `7 esafe_mode = On
; G! k# p) S9 X; r9 d
' `* V: n# R! i3 H$ q7 d这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和``被禁止,其它
# H* j" n  {" q. m的一些执行函数如:exec(), system(), passthru(), popen()将被限制只能执行% I  v, |2 j! V1 @
safe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序,找到以下: / k/ L& ~  v" A) Y$ g
8 p9 G" n6 Q9 z, c
safe_mode_exec_dir =
, @7 {8 V, R% e+ |. e) F, e" T. }* }4 `
7 G9 A8 j# e( Z! k+ G! c7 z4 w指定要执行的程序的路径,如: " v( @6 j7 W. A- l( J: v7 O
8 v* d, b% K% m  s/ X! R
safe_mode_exec_dir = /usr/local/php/exec : p. [/ l/ D  J! _' j! @2 v
0 f$ u. q% q5 w: ?
然后把要用的程序拷到/usr/local/php/exec目录下,这样,象上面的被限制的函数还能执行- A. L" [. R2 o  S
该目录里的程序。
+ [, C. O  ?% J' e/ _7 p
3 ]6 D% |$ ]: N) L$ ~关于安全模式下受限函数的详细信息请查看php主站的说明:
! [% h- E& s; y% H9 `http://www.php.net/manual/en/features.safe-mode.php ! X9 A' `  X# E; O
4 J% d' S; c) ^6 ?
3)disable_functions # n6 L6 @. f3 u5 p% w; N
5 E2 F. J% C+ A+ G3 O2 I
如果你对一些函数的危害性不太清楚,而且也没有使用,索性把这些函数禁止了。找到下面这. h0 h1 R0 Z+ y" i& A  }+ q
行: 9 k6 u/ l- k5 a4 [8 h5 S
! ~) U2 u6 I/ Z; l+ o4 ?( }
disable_functions =
7 T! Z' S( |+ R: |2 F2 n) Q# x( p4 h( ]4 L% q- q
在”=“后面加上要禁止的函数,多个函数用”,“隔开。 ; l3 n- D) K0 \! T; }
3 k5 \$ ], i) T

/ J- S0 y& K/ ~5 K7 j3、修改httpd.conf
! f1 {8 E% W' C2 e9 p7 t
, B# n3 g& ]' K! B( Y如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作1 `1 I; ~4 A% x$ z! p0 r2 c
路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行: , L' F3 b" [3 q; M
( R7 Y) g, g7 D7 n
<Directory /usr/local/apache/htdocs>
2 o8 J( @  a+ H, aphp_admin_value open_basedir /usr/local/apache/htdocs $ \, M/ h# f0 B' j( h
</Directory> . l' [* g. X# n* F
2 b6 e, W. ^: `1 {3 m
这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打
% M7 R, D' ^' r6 D6 r开的话会提示这样的错误: ) z8 u/ L2 n/ K
! ?- Y( M1 \# T; B+ f) N  U
Warning: open_basedir restriction in effect. File is in wrong directory in . A3 G, M1 g+ |0 t  G
/usr/local/apache/htdocs/open.php on line 4 2 w) Y* r8 u$ \, |' S3 N' w% R

5 d4 ?; D* v& N# K等等。   m0 x% y& c/ Y+ x$ ]+ G
! D& z$ [8 b: l" Q# z, y; k
) y- N6 D( s, j
4、对php代码进行编译 4 [+ Y- B' |/ y
) ~$ Q% K, L% C; d/ {
Zend对php的贡献很大,php4的引擎就是用Zend的,而且它还开发了ZendOptimizer和
$ h8 d5 U+ p2 ~. _ZendEncode等许多php的加强组件。优化器ZendOptimizer只需在http://www.zend.com注册就
  r: Q* Z9 M* J! ^, {可以免费得到,下面几个是用于4.0.5和4.0.6的ZendOptimizer,文件名分别对于各自的系统
. r$ F: m: M3 l2 u0 {& ^/ l! m/ J" I

0 q1 X, X/ ]; E# F3 C1 k6 {ZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz
$ U  t9 [5 f, ^ZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz
8 \$ w5 G, l' ~# c# D, fZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz
0 K$ Y4 v) a: b$ N4 Q) kZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip
% j4 g/ d5 c" c. x! G( r/ C& h% X$ S/ |: L" h1 J" c
优化器的安装非常方便,包里面都有详细的说明。以UNIX版本的为例,看清操作系统,把包里9 @4 |3 W6 A. v  |/ F: {
的ZendOptimizer.so文件解压到一个目录,假设是/usr/local/lib下,在php.ini里加上两句
" h: A3 W8 F1 E0 h; u$ r
8 h4 R$ G' a! U. J4 V" Q
+ e) J7 S1 {8 |8 l2 |zend_optimizer.optimization_level=15
; u: N. \$ `0 ?" }4 ~2 r4 U! jzend_extension="/usr/local/lib/ZendOptimizer.so"
5 d8 x  M1 ?) O4 h6 b' j& z: e5 x3 Q5 n& A! i8 S- @
就可以了。用phpinfo()看到Zend图标左边有下面文字:
% v9 G( Q& K) e$ y* ?- I- l8 F) k8 P9 Y2 w* a9 ]# v
with Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies   ?& i/ |( M/ w, q

' W; ^7 c1 f3 O' F6 @; B那么,优化器已经挂接成功了。
, Q6 K, `$ q4 g* a+ a" S* p: h6 L7 C- z/ m* L: W8 b3 k' i
但是编译器ZendEncode并不是免费的,这里提供给大家一个http://www.PHPease.com的马勇设6 u, @# v6 T! c
计的编译器外壳,如果用于商业目的,请与http://www.zend.com联系取得许可协议。 : K, P# k6 q4 T9 r

9 P' A: f1 M$ q1 w. L( U2 qphp脚本编译后,脚本的执行速度增加不少,脚本文件只能看到一堆乱码,这将阻止攻击者进
! K' ^* T. Y8 Q一步分析服务器上的脚本程序,而且原先在php脚本里以明文存储的口令也得到了保密,如
% ?- [2 X+ t* Q- D% Bmysql的口令。不过在服务器端改脚本就比较麻烦了,还是本地改好再上传吧。 3 p. y( `7 s5 ~, ]  [5 c8 O9 P
0 @) r) Q; R, C. }3 `/ _
8 B* s% @1 i: ?
5、文件及目录的权限设置
" D% u0 i. {, p/ Q2 J. s/ {  L+ }. G7 q/ }& i! ?, f7 x
web目录里除了上传目录,其它的目录和文件的权限一定不能让nobody用户有写权限。否则,
' a$ B# k. Y: f* w0 t: m攻击者可以修改主页文件,所以web目录的权限一定要设置好。
! N* ]$ D5 c6 y1 U; D, ?0 X$ w+ {) |# t
还有,php脚本的属主千万不能是root,因为safe_mode下读文件的函数被限制成被读文件的属
& z" c; I+ r; Y1 j2 e主必须和当前执行脚本的属主是一样才能被读,否则如果错误显示打开的话会显示诸如以下的9 J: Y' q" h' E7 A
错误: ! m. z% ?$ a, J# r# o0 E
% {+ {" M3 H/ q9 _
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not ' x4 w  k  r4 Q% B7 A$ j
allowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php
! I( P' ?7 m, {+ A+ Yon line 3 , p& u8 P0 k) k7 @$ f7 S% v

$ Z  e) D7 n( Z. N( m这样我们能防止许多系统文件被读,比如:/etc/passwd等。
* t2 z' Y6 X2 ?: l/ j上传目录和上传脚本的属主也要设成一样,否则会出现错误的,在safe_mode下这些要注意。 ; d! @2 b  Y* {9 t  T

" O$ |  \) o) g
& s; p/ q/ L* f# s( \% R6、mysql的启动权限设置 + g# f, r5 \' y! \; D9 Y
0 }+ P( y0 W# T' n
mysql要注意的是不要用root来启动,最好另外建一个mysqladm用户。可以在/etc/rc.local等
  _8 A/ T3 s% x1 I1 r系统启动脚本里加上一句:
, Y3 e) S+ A& D& s* f$ w4 c2 a7 u4 h1 P; P$ g% E1 H6 v
su mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"
4 _8 Y- }$ p% U( O: }& n* o, m' x2 z4 B3 `) N8 X: w. W
这样系统重启后,也会自动用mysqladmin用户启动mysql进程。
* |3 |. z7 I) Q4 z, @  U
/ d" V) N& J% S! u' k
2 I; T; r9 v# b" t7、日志文件及上传目录的审核及 & a+ M' U# c! ~3 Y/ W8 v0 w/ Q2 W
- E3 K, ~: ?: G
查看日志和人的惰性有很大关系,要从那么大的日志文件里查找攻击痕迹有些大海捞针,而且- [! m# w' ?8 I6 i5 x. ^
也未必有。web上传的目录里的文件,也应该经常检查,也许程序有问题,用户传上了一些非
. p6 X* |" e% o) ?法的文件,比如执行脚本等。 9 \% O  ^+ z2 t5 U& R( D% k
* P" C3 q) x* E2 U% T. j
3 W% X+ v0 b! l6 N
8、操作系统自身的补丁 # d2 T1 P2 H  s
0 |, T" C* r. z) v, r' T' K
一样,给系统打已知漏洞的补丁是系统管理员最基本的职责,这也是最后一道防线。
2 G2 a; X, s$ D- L7 q$ }$ }) s& I% l% ?
3 m' M5 |0 r, J) E5 \! u" A
经过以上的配置,虽然说不上固若金汤,但是也在相当程度上给攻击者的测试造成很多麻烦,
9 ?" ?6 `; x" a. f  t6 P即使php脚本程序出现比较严重的漏洞,攻击者也无法造成实际性的破坏。 7 X. G, b8 A$ v1 ]3 k
如果您还有更古怪,更变态的配置方法,希望能一起分享分享;) ; N; h9 I  K( A2 _, w
. Z, R$ `: z/ u- [

: F* Z4 w' Z0 |6 ]" ?参考资料: ) F8 D* i+ _( w2 V; A9 P8 ~, h% e
PHP Manual + ~7 F$ f! ?% b# g" V( O( F
http://www.zend.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 06:18 , Processed in 0.018528 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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