[HCTF 2018]WarmUp全网最详细解释

news2024/11/24 20:11:51

查看源码找到提示

访问source.php

代码审计:

class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];

定义了一个名为emmm的类,在该类中有一个静态方法checkFile用于检查要包含的文件是否在白名单中,白名单是一个关联数组$whitelist,其中包含了允许包含的文件的键值对。在代码中,允许包含的文件有"source"=>"source.php"和"hint"=>"hint.php"。

if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

checkFile方法首先检查传入的$page参数是否为字符串类型,如果不是或者未设置,将输出"you can't see it"并返回false。

 if (in_array($page, $whitelist)) {
                return true;
            }

接下来,它检查传入的$page是否直接在白名单中存在,如果存在,返回true。

 $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );

然后它会对$page参数进行一系列处理:首先使用mb_strpos函数找到$page中第一个问号的位置,然后使用mb_substr函数将问号之前的部分作为$_page进行处理。

注意:这个mb_strpos函数嵌套在了mb_substr函数中,准确说并不叫嵌套,而是将返回值作为了它的一个参数。

说明:符号点 '.' 是 PHP 中的字符串连接运算符,它用于将两个字符串连接在一起,形成一个更长的字符串。在这里,它将 $page 变量的值和一个问号字符 '?' 连接在一起,形成一个新的字符串,在这个新的字符串中查找问号是否存在,那么很明显肯定能找到。

也就是说 in_array() 函数的第三个参数length肯定为正数,又因为in_array() 函数的第二个参数start为0,因此会在字符串中的第一个字符处开始按照length长度进行截取,重新赋值给page。

如果看到这里你没有明白,那么看完后面三个函数的详细介绍你就懂了

下面是关于 substr()、strpos() 和in_array()函数的详细介绍和用法:

(mb_strpos和strpos,substr和mb_substr在功能上几乎没什么区别)

strpos(string,find,start)函数:

返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注意: 字符串位置是从 0 开始,不是从 1 开始。 

参数描述
string必需。规定被搜索的字符串。
find

必需。规定要查找的字符。

start可选。规定开始搜索的位置。

mb_substr(str,start,length,encoding) 函数:

返回字符串的一部分,对于substr() 函数,它只针对英文字符, 而mb_substr()对于中文也适用。

参数描述
str必需。从该 string 中提取子字符串。
start必需。规定在字符串的何处开始。
  • 正数 - 在字符串的指定位置开始
  • 负数 - 在从字符串结尾的指定位置开始
  • 0 - 在字符串中的第一个字符处开始
length可选。规定要返回的字符串长度。默认是直到字符串的结尾。
  • 正数 - 从 start 参数所在的位置返回
  • 负数 - 从字符串末端返回
encoding可选。字符编码。如果省略,则使用内部字符编码。

in_array(search,array,type)函数:

搜索数组中是否存在指定的值,找到值则返回 TRUE,否则返回 FALSE。

参数描述
search必需。规定要在数组搜索的值。
array必需。规定要搜索的数组。
type可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。

if (in_array($_page, $whitelist)) {
                return true;
            }

之后再次检查传入的$page是否直接在白名单中存在

$_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

将$_page进行URL解码,并重复之前的处理步骤,如果$_page在白名单中存在,返回true。

如果上述条件都不满足,则输出"you can't see it"并返回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['file']是否存在且为字符串类型,并调用emmm::checkFile方法进行检查。如果返回值为true,则通过include语句包含$_REQUEST['file']指定的文件并终止程序执行,否则输出一个图片标签。

先尝试包含hint.php

source.php?file=hint.php

回显成功,flag在ffffllllaaaagggg

注意:我们始终是在source.php页面下进行的传参操作,目的是利用include函数将flag文件包含出来,不要被这里的白名单搞混了。

让我们来分析一下传入这个东西后,php代码是如何进行判断的:

传入file=hint.php,首先检查'hint.php'是否是一个字符串,它是字符串,条件通过;

