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

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

[复制链接]
发表于 2004-5-31 00:23:03 | 显示全部楼层 |阅读模式
发布日期:2001-11-27
- z  m) |$ x, J/ x* i文章内容:3 O+ i1 D# ~- {: X$ L' q
--------------------------------------------------------------------------------8 @9 ~3 Q- I, O: ~- L# u

% V, X3 O4 T) ]* D作者:san(小许) san@nsfocus.com ) y4 r$ p5 v, C
# D6 z8 o7 p5 ?* C! w1 x! Q
--------------------------------------------------------------------------------
7 V, _8 u3 n  T$ w5 L9 X; Z! S4 l; [) `6 L1 v- T9 t
前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题,以
* U/ L; X# ?# v及如何通过应用程序漏洞突破系统,这篇文章我们来通过对php的一些服务器端特性来进行配
6 o; [1 S( p, J, G6 ?置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题,对用户输入进行严格的
4 H4 [, E" u6 c4 I; @; D! f% g过滤,但是常在岸边走哪有不湿鞋,吃烧饼哪有不掉芝麻,人有失蹄马有失手,连著名的+ Y) p  v; m7 t4 j
phpnuke、phpMyAdmin等程序都出现过很严重的问题,更何况象我等小混混写的脚本。所以现" _: [# n7 O1 \7 b! J9 _- Z
在我们假设php脚本已经出现严重问题,比如象前一阵子phpnuke的可以上传php脚本的大问题
3 [: r2 q7 c( H% j了,我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。 ! k- W( E* X/ L  V. \
- @. j  I9 A9 r9 u* T  A; S% o, |
$ T+ R& I8 n! a. [
1、编译的时候注意补上已知的漏洞
# u1 @: V+ ~+ r6 h8 Y( w* |5 |: x& {1 K1 A0 k1 O
从4.0.5开始,php的mail函数加入了第五个参数,但它没有好好过滤,使得php应用程序能突
0 m4 N1 D$ J! W: y破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源
4 p: y, w' O$ R1 R$ i/ a5 S码包里ext/standard/mail.c文件,禁止mail函数的第五参数或过滤shell字符。在mail.c文件
; I! E" W- t4 d' M的第152行,也就是下面这行:
+ V8 }$ a+ a6 _4 n6 }- Q9 u, b. ]$ @: p
if (extra_cmd != NULL) {
$ T! u: ~8 |& ~& L4 q$ b8 i$ N  I1 i$ ?" \9 n
后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php
$ ]- s2 K, v$ X7 o# J, O那么我们就修补了这个漏洞。 & Q" n- [2 o6 ]8 l" e
7 ^; I( R5 M/ ]8 h

& y  o* e8 i; @2、修改php.ini配置文件   t0 _0 [2 H0 Z0 I

: T" ?$ g' P+ C- C, ^2 s( b" V- a9 k以php发行版的php.ini-dist为蓝本进行修改。
/ Z5 c3 k0 q) P9 Z' P4 e( ]; l/ J& i
1)Error handling and logging 3 D* y! K: y: u7 |, @, z: B
在Error handling and logging部分可以做一些设定。先找到: 8 l8 \1 \: O* K# u
display_errors = On
* F7 i$ E9 [0 b1 O0 _' H2 B
) i- U% F% O8 Ephp缺省是打开错误信息显示的,我们把它改为: 1 n5 Y8 D6 j' ~

9 W. B( u0 z' ndisplay_errors = Off / c& Y. J! v; e- X/ _% |

9 Y" A8 j9 ]6 K  ^关闭错误显示后,php函数执行错误的信息将不会再显示给用户,这样能在一定程度上防止攻/ z' r# X  l) y: l
击者从错误信息得知脚本的物理位置,以及一些其它有用的信息,起码给攻击者的黑箱检测造. \; ]1 \1 c( [9 \# Y
成一定的障碍。这些错误信息可能对我们自己有用,可以让它写到指定文件中去,那么修改以6 k0 H) V+ o  Q
下: ; a5 p3 g0 O6 o2 C) u# a
( K" d% j2 `9 r8 f  K
log_errors = Off 7 S" g9 |5 j$ \4 n8 `$ o0 A
2 V" V& K( B! F& _
改为:
# N7 {' Q  n7 X$ |, Blog_errors = On
5 x# D2 \# \, M0 G4 q; N, D, i3 Y, G+ f  e! ^' n4 y9 J6 M
以及指定文件,找到下面这行:
; J; R- T6 V5 T0 G# p5 j/ R" b6 M5 P* g) w/ D( Y5 p3 r- u0 X4 K+ K
;error_log = filename
( C6 V9 {9 @) B# |8 C: L( |
- c$ P3 ~" S) K& X去掉前面的;注释,把filename改为指定文件,如/usr/local/apache/logs/php_error.log 3 i/ g: {# f8 @

. `7 z( N) p& F* Y3 x0 `error_log = /usr/local/apache/logs/php_error.log : D% I1 H1 u, o9 o- u
! A$ z' T) Q$ F9 P$ V5 n) y
这样所有的错误都会写到php_error.log文件里。
  K0 |, t4 Z  ]8 @! Z6 u* R8 G; j/ I4 _* B1 l
