在PHP中,show_source()函数(别名为highlight_file())用于以带有语法高亮的格式显示指定文件的源代码。它常被用于调试或展示代码片段。然而,如果在调用show_source()时未对输入路径进行严格验证,就可能引发路径遍历攻击,从而导致敏感文件泄露,造成严重安全隐患。
路径遍历攻击是指攻击者通过操纵文件路径参数,访问服务器上原本不应公开的文件。攻击者通常使用类似../的目录跳转符号,绕过访问限制,读取系统敏感文件(如/etc/passwd、配置文件、数据库连接信息等),造成信息泄露。
示例代码:
<?php
if (isset($_GET['file'])) {
show_source($_GET['file']);
}
?>
如果没有对$_GET['file']的输入进行过滤,攻击者可以通过如下请求访问任意文件:
http://gitbox.net/script.php?file=../../../../etc/passwd
这样会导致服务器直接输出/etc/passwd文件内容,造成严重信息泄露。
限定访问目录
只允许访问预设目录中的文件。例如,将允许访问的文件目录定义为/var/www/html/sources/,任何请求都必须在该目录下查找:
<?php
$baseDir = '/var/www/html/sources/';
if (isset($_GET['file'])) {
$file = basename($_GET['file']); // 仅保留文件名,避免目录穿越
$path = realpath($baseDir . $file);
if ($path !== false && strpos($path, $baseDir) === 0 && is_file($path)) {
show_source($path);
} else {
echo "非法文件路径!";
}
}
?>
过滤和验证输入
使用basename()函数移除路径中的目录信息。
结合realpath()验证文件的真实路径,确保文件位于指定目录中。
验证文件存在且是普通文件。
禁用用户直接传入路径
最好通过预定义的文件列表或者ID映射表来确定要展示的文件,而不是让用户直接传递文件路径。
关闭危险函数显示
在生产环境中,尽量避免公开源码显示功能,或者设置权限限制,防止未经授权访问。
show_source()函数本身并不带有安全漏洞,但如果不谨慎处理输入路径,容易导致路径遍历攻击,泄露服务器敏感信息。防范关键在于严格验证用户输入的路径,限制文件访问范围,避免任意路径被传入执行。通过上述措施,可以有效防止路径遍历攻击,保障系统安全。