检查'hint.php'是否在白名单中(白名单包括hint.php和source.php),在,继续执行后面的代码;

对'hint.php'执行mb_substr函数,但是函数内一个参数是来自另一个函数mb_strpos的返回值,因此我们先看mb_strpos函数,使用.进行字符连接,即连接了一个问号字符 '?',得到hint.php?

然后查找'?'在字符串'hint.php?'中第一次出现的位置,从0开始算,返回8,即length=8

接下来我们执行mb_substr函数,即 mb_substr('hint.php',0,8)

从字符串中的第一个字符处开始,返回8个字符,其实还是返回的hint.php;

然后对返回的内容进行url解码,重复执行上面的检查和截取操作。

我们只需要传入一个在白名单内的文件名(source.php或者hint.php),并添加上问号,这样可以保证每次找去用于检查的内容都在白名单,返回true。

构造payload:

source.php?file=hint.php?/../../../../ffffllllaaaagggg

或者用 

source.php?file=source.php?/../../../../ffffllllaaaagggg

关于payload的解释:

因为我们当前的source.php一般是在html目录下,往上是www,var,然后到根目录,flag一般就放在根目录下面,这里还有一个hint.php?/或者source.php?/,因此需要返回四层才能到根目录。

拿到 flag{bc7e048e-19a6-4464-96b6-2d1569696875}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1189959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性代数(四)| 解方程 齐次性 非齐次性 扩充问题

文章目录 1 方程解的个数2 解方程步骤2.1 齐次性方程组2.2 非齐次方程组 3 一些扩充问题 系数矩阵 增广矩阵 A m n X B A_{mn}XB Amn​XB 1 方程解的个数 m 代表有m个方程 n代表有n个未知数 系数矩阵的秩与增广矩阵的秩不同 无解 若相同 &#xff0c;如系数矩阵的秩和未知…

Leetcode—226.翻转二叉树【简单】

2023每日刷题&#xff08;二十四&#xff09; Leetcode—226.翻转二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

MySQL中表格的自我复制,与复制表格

先创建一个空表&#xff0c;my_tab01 CREATE TABLE my_tab01(id INT ,name VARCHAR(32),sal DOUBLE,job VARCHAR(32),deptno INT); SELECT * FROM my_tab01;准备一张有数据的表格&#xff1a; 将另一张表格的数据插入到my_tab01的表格中&#xff1a; -- 演示如何自我复制 --…

Android Glide transform旋转rotate圆图CircleCrop,Kotlin

Android Glide transform旋转rotate圆图CircleCrop&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load…

在现实生活中传感器GV-H130/GV-21的使用

今天&#xff0c;收获了传感器GV-H130/GV-21&#xff0c;调试探头的用法&#xff0c;下面就来看看吧&#xff01;如有不妥欢迎指正&#xff01;&#xff01;&#xff01;&#xff01; 目录 传感器GV-H130/GV-21外观 传感器调试探头 探头与必要准备工作 传感器数值更改调试 …

MySQL的表格去重,史上最简便的算法,一看就会

首先&#xff0c;表格my_tab02存在很多重复的数据&#xff1a; #表格的去重 方法一&#xff1a; 详细内容传送门&#xff1a;表格的去重 -- 思路&#xff1a; -- 1.先创建一张临时表 my_tmp,该表的结构和my_tab02一样 -- 2.把my_tmp的记录通过distinct关键字 处理后 把记录复…

docker.service配置docker镜像加速

加速器配置方法很多&#xff0c;小白我用的是docker.service文件&#xff0c;所以直接在里面配置啊 配置以后&#xff0c;要systemctl daemon-reload下 &#xff0c;然后docker info 下看下镜像地址是否是自己已配置的 docker run --privilegedtrue --name mytomcat -p 8080…

【线上问题】服务器关机导致docker启动的mysql数据库消失了