2)Safe Mode
7 f  I- ^# J  {9 _8 o# @8 R: H( `/ ~1 ~. o
php的safe_mode功能对很多函数进行了限制或禁用了,能在很大程度解决php的安全问题。在
+ }# f. x3 |! s; a6 E7 x1 s; QSafe Mode部分找到: 3 c0 M1 H$ y" Y. `' U4 a
0 n' @. L1 L) Y% z
safe_mode = Off
. H: @; ~; d# S9 i6 i: @0 V# h, [. E4 J9 y% k; I
改为: " @- r9 }0 U( N& o  {( _

: s( J6 n" y+ Z2 `+ L. N, G; C. v6 jsafe_mode = On
# i& T% W7 R7 N$ m; j9 H1 H4 E% G% O" S4 F, `; R7 T
这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和``被禁止,其它: N5 d2 e" _) |& Y
的一些执行函数如:exec(), system(), passthru(), popen()将被限制只能执行. F" e; l9 r( x3 M6 @$ l
safe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序,找到以下: ) b% q; U6 o9 M& n  Z  R# t

9 V* k6 {! }1 F- a' {3 b6 Ssafe_mode_exec_dir =
- q$ X, w+ l+ m* N. A5 d0 ]9 P; H3 k* T2 L- Q/ n
指定要执行的程序的路径,如:
6 s8 H- F) j3 Z; S
) E; B7 L2 ]6 I- e7 }2 isafe_mode_exec_dir = /usr/local/php/exec
# o$ g; [5 Y& e! A+ v6 D. J
% ~6 I: i# r8 D8 S0 y) f8 {然后把要用的程序拷到/usr/local/php/exec目录下,这样,象上面的被限制的函数还能执行: E: _( N  f9 A: Z' a/ o- b
该目录里的程序。
6 c3 s5 j" M7 {3 n- E& f' ^* Z9 N# B" U% x3 V  f
关于安全模式下受限函数的详细信息请查看php主站的说明:
, W$ f0 B1 a, s4 ?6 d( |http://www.php.net/manual/en/features.safe-mode.php
8 o# H! t( J7 X' n) p0 o; C7 w
3)disable_functions % U0 ?3 e( o! R; \5 f
$ `- }; l3 x0 E" Z7 g3 {
如果你对一些函数的危害性不太清楚,而且也没有使用,索性把这些函数禁止了。找到下面这5 X3 S# V- w( j1 w
行:
) W; Z9 t0 X0 E" R$ N* ]
  `2 K$ I( Q" B( T  Fdisable_functions =
' x: i; t# Z1 ?8 u% M' ~5 h& V( U3 }! t  C* Y. q
在”=“后面加上要禁止的函数,多个函数用”,“隔开。 2 o$ a7 ~+ M- R2 T" s
9 e1 @4 P- k4 }0 V

  I7 T( e' ~( h3 \$ w; J; C" W3、修改httpd.conf
1 C3 f% a. J! W4 {: }( Y$ Z
6 e/ s2 \% [, n0 o" j( a3 B如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作
2 K' S8 K( e8 N4 o路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行: , G8 k" B$ j$ g
7 A# j8 w* x& K0 v* H  @1 ^) E) _6 q
<Directory /usr/local/apache/htdocs> + `" ~4 X+ r  N; l- R- b( {
php_admin_value open_basedir /usr/local/apache/htdocs
. E- C8 g/ z9 z! N5 b</Directory> 3 I8 h- n9 m1 ]4 q$ X

0 q4 z/ E( A( |/ [2 h) L这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打
3 f$ {. |+ K" O6 z9 I& k开的话会提示这样的错误: $ l6 |5 P. [1 a2 g( d, H; ^  O
8 F, P' z$ N8 O# Y* }
Warning: open_basedir restriction in effect. File is in wrong directory in
7 H) g4 e/ S- I' N/usr/local/apache/htdocs/open.php on line 4
8 n0 J0 b; j# n8 `, i3 Y( }- F" S/ B! O) s
等等。
0 q! [+ q/ u* Z3 \0 ?; B7 _0 T1 H5 V, i0 ~
5 x6 K0 ]5 B- e# q5 V
4、对php代码进行编译
6 f; o( V( y  }- y9 B- X. x0 M% F3 y3 k
Zend对php的贡献很大,php4的引擎就是用Zend的,而且它还开发了ZendOptimizer和: Z$ Z0 D2 n. g, ]6 E
ZendEncode等许多php的加强组件。优化器ZendOptimizer只需在http://www.zend.com注册就) c6 o' k0 z5 Q/ w) v5 I
可以免费得到,下面几个是用于4.0.5和4.0.6的ZendOptimizer,文件名分别对于各自的系统' e2 ?' M% _$ R( K  h
% |; C0 o5 j, X# v
% G" S1 X  K5 ?
ZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz
% x( b! d) M9 @0 u1 m; Q  Y5 |9 yZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz
- j( w5 T% l2 Q3 F1 tZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz
! D2 ~* y* c  [  G2 h! |6 @ZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip & u* D! s5 T& ?
0 c+ ]' o9 \6 }/ V
优化器的安装非常方便,包里面都有详细的说明。以UNIX版本的为例,看清操作系统,把包里
( h5 b2 h' ?$ }1 @5 _: w的ZendOptimizer.so文件解压到一个目录,假设是/usr/local/lib下,在php.ini里加上两句. G9 _$ a$ V3 @9 U( v5 z' H- v
9 `, ?2 l8 }5 u. x  E. }& N
& }$ |7 y2 {4 |# T
zend_optimizer.optimization_level=15
  w, x# [; f# Q5 E' Ozend_extension="/usr/local/lib/ZendOptimizer.so"
4 w2 v1 B+ G4 S
4 y& y8 y9 z5 M$ H) E& y; O就可以了。用phpinfo()看到Zend图标左边有下面文字:
, a. ]3 V0 L( Z
) I' e/ J! R4 c$ J9 kwith Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies ( G3 Q! q8 D  i/ z
+ r7 S4 {" A1 s: l, o) A6 i
那么,优化器已经挂接成功了。 * ^% b4 T# L+ j- f5 u5 Y

! ^8 v2 ^: [0 X: ]6 U! ~但是编译器ZendEncode并不是免费的,这里提供给大家一个http://www.PHPease.com的马勇设6 T% U  T/ F$ w( \) W
计的编译器外壳,如果用于商业目的,请与http://www.zend.com联系取得许可协议。
+ D2 _+ _8 K. [# r
" s9 ]/ N$ }6 H5 _3 ~php脚本编译后,脚本的执行速度增加不少,脚本文件只能看到一堆乱码,这将阻止攻击者进
) F! ?* s8 ~6 p) u" w# l4 }' H/ [一步分析服务器上的脚本程序,而且原先在php脚本里以明文存储的口令也得到了保密,如, f8 h- _, U! [; x
mysql的口令。不过在服务器端改脚本就比较麻烦了,还是本地改好再上传吧。
" t. Z; P  J/ v8 A9 q& I) o- u  u2 U) F3 F2 E* Z
. Q! w9 j, L: U: V. `1 R
5、文件及目录的权限设置 & p# x; P$ j) }1 b7 R

' K9 M4 n7 K4 b# x9 l+ Iweb目录里除了上传目录,其它的目录和文件的权限一定不能让nobody用户有写权限。否则,
* O2 q3 t3 N: B) A) d+ i' t攻击者可以修改主页文件,所以web目录的权限一定要设置好。 ; W2 I% i# C# j) m' m

3 B+ r: d5 B! m. H% ^7 `: s5 h还有,php脚本的属主千万不能是root,因为safe_mode下读文件的函数被限制成被读文件的属1 X- v) Z7 J% H( J5 o
主必须和当前执行脚本的属主是一样才能被读,否则如果错误显示打开的话会显示诸如以下的
' {( ^/ u+ ?( C4 v错误:
, o' z- u' c% s9 B  M8 j/ V6 g$ A: X: ~0 N8 t3 m$ h
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not 4 X6 f) I1 n! h4 V- C( k
allowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php % c! S- b0 e! ^' w; @
on line 3
  x1 V- F7 K) V) v! _, q) L7 H$ D2 ?
/ D1 O% \$ j2 Z7 l) b这样我们能防止许多系统文件被读,比如:/etc/passwd等。
" L7 q4 T; B$ O$ o上传目录和上传脚本的属主也要设成一样,否则会出现错误的,在safe_mode下这些要注意。
. V! [' c9 A0 c9 N4 e1 {, _& q. L
. |$ b: T  C$ ?: j2 n
6、mysql的启动权限设置
5 |& _- H2 _$ S1 f
5 c) {, y! f8 ymysql要注意的是不要用root来启动,最好另外建一个mysqladm用户。可以在/etc/rc.local等$ q9 q- k" E- T: Z: E
系统启动脚本里加上一句:
( j% S/ F1 ^" ?" N# F  N# p% W1 S5 f! m( ^
su mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"
, g- c5 G# `6 M  D/ `7 x/ J" l) r6 }1 R2 A
这样系统重启后,也会自动用mysqladmin用户启动mysql进程。 1 L$ `! t' @5 U
9 u: p/ l5 Q1 _2 Q3 ~
% C  _6 W: r% B2 n& t: _
7、日志文件及上传目录的审核及 # A, c- H  G1 T3 J6 `
# y# ^  W! T) N- q; X9 |
查看日志和人的惰性有很大关系,要从那么大的日志文件里查找攻击痕迹有些大海捞针,而且3 X  D+ C; d0 [( D0 e; l( N
也未必有。web上传的目录里的文件,也应该经常检查,也许程序有问题,用户传上了一些非* z+ K/ U7 P0 r9 _, s
法的文件,比如执行脚本等。 # E. ~/ j- I9 M3 M  X

* ]0 N7 W/ J. ]2 I
( ~, Z- P, C6 m8、操作系统自身的补丁 7 ], \2 ?! i# ~: H5 O
* C9 S6 i1 L2 j. I+ e
一样,给系统打已知漏洞的补丁是系统管理员最基本的职责,这也是最后一道防线。
, @. R. ~, d7 _9 T7 V. s1 y
1 j/ [" Q1 i$ ^( o
' Y% b( i; T4 U* p经过以上的配置,虽然说不上固若金汤,但是也在相当程度上给攻击者的测试造成很多麻烦,
- n4 E" y; U6 U2 e) o" v0 d* z即使php脚本程序出现比较严重的漏洞,攻击者也无法造成实际性的破坏。
$ c/ u. d3 f( O5 X如果您还有更古怪,更变态的配置方法,希望能一起分享分享;)
  ^; K: ]5 b) W% s) n% Z/ `4 |: u9 n" T: T+ V
6 C, j" T. _9 F6 U" e, B4 l
参考资料: - C( q' r* N4 }  W7 ?4 Q
PHP Manual
- Q' z0 e( Q/ k9 s0 L& Vhttp://www.zend.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 08:56 , Processed in 0.015989 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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