
先放有问题的部分,目标拿到 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 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:0:18 +08:00 在$num = count(scandir($this->filename));前面加上文件夹是否存在的判断 <pre> if(!is_dir($this->filename)) return 'flag_'; </pre> |