PHP文件目录猜测漏洞

无论你用什么方法使用文件,你都要在某个地方指定文件名。在很多情况下,文件名会作为fopen()函数的一个参数,同时其它函数会调用它返回的句柄:香格里拉娱乐城

<?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服务器具有能读取该文件的权限,处理就会转向这个攻击者所指定的文件。如果路径的前导部分使用了被污染数据的话,这一类的漏洞会变得甚至更加庞大。

时间: 2024-10-08 06:40:17

PHP文件目录猜测漏洞的相关文章

整理一些PHP开发安全问题

整理一些PHP开发安全问题 php给了开发者极大的灵活性,但是这也为安全问题带来了潜在的隐患,近期需要总结一下以往的问题,在这里借翻译一篇文章同时加上自己开发的一些感触总结一下. 简介 当开发一个互联网服务的时候,必须时刻牢记安全观念,并在开发的代码中体现.PHP脚本语言对安全问题并不关心,特别是对大多数没有经验的开发者来说.每当你讲任何涉及到钱财事务等交易问题时,需要特别注意安全问题的考虑,例如开发一个论坛或者是一个购物车等. 安全保护一般性要点 不相信表单 对于一般的Javascript前台

php防止恶意刷新页面的方法

php防止恶意刷新页面的方法 一般来说,恶意刷新就是不停的去刷新提交页面,导致出现大量无效数据,下面我们来总结一下php 防止恶意刷新页面方法总结. 防止恶意刷页面的原理是: 要求在页面间传递一个验证字符串, 在生成页面的时候 随机产生一个字符串, 做为一个必须参数在所有连接中传递.同时将这个字符串保存在session中. 点连接或者表单进入页面后,判断session中的验证码是不是与用户提交的相同,如果相同,则处理,不相同则认为是重复刷新. 在处理完成后将重新生成一个验证码,用于新页面的生成

《PHP安全编程系列》系列分享专栏

PHP安全编程系列收藏夹收藏了有关PHP安全编程方面的知识,对PHP安全编程提供学习参考 <PHP安全编程系列>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201738.html 文章 discuz的php防止sql注入函数 php防止xss攻击的方法 PHP安全编程:register_globals的安全性 PHP安全编程:对输出要进行转义 PHP安全编程:过滤用户输入 PHP安全编程:可用性与数据跟踪 PHP安全编程:网站安全设计

Android 安全开发之 ZIP 文件目录遍历

1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接so.dex或者odex文件,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害用户的设备安全和信息安全.比如近段时间发现的"寄生兽"漏洞.海豚浏览器远程命令执行漏洞.三星默认输入法远程代码执行漏洞等都与ZIP文件目录遍历有

Android APP漏洞挖掘

0x00 1.组件公开安全漏洞 参考Android 组件安全. 2.Content Provider文件目录遍历漏洞 参考Content Provider文件目录遍历漏洞浅析. 3.AndroidManifest.xml中AllowBackup安全检测 参考两分钟窃取身边女神微博帐号?详解Android App AllowBackup配置带来的风险. 4.Intent劫持风险安全检测 参考Android组件通信过程风险. 5.数据存储安全检测 参考Android Database配置模式安全风险

[经验交流] (最新)移动App应用安全漏洞分析报告 !

漏洞扫描方式主要分为静态和动态,静态扫描的漏洞类型主要包含SQL注入风险.webview系列.文件模式配置错误.https不校验证书.database配置错误等.动态扫描的漏洞类型主要包含拒绝服务攻击.文件目录遍历漏洞.file跨域访问等. 本报告选取11类android app中同等数量的热门app,其活跃用户量可覆盖83%的移动端网民,根据阿里巴巴移动安全中心对这些app的漏洞检测,得到以下结论: 参与检测的android app中,近97%的app都存在漏洞问题,且平均漏洞量高达40个.

(最新)移动App应用安全漏洞分析报告 !

漏洞扫描方式主要分为静态和动态,静态扫描的漏洞类型主要包含SQL注入风险.webview系列.文件模式配置错误.https不校验证书.database配置错误等.动态扫描的漏洞类型主要包含拒绝服务攻击.文件目录遍历漏洞.file跨域访问等. 本报告选取11类android app中同等数量的热门app,其活跃用户量可覆盖83%的移动端网民,根据阿里巴巴移动安全中心对这些app的漏洞检测,得到以下结论: 参与检测的android app中,近97%的app都存在漏洞问题,且平均漏洞量高达40个.

Android安全开发之ZIP文件目录遍历

1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接so.dex或者odex文件,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害用户的设备安全和信息安全.比如近段时间发现的"寄生兽"漏洞.海豚浏览器远程命令执行漏洞.三星默认输入法远程代码执行漏洞等都与ZIP文件目录遍历有

Android安全之旅系列博客导读

总结下近一年的学习经历,以中国的新年为节点.时间从2015年年后到今天,2015年年末. 首先我必须要感谢前辈的书籍和高质量的博客. 1.重新学习了一遍<Linux内核源代码情景分析上下册>,毛德操著,并记录学习历程,写下了博客. 2.重新学习了一遍<Android系统源代码情景分析>,罗升阳著,并记录从开机启动到Home界面的展示整个流程. 3.学习了一个小型java虚拟机的源代码,并调试修改源代码中的错误,最后可以运行了.参考链接https://github.com/cloud