[HCTF 2018]Warmup

HCTF 2018Warmup wp

进入页面:

查看源码:

发现提示:source.php ,直接访问,得到源代码:

复制代码
 <?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"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 . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            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'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

发现 hint.php ,直接访问:

提示 flag 在 ffffllllaaaagggg 文件中。

知识点回顾

$_REQUEST['file'] 既可以接收 file 传参也可以接收 POST 传参;

emmm::checkFile 表示调用 emmm 类的方法 checkFile ,:: 在 PHP 中可以用来调用类的静态方法或静态属性,而不需要实例化对象;

mb_strpos 函数:

查找字符串在另一个字符串中首次出现的位置

复制代码
 mb_strpos(
    string $haystack,
    string $needle,
    int $offset = 0,
    ?string $encoding = null
): int|false

返回 string 的 haystackneedle 首次出现位置的数值。 如果没有找到 needle,它将返回 false

比如本题中的:

复制代码
mb_strpos($page . '?', '?')

先将 $page 的末尾连接一个问号,再查找问号在这整个字符串中第一次出现的位置。

mb_substr 函数:

mb_substr() 函数返回字符串的一部分,之前我们学过 substr() 函数,它只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()。

用法示例:

复制代码
<?php
echo mb_substr("菜鸟教程", 0, 2);
// 输出:菜鸟
?>

比如本题中的:

复制代码
$_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );

mb_strpos 函数返回了问号第一次出现的位置之后,再通过 mb_substr 函数将 $page 截断到第一个问号之前,结果返回给 $_page

源码分析

传入的参数 file 会经过 emmm::checkFile 的检查,我们的目的是让它返回 true 。查看 checkFile 方法会发现有三个地方能返回 true 。

第一个地方白名单检查,过不去,我决定让它在第二个地方返回 true 。这里要提到一个知识点:目录穿越。

目录穿越

当我传入 payload :

复制代码
source.php?../../../../../ffffllllaaaagggg

include $_REQUEST['file']; 变为:

复制代码
include("source.php?../../../../../ffffllllaaaagggg")

source.php?.. 整体会被看做是一个目录,而不会去检查它的正确性,在此目录基础上不断返回上级目录,并最终访问 flag 文件。

此 payload 可以通过第二次 return true; 的检查。

返回结果:

依此道理,可以在第三处返回 true ,需要 URL 编码一下,payload 为:

复制代码
source.php%253F../../../../../ffffllllaaaagggg

对 ? 进行两次 URL 编码,在传参时,默认解码一次,得到 ? 的一次 URL 编码值,在经过第二处判断时,由于没有 ? ,返回的是完整字符串,故不通过,在经过第三次判断之前进行了一次 URL 解码,? 出现,故通过第三次判断,原理与第二次相同。

相关推荐
郑洁文27 分钟前
基于网络爬虫的XSS漏洞检测系统的设计与实现
网络·爬虫·网络安全·xss
llxxyy卢29 分钟前
好靶场部分题目
web安全·web
菩提小狗33 分钟前
每日安全情报报告 · 2026-06-02
网络安全·漏洞·cve·安全情报·每日安全
酉鬼女又兒1 小时前
零基础入门计算机网络:第一章概述全解(三种交换方式+八大性能指标+体系结构分层+十年考研真题精讲)
网络协议·计算机网络·考研·网络安全·职场和发展·计算机外设·求职招聘
云安全助手5 小时前
高防IP是什么?原理是什么?
网络安全
德迅--文琪5 小时前
看不见的围墙:APP背后的网络安全暗门
安全·web安全
Fortinet_CHINA5 小时前
AI正在重塑网络安全格局,但技能差距仍是核心风险
人工智能·安全·web安全
Whoami!5 小时前
02-【高校】校园网等保三级架构
网络安全·安全架构·拓扑
郑洁文17 小时前
基于网络爬虫的Web敏感信息泄露自动化检测工具
前端·爬虫·网络安全·自动化