考虑以下代码
<?php
// warning: this code is unsafe and for demonstrational purposes only,
// do not use in a production environment
$filename = $_GET['filename'];
$extension = 'txt';
$path = '/absolute/path';
$fullFilename = sprintf('%s/%s.%s', $path, $filename, $extension);
echo file_get_contents($fullFilename);
我们都知道(至少我希望如此)预先设置绝对路径绝不是防止离开给定路径的充分方法——人们可以简单地../
在查询字符串中插入一个或多个 " " 以到达文件上的任何路径系统。
我的问题是:与给定的示例类似,$_GET['filename']
也可以通过绕过给定扩展后缀的方式进行操作,即回显 .txt 以外的文件?我特别想到了某些控制字符,它们../
以与前缀相同的方式绕过附加的文件扩展名。
我尝试在查询字符串中添加一些控制字符(例如用于删除的 ASCII 代码 127)或使用&&
,|
或连接两个文件名>
,但都无济于事,我想知道是否存在这种可能性。
(顺便说一句,我想补充一点,这个问题并不是为了利用系统而提出的。这纯粹是我最近想到的一个假设性问题。)