目录 一、问题描述二、解决方式 一、问题描述 1. 服务器迁移断电导致docker启动的mysql数据库没有了数据 2. data目录是空的 3. mysql重启数据库消失了 二、解决方式 1. sudo -i切换root账号 2. 查找mysql的容器卷 find /var/lib/docker/volumes/ -name mysql3. 进入各个_dat…

文生图模型评测之PickScore

文章目录 1. 简介2. 构建数据集2.1 Pick-a-Pic web App2.2 Pick-a-Pic Dataset3. PickScore3.1.1模型结构和损失函数3.2 模型训练3.3 验证模型4. 作用4.1 作为验证模型的验证集4.2 用于模型选择5. 小结论文链接:Pick-a-Pic: An Open Dataset of User Preferences for Text-to-…

【halcon】halcon 函数文件 以及 脚本引擎如何调用外部函数文件 上篇

前言 halcon有几种文件&#xff1a; 本地程序函数&#xff08;.hdev&#xff09;外部函数文件&#xff08;.hdvp)库函数(.hdp) 说多了容易混淆&#xff0c;今天就说&#xff0c;我觉得最有用的&#xff1a;外部函数文件&#xff08;.hdvp) 步骤 先写一段halcon脚本&#x…

兴达易控232转profinet在搅拌站使用案例配置案例

该搅拌站所采用的是双行星动力搅拌桨混合机&#xff0c;借助兴达易控232转profinet网关(XD-PNR200)与PLC和变频器进行通信&#xff0c;从而实现对变频器的精确控制&#xff0c;大大提升了搅拌过程的稳定性和效率。 这一方案还具备高度的灵活性和可扩展性&#xff0c;使得搅拌站…

【数据结构】二叉树的遍历递归算法详解

二叉树的遍历 &#x1f4ab;二叉树的结点结构定义&#x1f4ab;创建一个二叉树结点&#x1f4ab;在主函数中手动创建一颗二叉树&#x1f4ab;二叉树的前序遍历&#x1f4ab;调用栈递归——实现前序遍历&#x1f4ab;递归实现中序和后序遍历 &#x1f4ab;二叉树的结点结构定义 …

打造一个可视化接口自动化测试系统

现如今&#xff0c;接口开发几乎成为一个互联网公司的标配了&#xff0c;无论是web还是app&#xff0c;哪怕是小程序&#xff0c;都离不开接口作为支撑&#xff0c;当然&#xff0c;这里的接口范围很广&#xff0c;从http到websocket&#xff0c;再到rpc&#xff0c;只要能实现…

nginx https 如何将部分路径转移到 http

nginx https 如何将部分路径转移到 http 我有一个自己的网站&#xff0c;默认是走的 https&#xff0c;其中有一个路径需要走 http。 实现 在 nginx 的配置文件 https 中添加这个路径&#xff0c;并添加一个 rewrite 的指令。 比如我需要将 tools/iphone 的路径转成 http&am…

【Unity实战】实现强大通用易扩展的对话系统(附项目源码)

先看看实现的最终效果 前言 之前的对话系统因为存在一些错误和原作者不允许我分享&#xff0c;所以被我下架了&#xff0c;而且之前对话系统确实少了一些功能&#xff0c;比如最基本的逐字打印功能&#xff0c;原本来是打算后面补充的。 对话系统在游戏中实现太常见了&#x…

机器学习股票大数据量化分析与预测系统 - python 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…

Java提高与实践

IO流 IO流概述 文件字节输入流&#xff1a;每次读取一个字节 package fileStream;import java.io.*;public class HelloFileInputStream {public static void main(String[] args) throws IOException {//创建文件字节输入流 管道&#xff0c;与源文件接通//写法一//InputStr…

开放智慧,助力学习——电大搜题,打开学无止境的新篇章

随着信息技术的迅猛发展&#xff0c;学习已经不再受时间和空间的限制。电大搜题微信公众号为广播电视大学和河南开放大学的学子们带来了便利和智慧&#xff0c;让学习变得更加高效和愉快。 电大搜题微信公众号作为一款专为电大学生而设计的学习助手&#xff0c;是学习中不可或…