文件包含漏洞是什么 PHP网络开发详解:远程文件包含漏洞
PHP网络开发详解:远程文件包含漏洞
——此文章摘自《完全手册PHP网络开发详解》定价 ¥ 特价 ¥ 详细>>//track linktech cn/?m_id=dangdang&a_id=A &l= &l_type = width= height= border= nosave>由于PHP支持使用相同的函数对本地文件和远程文件进行操作 因此 一些恶意用户通过强行使网站上的PHP代码包含自己的文件来实现执行自己脚本的目的 以下代码实现了根据浏览器地址栏参数的文件名称包含不同文件的功能 <?php $file_name = $_GET[ filename ]; //获得当前文件名 include( $file_name ); //包含文件 //一些其他操作 ?>
这时 通过在地址栏上指定不同的文件名就可以实现包含不同文件并执行的功能 例如 通过在浏览器上访问//localhost/test php?filename=myinc php就可以在代码中包含并执行myinc php文件
由于上面的代码没有进行任何错误处理 在浏览器上不加参数运行 所以将得到以下运行结果 Warning: include( php) [function include]: failed to open stream: No such file or directory in C:Program FilesxampphtdocsBugstest php on line Warning: include() [function include]: Failed opening php for inclusion (include_path= ;C:Program Filesxamppphppear ) in C:Program FilesxampphtdocsBugstest php on line
访问者通过读取这段错误信息 可以得知当前的操作是一个文件包含操作 这时 可以在自己的服务器上放置一个相应的脚本程序 需要注意的是PHP在获取远程文件时获得的是远程服务器的最终输出结果 而不是文件本身 该脚本程序位于 服务器上 文件名为hello txt 脚本代码如下所示 <?php echo hello world! ; ?>

这时 通过在浏览器中访问//localhost/test php?filename=// /hello txt就可以运行hello txt中的脚本了
为了解决这个问题 一种方法是完善程序的错误信息 使访问者无法知道当前脚本正在包含参数中指定的文件 修改后的代码如下所示 <?php $file_name = $_GET[ filename ]; //获得当前文件名 if(!@include( $file_name php )) //包含文件 { die( 页面在浏览过程中出现错误 ); } //一些其他操作 ?>
修改后 如果在被包含的文件无法找到时将出现 页面在浏览过程中出现错误 的错误信息 访问者将无法获得当前页面的具体操作信息
第二种方法可以更加有效地防止远程文件包含攻击 方法是替换地址栏参数中的斜线 / 这样 在地址栏参数中输入远程文件地址时 程序将无法正确地获得参数 修改后的代码如下所示 <?php $file_name = str_replace( / $_GET[ filename ]); //获得当前文件名 if(!@include( $file_name php )) //包含文件 { die( 页面在浏览过程中出现错误 ); } //一些其他操作 ?>
lishixinzhi/Article/program/PHP/201311/21455