BUUCTF------[HCTF 2018]WarmUp

开局一个表情,源代码发现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\" />";
    }  
?>

知识点

1.函数

复制代码
empty:检查变量是否为空,存在值返回true,反之false

isset:检查变量是否设置,且不为空,存在值返回true,反之false

is_string:检查一个变量是否是字符串。如果是字符串,则返回 true;否则返回 false。

in_array:检查一个值是否存在于数组中。如果值存在于数组中,则返回 true;否则返回 false

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

mb_substr:返回字符串截取的一部分
$subStr = mb_substr($str, 0, 3, 'UTF-8'); // 从索引 0 开始,截取长度为 3 的子串  

分析源码

php 复制代码
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\" />";
    }  

这段代码表示:变量file要满足三个条件,三个都返回True,才能进行文件包含include,第一个和第二个容易满足;第三个分析chekFile方法。

代码1.

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

创建whitelist列表,给source和hint分别赋值给source.php和hint.php,满足变量page既不能为空,又必须是字符串

代码2.

php 复制代码
            if (in_array($page, $whitelist)) {
                return true;
            }

判断变量page的值是否在whitelist列表中,如果在则返回true,反之false。

代码3.

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

这段代码表示:在$page中,从最开始的位置去匹配?,然后返回?前的所有字符串(不包括?)

代码4.

php 复制代码
            $_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;
        }

将$page进行url解码,然后进行?截取,判断是否在列表中

payload

通过上面的代码分析,payload中必须有hint.php或source.php,(参考上面的代码1和代码2)和,因为有?,才能进行if判断。

它还要进行url解码,但是传进的值,经过url解码后,还是它本身。

复制代码
?file=hint.php?../../../../../../../../ffffllllaaaagggg
相关推荐
JaguarJack7 小时前
PHP 基金会宣布:Streams 现代化 将引入事件循环与异步新能力
后端·php
亿坊电商15 小时前
PHP后端项目中多环境配置管理:开发、测试、生产的优雅解决方案!
服务器·数据库·php
ZIM学编程21 小时前
「学长有话说」作为一个大三学长,我想对大一计算机专业学生说这些!
java·c语言·数据结构·c++·python·学习·php
普普通通的南瓜1 天前
《国家安全法》下的 SSL 证书定位:网络数据加密的 “法定基石”
网络·php·ssl
BingoGo1 天前
PHP 组件未来:Livewire 4 正式发布,性能更快,功能更完整
后端·php
JaguarJack1 天前
PHP 组件未来:Livewire 4 正式发布,性能更快,功能更完整
后端·php
半桔1 天前
【IO多路转接】深入解析 poll:从接口到服务器实现
linux·运维·服务器·php
Z3r4y2 天前
【代码审计】ECShop_V4.1.19 SQL注入漏洞 分析
php·代码审计·ecshop
ICT系统集成阿祥2 天前
华为CloudEngine系列交换机堆叠如何配置,附视频
开发语言·华为·php
Xiaok10182 天前
libpcap 抓包:从打开网卡到解析数据包
服务器·网络·php