[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 解码,? 出现,故通过第三次判断,原理与第二次相同。

相关推荐
我是乌鸦的空间6 小时前
什么是网络安全中的电子数据取证与响应?
网络·网络安全
网安蟹佬霸7 小时前
WAF绕过技术实战:从规则检测到编码绕过全指南(2026最新版,附Payload集与自动化脚本)
运维·安全·网络安全·架构·自动化·网安
数据知道9 小时前
移动端渗透测试流程:Android APK 逆向与动态调试
android·web安全·网络安全
电子科技圈11 小时前
Semtech将于2026年国际物联网展(IOTE 2026)举办 LoRa®全球生态论坛
物联网·网络安全·健康医疗·制造·零售·iot·交通物流
IPdodo_12 小时前
代理 IP 服务商 SLA 怎么验?7 项指标与 Python 探测脚本实战
运维·python·网络协议·网络安全·代理ip
2501_9160088914 小时前
iOS App 请求地址查看,不用配置看到 App 调了哪些接口
网络协议·计算机网络·网络安全·ios·adb·https·udp
数字护盾(和中)14 小时前
和中科技剖析 EDR 绕过全链路,AMSI、ETW 规避技术与防御对策
运维·网络·人工智能·科技·安全·web安全
安全小王子14 小时前
nssctf_sign-ezc++
网络安全·逆向·ctf·nssctf
小小代码狗18 小时前
Windows 权限提升技术详解
windows·网络安全
网安蟹佬霸19 小时前
Android安全攻防实战:从APK逆向到Frida动态Hook全流程详解(附脚本)
android·前端·安全·web安全·逆向·csrf·网安