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

2023-11-09 22:13

本文主要是介绍[HCTF 2018]WarmUp全网最详细解释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

查看源码找到提示

访问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}

这篇关于[HCTF 2018]WarmUp全网最详细解释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378748

相关文章

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

在idea中使用mysql数据库超详细教程

《在idea中使用mysql数据库超详细教程》:本文主要介绍如何在IntelliJIDEA中连接MySQL数据库,并使用控制台执行SQL语句,还详细讲解了如何使用MyBatisGenerator快... 目录一、连接mysql二、使用mysql三、快速生成实体、接口、sql文件总结一、连接mysql在ID

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo