PHP安全编程:文件目录猜测漏洞
2012-05-09 00:00
1846 查看
无论你用什么方法使用文件,你都要在某个地方指定文件名。在很多情况下,文件名会作为fopen()函数的一个参数,同时其它函数会调用它返回的句柄:
当你把被污染数据作为文件名的一部分时,漏洞就产生了:
由于在本例中路径和文件名的前后两部分无法由攻击者所操纵,攻击的可能性受到了限制。可是,需要紧记的是有些攻击会使用NULL(在URL中表示为%00)来使字符串终止,这样就能绕过任何文件扩展名的限制。在这种情况下,最危险的攻击手段是通过使用多个../来方问上级目录,以达到文件系统跨越的目的。例如,想像一下filename的值被指定如下:
http://example.org/file.php?file ... nother/path/to/file
与许多攻击的情况相同,在构造一个字串时如果使用了被污染数据,就会给攻击者以机会来更改这个字串,这样就会造成你的应用以你不希望方式运行。如果你养成了只使用已过滤数据来建立动态字串的习惯,就可以防止很多类型包括很多你所不熟悉的漏洞的出现。
由于fopen()所调用的文件名前导的静态部分是/path/to,所以上面的攻击中向上跨越目录的次数比所需的更多。因为攻击者在发起攻击前无法察看源码,所以典型的策略是过多次地重复../字串。../字串使用太多次并不会破坏上面的攻击效果,所以攻击者没有必要猜测目录的深度。
在上面的攻击中使fopen()调用以你不希望方式运行,它简化后等价于:
在意识到这个问题或遭遇攻击后,很多开发者都会犯试图纠正潜在的恶意数据的错误,有时根本不会先对数据进行检查。正如第一章所述,最好的方法把过滤看成检查过程,同时迫使使用者遵从你制定的规则。例如,如果合法的文件名只包含字母,下面的代码能加强这个限制:
并没有必要对filename值进行转义,这是因为这些数据中只用在PHP函数中而不会传送到远程系统。
basename( )函数在检查是否有不必要的路径时非常有用:
这个流程比只允许文件名是字母的安全性要差了一些,但你不太可能要求那样严格。比较好的深度防范流程是综合上面的两种方法,特别是你在用正则表达式检查代码合法性时(而不是用函数ctype_alpha( ))。
当文件名的整个尾部是由未过滤数据组成时,一个高危漏洞就产生了:
给予攻击者更多的灵活性意味着更多的漏洞。在这个例子中,攻击者能操纵filename参数指向文件系统中的任何文件,而不管路径和文件扩展名是什么,这是因为文件扩展名是$_GET['filename']的一部分。一旦WEB服务器具有能读取该文件的权限,处理就会转向这个攻击者所指定的文件。如果路径的前导部分使用了被污染数据的话,这一类的漏洞会变得甚至更加庞大。
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的安全模式
<?php $handle = fopen('/path/to/myfile.txt', 'r'); ?>
当你把被污染数据作为文件名的一部分时,漏洞就产生了:
<?php $handle = fopen("/path/to/{$_GET['filename']}.txt", 'r'); ?>
由于在本例中路径和文件名的前后两部分无法由攻击者所操纵,攻击的可能性受到了限制。可是,需要紧记的是有些攻击会使用NULL(在URL中表示为%00)来使字符串终止,这样就能绕过任何文件扩展名的限制。在这种情况下,最危险的攻击手段是通过使用多个../来方问上级目录,以达到文件系统跨越的目的。例如,想像一下filename的值被指定如下:
http://example.org/file.php?file ... nother/path/to/file
与许多攻击的情况相同,在构造一个字串时如果使用了被污染数据,就会给攻击者以机会来更改这个字串,这样就会造成你的应用以你不希望方式运行。如果你养成了只使用已过滤数据来建立动态字串的习惯,就可以防止很多类型包括很多你所不熟悉的漏洞的出现。
由于fopen()所调用的文件名前导的静态部分是/path/to,所以上面的攻击中向上跨越目录的次数比所需的更多。因为攻击者在发起攻击前无法察看源码,所以典型的策略是过多次地重复../字串。../字串使用太多次并不会破坏上面的攻击效果,所以攻击者没有必要猜测目录的深度。
在上面的攻击中使fopen()调用以你不希望方式运行,它简化后等价于:
<?php $handle = fopen('/another/path/to/file.txt', 'r'); ?>
在意识到这个问题或遭遇攻击后,很多开发者都会犯试图纠正潜在的恶意数据的错误,有时根本不会先对数据进行检查。正如第一章所述,最好的方法把过滤看成检查过程,同时迫使使用者遵从你制定的规则。例如,如果合法的文件名只包含字母,下面的代码能加强这个限制:
<?php $clean = array(); if (ctype_alpha($_GET['filename'])) { $clean['filename'] = $_GET['filename']; } else { /* ... */ } $handle = fopen("/path/to/{$clean['filename']}.txt", 'r'); ?>
并没有必要对filename值进行转义,这是因为这些数据中只用在PHP函数中而不会传送到远程系统。
basename( )函数在检查是否有不必要的路径时非常有用:
<?php $clean = array(); if (basename($_GET['filename']) == $_GET['filename']) { $clean['filename'] = $_GET['filename']; } else { /* ... */ } $handle = fopen("/path/to/{$clean['filename']}.txt", 'r'); ?>
这个流程比只允许文件名是字母的安全性要差了一些,但你不太可能要求那样严格。比较好的深度防范流程是综合上面的两种方法,特别是你在用正则表达式检查代码合法性时(而不是用函数ctype_alpha( ))。
当文件名的整个尾部是由未过滤数据组成时,一个高危漏洞就产生了:
<?php $handle = fopen("/path/to/{$_GET['filename']}", 'r'); ?>
给予攻击者更多的灵活性意味着更多的漏洞。在这个例子中,攻击者能操纵filename参数指向文件系统中的任何文件,而不管路径和文件扩展名是什么,这是因为文件扩展名是$_GET['filename']的一部分。一旦WEB服务器具有能读取该文件的权限,处理就会转向这个攻击者所指定的文件。如果路径的前导部分使用了被污染数据的话,这一类的漏洞会变得甚至更加庞大。
延伸阅读
此文章所在专题列表如下: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的安全模式
相关文章推荐
- PHP安全编程:主机文件目录浏览
- PHP安全编程之主机文件目录浏览
- PHP安全编程:主机文件目录浏览(转)
- PHP安全编程:主机文件目录浏览
- 常见的PHP安全漏洞-跨站、注入和文件包含
- PHP安全编程之打开远程文件的风险
- 文件上传下载中的安全问题(上传漏洞与目录遍历攻击)
- PHP 不安全文件权限漏洞
- PHP远程任意文件读取及目录遍历漏洞
- PHP安全编程之文件上传攻击的防御
- 解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
- 解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
- PHP安全编程:文件包含的代码注入攻击
- PHP安全编程:文件上传攻击的防御
- PHP ZipArchive::extractTo()函数.zip文件目录遍历漏洞
- PHP编程----遍历目录得到图片文件并输出
- web文件操作常见安全漏洞(目录、文件名检测漏洞)
- PHP安全编程:文件上传攻击的防御
- PHP安全编程:打开远程文件的风险
- PHP安全编程:文件包含的代码注入攻击