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

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

  •  
  •   sdushn · 222 天前 · 2283 次点击
    这是一个创建于 222 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    先放有问题的部分,目标拿到 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  
       222 天前
    网络路径看看
    ysc3839
        2
    ysc3839  
       222 天前 via Android
    /dev /proc C:\ 不行吗?
    ysc3839
        3
    ysc3839  
       222 天前 via Android
    @ysc3839 抱歉,看反了,以为是大于 0 输出。
    ysc3839
        4
    ysc3839  
       222 天前 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
       222 天前
    @ysc3839 是一个反序列化题目,指定 filename 是另一个类对象,就绕过了
    god
        6
    god  
       222 天前 via iPad
    常见的 _php_stream_scandir buffer overflow 吧
    god
        7
    god  
       222 天前 via iPad
    @sdushn 这是字面意思排除掉'..', '.'就完了?
    f14g
        8
    f14g  
       222 天前 via Android
    nuk
        9
    nuk  
       222 天前   ?? 4
    echo count(scandir("glob://123"));
    god
        10
    god  
       222 天前 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  
       219 天前
    在$num = count(scandir($this->filename));前面加上文件夹是否存在的判断
    <pre>
    if(!is_dir($this->filename)) return 'flag_';
    </pre>
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2768 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:37 · PVG 13:37 · LAX 22:37 · JFK 01:37
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com