V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sdushn
V2EX  ›  PHP

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

  •  
  •   sdushn · 2023-09-17 15:52:55 +08:00 · 2668 次点击
    这是一个创建于 466 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    11 条回复    2023-09-20 17:00:18 +08:00
    hefish
        1
    hefish  
       2023-09-17 16:13:34 +08:00
    网络路径看看
    ysc3839
        2
    ysc3839  
       2023-09-17 16:30:50 +08:00 via Android
    /dev /proc C:\ 不行吗?
    ysc3839
        3
    ysc3839  
       2023-09-17 16:31:55 +08:00 via Android
    @ysc3839 抱歉,看反了,以为是大于 0 输出。
    ysc3839
        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.
    可以往这方面看看
    sdushn
        5
    sdushn  
    OP
       2023-09-17 16:50:56 +08:00
    @ysc3839 是一个反序列化题目,指定 filename 是另一个类对象,就绕过了
    god
        6
    god  
       2023-09-17 17:22:57 +08:00 via iPad
    常见的 _php_stream_scandir buffer overflow 吧
    god
        7
    god  
       2023-09-17 19:01:50 +08:00 via iPad
    @sdushn 这是字面意思排除掉'..', '.'就完了?
    f14g
        8
    f14g  
       2023-09-17 22:38:12 +08:00 via Android
    nuk
        9
    nuk  
       2023-09-17 23:00:28 +08:00   ❤️ 4
    echo count(scandir("glob://123"));
    god
        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 的主题可以看看。
    cbasil
        11
    cbasil  
       2023-09-20 17:00:18 +08:00
    在$num = count(scandir($this->filename));前面加上文件夹是否存在的判断
    <pre>
    if(!is_dir($this->filename)) return 'flag_';
    </pre>
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3087 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:22 · PVG 21:22 · LAX 05:22 · JFK 08:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.