重燃你的PHP安全之火

对于脚本安全这个话题好像永远没完没了,如果你经常到国外的各种各样的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(),等也是该特别留意的地方。函数本身并没什么,它们的作用是去打开文件,可是如果对变量过滤不彻底的话,就会泄露源代码 。这样的函数文本论坛里会有很多。

  ……

   $articlearray=openfile("$dbpath/$fid/$tid.php"); //打开$dbpath/$fid这个路径的$tid.php文 件$topic_detail=explode("|",$articlearray[0]); //用分割符|读出帖子的内容……

  很眼熟吧,这是ofstar以前版本的read.php,$fid和$tid没有任何过滤,$tid指定为某个文件提交,就发生了原代码泄露。就像这样。

  http://explame.com/ofstar/read.php?fid=123&tid=……/index $tid会被加上php的后缀,所以直接写index.这仅仅是个例子,接着看吧。

  3.fwrite()和它的变体函数这种漏洞想想都想得出,对于用户提交的字符没过滤的话,写入一段php后门又不是不可以。

  4.unlink()函数,前段时间,phpwind里任意删除文件就是利用这个函数,对于判断是否删除的变量没过滤,变量可以指定为任意文件,当然就可以删除任意文件的变量。

  5.eval(),preg_replace()函数,它们的作用是执行php代码,如果字符串没被经过任何过滤的话,会发生什么呢,我就常看见一些cms里面使用,想想,一句话的php木马不就是根据eval()原理制作的吗?

   6.对于system()这些系统函数,你会说在php.ini里禁止系统函数,对,这也是好办法,可是象一些程序里需要,那是不是就不用了呢?就像上 次我看到的一套很漂亮的php相册一样。另外对于popen(),proc_open(),proc_close()函数你也得特别注意,尽管他们执行命 令后并没有直接的输出,但你想这到底对黑客们有没有用呢。再这里php提供提供了两个函 数,escapeshellarg(),escapeshellcmd(),这两个函数用来对抗系统函数的调用攻击,也就是过滤。

  对于危害,来举个例子,我们来看某论坛prod.php 07 $doubleApp = isset($argv[1]); //初始化变量$doubleApp……

   14 if( $doubleApp ) //if语句15 { 16 $appDir = $argv[1]; //初始化$appDir 17 system("mkdir $prodDir/$appDir"); //使用系统函数system来创建目录$prodDir/$appDir

   本来是拿来创建$prodDir/$appDir目录的,再接着看上去,程序仅仅检测是否存在$argv[1],缺少对$argv[1]的必要过滤,那 么你就可以这样/prod.php?argv[1]=|ls%20-la或者/prod.php?argv[1]=|cat%20/etc /passwd(分割符 | 在这里是UNIX的管道参数,可以执行多条命令。)

  到这里,常见的漏洞类型应该知道点了吧。

   对于特殊字符的重视对于特殊字符,有句话叫All puts is invalid.外国人文章里这句话很常见的。所有输入都是有害的。你永远不要对用户所输入的东西省心,为了对付这些危害,程序员都在忙着过滤大把大把的 字符,唯恐漏了什么。而有些程序员呢?好像从没注意过这些问题,从来都是敞开漏洞大门的。不说废话,还是先看看下面这些东西吧。

  1.其实程序的漏洞里最关键,最让开发 者 放心不下的就是带着$符号的美元符号,变量,对于找漏洞的人来说,抓着变量两个字就是一切。就像目录遍历这个bug,很多邮件程序都存在,开发者考虑的很 周全,有的甚至加上了网络硬盘这个东西,好是好,就像http://mail.com/file.php?id=1&put=list& tid=1&file=./要是我们把file这个变量换成。/……/甚至更上层呢?目录就这样被遍历了。

  2.尖括号"<>"跨站你不会不知道吧,一些搜索栏里,文章,留言,像前段时间phpwind附件那里的跨站等等。当然,对于跨站问题,你要过滤的远远不止尖括号。不怕过滤时漏掉什么,而是怕你想不起要去过滤。

  3.斜杆和反斜杆:对于/和/的过滤,记得魔力论坛的附件下载处的原代码泄露吗?

   attachment.php?id=684&u=3096&extension=gif&attach=./……/…… /……/……/……/……/includes/config.php&filename=1.gif对于过滤…… / /的问题,像windows主机不仅要过滤……/还要过滤……/,windows主机对/会解析为/,这些细节跟SQL injection比起来,什么才叫深入呢?

  4.对于反引号(``),反引号在php中很强大,它可以执行系统命令,就像system()这些系统函数一样,如果用户的恶意语句被它所执行的话就会危害服务器,我想除了服务器设置的很好以外,对于它们,你还是老老实实的过滤好吧。

  5.对于换行符,NULL字符等等,像"/t,/x0B,/n,/r,/0这些,这些都是很有用的,像动网以前的上传漏洞就是因为上传中的NULL(/0)字符引起的,对于这些能随意截断程序流程的字符,你说我们在检测的时候应该有多细心呢?

  6.分号(;)和分割符(|)

   分号截断程序流程,就像这个shell_exec("del ./yourpath/$file"); //使用系统函数shell_exec删除文件$file变量$file没指定,那么直接写zizzy.php;del ./yourpath ,这样你的yourpath目录也就被del了。

  分割符(|)是UNIX里自带的管道函数,可以连接几条命令来执行。有时候加在过滤不严的系统函数中执行。

你可能感兴趣的:(PHP,File,服务器,System,include,extension)