先放有问题的部分,目标拿到 flag:
public function __toString()
{
$num = count(scandir($this->filename));
if ($num > 0) {
return '什么也没有';
} else {
return 'flag_';
}
}
这里的 filename 可以通过反序列化指定,核心是需要绕过 count(scandir($this->filename)>0 的条件,这里 scandir 如果有目录,count 应该是>=2,如果是不存在的,就会报错。
有大佬有思路怎么绕过这个判断吗
1
hefish 2023-09-17 16:13:34 +08:00
网络路径看看
|
2
ysc3839 2023-09-17 16:30:50 +08:00 via Android
/dev /proc C:\ 不行吗?
|
4
ysc3839 2023-09-17 16:34:37 +08:00 via Android
https://www.php.net/manual/en/function.scandir.php#refsect1-function.scandir-notes
A URL can be used as a filename with this function if the fopen wrappers have been enabled. 可以往这方面看看 |
6
god 2023-09-17 17:22:57 +08:00 via iPad
常见的 _php_stream_scandir buffer overflow 吧
|
8
f14g 2023-09-17 22:38:12 +08:00 via Android
|
9
nuk 2023-09-17 23:00:28 +08:00 4
echo count(scandir("glob://123"));
|
10
god 2023-09-18 05:36:09 +08:00 via iPad
@nuk 有的版本可能警告报错哈,排除掉'..', '.' 两 entry 的空目录, scandir('glob://tmp/*.'); 要 scandir 返回 empty array ,count 返回 0 ,count |error|array 和 object 外别的类型就返回 1 ,https://github.com/php/php-src/blob/master/ext/standard/array.c#L285 。另外插一眼给 Perf, 比较 count vs empty vs == empty array 的主题可以看看。
|
11
cbasil 2023-09-20 17:00:18 +08:00
在$num = count(scandir($this->filename));前面加上文件夹是否存在的判断
<pre> if(!is_dir($this->filename)) return 'flag_'; </pre> |