CTF 比赛:有 PHP 大佬可以帮指点下关于 scandir 的问题吗

2023-09-17 15:52:55 +08:00
 sdushn

先放有问题的部分,目标拿到 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,如果是不存在的,就会报错。
有大佬有思路怎么绕过这个判断吗

2670 次点击
所在节点    PHP
11 条回复
hefish
2023-09-17 16:13:34 +08:00
网络路径看看
ysc3839
2023-09-17 16:30:50 +08:00
/dev /proc C:\ 不行吗?
ysc3839
2023-09-17 16:31:55 +08:00
@ysc3839 抱歉,看反了,以为是大于 0 输出。
ysc3839
2023-09-17 16:34:37 +08:00
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.
可以往这方面看看
sdushn
2023-09-17 16:50:56 +08:00
@ysc3839 是一个反序列化题目,指定 filename 是另一个类对象,就绕过了
god
2023-09-17 17:22:57 +08:00
常见的 _php_stream_scandir buffer overflow 吧
god
2023-09-17 19:01:50 +08:00
@sdushn 这是字面意思排除掉'..', '.'就完了?
f14g
2023-09-17 22:38:12 +08:00
nuk
2023-09-17 23:00:28 +08:00
echo count(scandir("glob://123"));
god
2023-09-18 05:36:09 +08:00
@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 的主题可以看看。
cbasil
2023-09-20 17:00:18 +08:00
在$num = count(scandir($this->filename));前面加上文件夹是否存在的判断
<pre>
if(!is_dir($this->filename)) return 'flag_';
</pre>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/974590

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX