[HCTF 2018]WarmUp 1

HCTF 2018WarmUp 1

审题

  1. 观察题目,查看源代码,看到source.php。
  1. 访问,看到源代码。

知识点

PHP的代码审计,include函数的应用,文件包含漏洞。

代码审计

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. 整个代码可以分为俩个部分,一个是emmm类,另一个是file参数的获取。

    emmm类

    emmm类可以分为四个部分

第一部分:

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

这一部分有两个作用

  1. 定义$whitelist参数,也就是我们常说的白名单。
  2. 是判断传入的$page参数是否存在,并且是否为字符串。如果不满足这两个条件中的任意一个函数就会返回false。

第二部分

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

这个部分的内容很简单,就是判断page参数是否等于白名单里的内容,如果等于就返回true。

第三部分:

php 复制代码
 $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

这一部分也分为两部分

  1. 使用mb_substr函数让page参数中?之前的字符串被截取,后面的字符消失。
  2. 让被截取后的$page参数和白名单匹配,如果相等返回true。

第四部分:

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;
        }

这一部分和第二部分十分像,只是在开头加了一个url解码。

file获取(可以看成C语言中的main函数)

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\" />";
    }  

这一部分十分简单,可以分为几个作用

  1. 判断file不为空,
  2. 判断是否为字符串
  3. 是否可以通过emmm类中的checkFile函数,也就是让它返回true。
  4. 如果以上条件都通过就进行include函数,include函数可以调用php文件从而形成安全隐患。

解题

在看到代码后可以发现还有一个hint.php,访问后得到flag在ffffllllaaaagggg文件中

经过上面的代码审计之后,我们可以很容易的看到file函数构造的要求。

  1. 不为空
  2. 要是字符串
  3. 通过emmm返回ture
  4. 让include访问ffffllllaaaagggg文件

emmm中

第一部分也是判断

第二部分要求page本身就是source.php或者hint.php

第三部分可以通过问号来截取符合要求的部分,可以利用。

第四部分同理,将第三部分的答案ulr加密后也可以利用。

最后使用/让source.php?或者hint.php?成为不存在的目录,再用.../跳转到ffffllllaaaagggg文件就行。

**tip:正常情况下,URL 的路径部分表示要访问的文件或目录的路径。当 URL 中的路径部分以斜杠 "/" 结尾时,服务器通常会将其解析为目录而不是文件。然而,如果在该斜杠后面紧跟查询参数,如 "source.php?/",服务器会将其视为一个文件路径,并尝试查找名为 "source.php?" 的文件。然而由于这个目录不存在就会被看成一个不存在的目录。 **

最后得到答案file=hint.php?/.../.../.../.../ffffllllaaaagggg或者source.php?/.../.../.../.../ffffllllaaaagggg。

**tip:.../一定要大于4个,可以多不能少,如果少了无法跳转到flag目录 **

相关推荐
treesforest3 小时前
IP定位技术在网络犯罪侦查中的应用与价值
网络·网络协议·tcp/ip·网络安全·ip归属地查询·反欺诈
笨鸟先飞,勤能补拙4 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
似的8354 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
fanged5 小时前
总线学习3--SPI番外(TODO)
学习
笨鸟先飞,勤能补拙6 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
ThsPool6 小时前
【遥感学习整理 02】ENVI遥感图像处理基础:从数据读取到遥感信息产品
图像处理·人工智能·学习
姜太小白6 小时前
【Linux】df -h 卡住问题的通用排查与解决方案总结
linux·运维·php
HackTwoHub7 小时前
轻量化AI渗透武器库|ARTEX自主攻防系统、资产梳理、漏洞挖掘、链路分析全流程智能化落地
人工智能·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
0566467 小时前
Python康复训练——常用标准库
开发语言·python·学习
0566468 小时前
Python康复训练——控制流与函数
开发语言·python·学习