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
相关推荐
字节全栈_rJF2 小时前
概述、 BGP AS 、BGP 邻居、 BGP 更新源 、BGP TTL 、BGP路由表、 BGP 同步
网络·智能路由器·php
dal118网工任子仪3 小时前
92,[8] 攻防世界 web Web_php_wrong_nginx_config
开发语言·php
aaaweiaaaaaa6 小时前
php的使用及 phpstorm环境部署
android·web安全·网络安全·php·storm
doubt。12 小时前
3.攻防世界Web_php_unserialize
网络·安全·web安全·网络安全·php·代码复审
doubt。15 小时前
1.攻防世界easyphp
网络·安全·web安全·网络安全·php·代码复审
doubt。1 天前
【BUUCTF】[羊城杯 2020]Blackcat1
网络·安全·web安全·网络安全·php
姽式、1 天前
php接口连接数据库
开发语言·php
x66ccff1 天前
【linux】Linux 常见目录特性、权限和功能
linux·服务器·php
诗句藏于尽头1 天前
PHP实现混合加密方式,提高加密的安全性(代码解密)
开发语言·笔记·php
lingllllove1 天前
PHP中配置 variables_order详解
android·开发语言·php