$7.49 .com domain with free InstantPage Website Builder$1.99 Web Hosting   捷飞网络官方淘宝店   Godaddy 优惠码
返回列表 发帖
分享到:




[安全] 完美解决同一服务Nginx的跨站(防WEBshell)访问限制问题(亲测)

本帖最后由 jim9 于 2011-11-26 03:27 编辑 % F* ^: }: Y% a4 g/ G

/ U5 M0 A3 r5 wnginx完美解决同一服务上的站点WebShell访问限制问题7 f8 ?9 O- o9 x& M3 p" Y
当时用phpspy2008测试权限,浏览等,都没有什么问题,但是没有在接近实际的环境中测试过,后来网友们反映还是经常有出现No input file specified.( ]* Z0 U! n7 T# W# d
后我本人又重新测试了一下,发现web服务器刚启动时正常,过了几分& s/ {6 ?8 g' B$ {/ G
钟以后随机性的会出现 No input file specified. 或者返回404。
( V* i0 G$ I* N% k5 U1 `心情很是郁闷,加上近几天自己的网站也准备加强一下安全措施,于是干脆着手修改php的源代码解决,经过几个小时的研究,终于完美解决了这个问题,而且由于本办法是修改php来实现的,故使用范围应该不限于nginx,也可以应用到其他的web服务器上。
( ?$ v9 P' t0 _2 e9 v9 Q# ~4 a现将修改办法公布如下,以CentOS 5.3 php 2.5.10 nginx 0.8.27为例 - P" U7 s+ ?4 ~! |; z4 ?

* m. q# O* D7 {: e. ~0 [9 A9 Sstep1: 依次执行命令.. 已下载并打过补丁的.此处可以省略跳到 step2.
7 u$ j4 @& U5 ^4 A* k9 F* @: K
7 I* W4 P, P' s  M. v
  1. # wget http://cn.php.net/get/php-5.2.10.tar.gz/from/this/mirror

  2. # wget http://php-fpm.org/downloads/php-5.2.10-fpm-0.5.13.diff.gz

  3. # tar zxvf php-5.2.10.tar.gz

  4. # gzip -cd php-5.2.10-fpm-0.5.13.diff.gz | patch -d php-5.2.10 -p1 //如果你用补丁的话先打补丁再改比较妥当,我没检查过补丁有没动这个文件

  5. # cd php-5.2.10/

  6. # ./configure ./configure -prefix=/usr/local/php -with-config-file-path=/usr/local/php/etc -with-mysql=/usr/ -with-mysqli=/usr/bin/mysql_config -with-iconv-dir=/usr/local -with-freetype-dir -with-jpeg-dir -with-png-dir -with-zlib -with-libxml-dir=/usr -enable-xml -disable-rpath -enable-discard-path -enable-safe-mode -enable-bcmath -enable-shmop -enable-sysvsem -enable-inline-optimization -with-curl -with-curlwrappers -enable-mbregex -enable-fastcgi -enable-fpm -enable-force-cgi-redirect -enable-mbstring -with-mcrypt -with-gd -enable-gd-native-ttf -with-openssl -with-mhash -enable-pcntl -enable-sockets -with-ldap -with-ldap-sasl -with-xmlrpc -enable-zip -enable-soap
复制代码

+ J! v; ?8 ?5 }5 W7 f8 H4 u# x) @( v
step 2 :2 T) E  \2 X5 }- e8 }0 X
  _! I% m5 U' U* r3 X) ^
# vi main/fopen_wrappers.c& X7 Y- S) j$ Y$ d; l3 i, |- h7 X9 R
1 ^% o2 s; z2 C5 x
找到: X$ f/ z) c1 F& I1 f+ v
7 K; |3 Q# _6 V" ~4 B( @
代码:
8 C) z5 ^/ G2 r1 e) Y( U( w  \
  1. /* {{{ php_check_open_basedir
  2. */
  3. PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
  4. {
  5. /* Only check when open_basedir is available */
  6. if (PG(open_basedir) && *PG(open_basedir)) {
  7.   char *pathbuf;
  8.   char *ptr;
  9.   char *end;

  10.   // 添加的内容开始 add by bbs.fjbjdd.com
  11.   char *env_doc_root;
  12.   if(PG(doc_root)){
  13.    env_doc_root = estrdup(PG(doc_root));
  14.   }
  15.   else{
  16.    env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
  17.   }
  18.   if(env_doc_root){
  19.    int res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
  20.    efree(env_doc_root);
  21.    if (res_root == 0) {
  22.     return 0;
  23.    }
  24.    if (res_root == -2) {
  25.     errno = EPERM;
  26.     return -1;
  27.    }
  28.   }  
  29.   // 添加的内容结束 add by bbs.fjbjdd.com

  30.   pathbuf = estrdup(PG(open_basedir));
  31.   ptr = pathbuf;
  32.   while (ptr && *ptr) {
  33.    end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
  34.    if (end != NULL) {
  35.     *end = '\0';
  36.     end++;
  37.    }
  38.    if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
  39.     efree(pathbuf);
  40.     return 0;
  41.    }
  42.    ptr = end;
  43.   }
  44.   if (warn) {
  45.    php_error_docref(NULL TSRMLS_CC, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
  46.   }
  47.   efree(pathbuf);
  48.   errno = EPERM; /* we deny permission to open it */
  49.   return -1;
  50. }
  51. /* Nothing to check... */
  52. return 0;
  53. }
  54. /* }}} */
复制代码
; ~, X. U5 ?: y# `1 I

3 @8 y4 O$ q/ O2 E两个 添加的内容 中间的是修改加上去的
( e0 }9 U, x0 [1 B
# N6 H- G7 d; ?+ F" B# @然后保存,退出。
6 A  b; v) P; C- z$ @0 {; p! G4 p9 q% z3 \( Z3 L) x% Z" C
step 3 :
5 N5 F% k9 C, a" |, S) G" v
2 `3 [7 _( [4 U- R4 u# N8 }
$ u8 Q5 Y2 ~4 R8 z7 m. t( l8 R6 S/ C
  1. # make ZEND_EXTRA_LIBS='-liconv'
  2. #make install
复制代码
) J$ b9 v$ T" K" b0 q* w

" T7 S% C3 ]$ O3 b8 E/ N* i% DOK,接下来改 php.in 的 配置
6 P+ M4 b, ?  i  g+ X8 E/ V  k& T
5 ~7 C5 q) b! dstep 4 :+ _6 ]% O# ^" M0 h4 Y

, B0 B. T1 `7 i* S: b, o$ V. b
1 X: E- R4 B+ L2 O' d  {
  1. #  vi /usr/local/php/etc/php.ini
复制代码
+ V9 G  Y7 t1 n1 x
" Q! E5 v( g: i5 j. p
找到:0 Q, \; |* e$ Q! B9 _" O3 L4 [; l
open_basedir 的配置项9 e1 L# ?, r6 B  a* @  e

! n1 r8 q6 y+ |- V5 v5 L% q
  1. open_basedir = "/tmp/:/var/tmp/"
复制代码
+ D0 a& w( b2 B. e2 P& _  z
8 i2 D' y- }' U/ [' b
nginx的配置无须做任何变动(无须添加 ../../../../../ 等繁琐的东西),完美限制在网站的根目录上,无法访问其他同一服务器上网站的文件。
4 [# p" n! h( \: W) d- r/ ~# @1 \+ ^) B( F0 ~
另外出现 no input files 绝不是网上某人说的原因。+ f6 R3 i" J1 t5 ?5 R9 m  x
4 Y# m! ^! n) K9 N, \6 `1 M
引用:6 D" R% _7 L; T
" Z' T9 E  q( y0 T5 j) S# z4 g4 e
nginx在80端口接受到访问请求后,会把请求转发给9000端口的php-cgi进行处理" C" v2 k5 n2 ]+ Q8 r/ m
而如果修改php.ini中open_basedir= ../../../../../ ,针对两个不同的网站,www.a.com , www.b.com 都会把请求发送给9000处理,而如果先访问www.a.com那么../../../../../ 就会变成A网站的根目录地址,然后这时候如果你访问www.b.com ,那么open_basedir仍然是A网站的根目录,但是对于B来说,又是不允许访问的,所以就造成了,第二个站点打开以后会出现no input files( M. M/ H* O& E( T' }/ w
代码清楚的表明 open_basedir 每次请求都是重新计算路径的,会出现所说的问题,是因为php执行的时候经常会改变当前路径,造成最后 ../../../../../ 以后路径不对,而不是请求一次open_basedir就固定了。
  r3 L% C7 G0 f1 t7 L) Q( C" K
( m2 Z2 X6 i( p$ a6 z本人亲自测试并成功再加以更改此文. 谢谢各位赏脸观看. 本站测试的环境版本:/ u' Q$ G7 I* N5 I
  q. ^+ g) l& ~4 W  v$ b' Y
CentOS 5.4 php 2.5.14 nginx 0.7.670 j- ]. S2 d8 N0 L  V% S/ Y* q

; q$ g. g9 ^+ \! X0 e参考: http://haply.info/?p=391
: L4 J$ J, @& D. F
1 C7 H$ }$ O  z* K) S( `0 z本文相关文件下载链接:
( l0 {+ D6 V9 ?  @# Q
本帖隐藏的内容需要回复才可以浏览
附件: 您需要登录才可以下载或查看附件。没有帐号?加入我们

美国VPS、域名代购:http://tu8l.taobao.com

返回列表
Namecheap
Namecheap.com - Cheap domain name registration, renewal and transfers - Free SSL Certificates - Web Hosting
互联网安全