对于脚本安全这个话题好像永远没完没了,如果你经常到国外的各种各样的bugtraq上,你会发现有一半以上都和脚本相关,诸如SQL
injection,XSS,Path Disclosure,Remote commands execution这样的字眼比比皆是,我们看了之后的用途难道仅仅是抓肉鸡?对于我们想做web安全的人来说,最好就是拿来学习
,可是万物抓根源,我们要的不是鱼而是渔。在国内,各种各样的php
程序1.0版,2.0版像雨后春笋一样的冒出来,可是,大家关注的都是一些著名的cms,论坛,blog程序,很少的人在对那些不出名的程序做安全检测,对于越来越多的php程序员和站长来说,除了依靠服务器
的堡垒设置外,php程序本身的安全多少你总得懂点吧。
有人说你们做php安全无非就是搞搞注入和跨站什么什么的,大错特错,如果这样的话,一个magic_quotes_gpc或者服务器里的一些安全设置
就让我们全没活路了:(。我今天要说的不是注入,不是跨站,而是存在于php程序中的一些安全细节问题。OK!切入正题。
注意一些函数
的
过滤有些函数在程序中是经常使用的,像
include(),require(),fopen(),fwrite(),readfile(),unlink(),eval()以及它们的变体函数
等等。这些函数都很实用,实用并不代表让你多省心,你还得为它们多费点心。 :)
1.include(),require()和
fopen(),include_once(),require_once()这些都可以远程调用文件,对于它们的危害,google搜一下你就会很明
了,对于所包含调用的变量没过滤好,就可以任意包含文件从而去执行。举个例子,看print.php……
if (empty ($bn) ) { //检查是变量$bn是否为空include ("$cfg_dir/site_${site}.php"); //把$cfg_dir这个路径里的site_${site}.php包含进来……
不管存不存在$cfg_dir目录,$site这个变量你可以很自然的去使用,因为他根本没检查$site变量啊。可以把变量$site指定远程文件去
调用,也可以是本地的一个文件,你所指定的文件里写上php的语句,然后它就去包含执行这个含有php语句的文件了。就像这样列出文件目录甚至可以扩展到
包含一些管理员文件,提升权限,典型的像以前phpwind,bo-blog的漏洞一样。除了依靠php.ini里的allow_url_fopen设为
off禁止远程使用文件和open_base_dir禁止使用目录以外的文件外,你还得事先声明好只能包含哪些文件,这里就不多说废话了。
2.fopen(),file(),readfile(),openfile(),等也是该特别留意的地方