BUUCTF[HCTF 2018]WarmUp 1题解

article/2025/7/2 22:47:16

BUUCTF[HCTF 2018]WarmUp 1题解

  • 分析
  • 解题过程
    • 代码审计
      • 主体函数
      • CHECK函数:
    • 构造payload
  • 总结

分析

启动靶机,进入网址,是一张滑稽的表情包:
滑稽

程序化F12查看源码:
F12
发现注释内容,访问

url:/source.php

得到下面的源码:

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

OK,这时候我们可以知道这是一道PHP代码审计题,接下来就是公式化构造payload时间啦!

解题过程

代码审计

主体函数

我们来到了代码审计阶段,先从主体开始:

 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 是一个关联数组,包含 $_GET$_POST$_COOKIE 的内容
$_REQUEST['file'] 表示从用户请求中获取名为 “file” 的参数值
用途:获取表单数据、URL 参数、Cookie 值等用户输入

if判断了以下几个条件:

  • file的值是否不为空
  • file的值是否为字符串
  • emmm::checkFile(file)的回显是否为1

当上面的所有答案都为是,执行:
include $_REQUEST['file'];
反之,输出滑稽表情包。

接下来我们的任务就是解析emmm::checkFile()函数,以绕过waf条件,访问文件。

CHECK函数:

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

一步一步分析:

 $whitelist = ["source"=>"source.php","hint"=>"hint.php"];

这是一个关联数组,关联数组的主要特点是键值对数组。
键(key):“source” 和 “hint” - 这些是白名单标识符;
值(value):“source.php” 和 “hint.php” - 实际允许访问的文件名;

这里我们发现了另一个文件hint.php,是一个提示,访问网址显示:
hint.php
hint.php提示了flag的文件名。

我们接着分析代码:

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

上面这段代码这段代码判断参数是否为NULL,是否为字符串。

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

上面这段代码判断参数是否在白名单中(即判断参数的值和数组的值是否相同)。

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

mb_strpos($page . '?', '?')
$page包含 ?:返回第一个?的位置;
$page不含?:返回字符串长度。

mb_substr($page, 0, mb_strpos($page . '?', '?'))
$page:原始输入;
0:起始位置;
mb_strpos($page . '?', '?'):从 mb_strpos() 获取的长度。
这个函数截取了参数从最开始直到第一个?之间的子串,?之后的子串被丢弃。

请注意这段代码,我们考虑是否能够利用函数的特性,在?之后构造一段代码

之后的代码是:解码url,再次判断参数是否在白名单中。

构造payload

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

构造思想主要是在?后加入/../表示上一级目录,然后一级一级的搜索
所以实际上,payload是一层一层实验出来的。
比如最开始是:

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

发现网页为空,说明该目录中没有目标文件,那么就再尝试上一级目录。
顺便提一下:在原有的payload基础上在加几层都不会影响文件显示,说明这个文件在网站的根目录下

在这里插入图片描述
最后的flag是:flag{966bef86-ebda-43d8-8703-8e6a57b211de}

总结

本题考察的是PHP代码阅读能力和常见的目录遍历能力。
本题涉及到的PHP函数整理如下:
mb_strpos($page . '?', '?'): 返回第一次出现?的数组下标
mb_substr($page, 0, mb_strpos($page . '?', '?')):截取第一个字符到?出现之前的字符(不包括?)
这道题的提示还是比较明显的,难度不是很大,但是对于最后?/../../的构造原理是否有普适性,笔者不解,总的来说也是一道适合入门的题目。


http://www.hkcw.cn/article/wNVuUyvXoK.shtml

相关文章

如何使用DAXStudio将PowerBI与Excel连接

如何使用DAXStudio将PowerBI与Excel连接 之前分享过一篇自动化文章&#xff1a;PowerBI链接EXCEL实现自动化报表&#xff0c;使用一个EXCEL宏工作薄将PowerBI与EXCEL连接起来&#xff0c;今天分享另一个方法&#xff1a;使用DAX Studio将PowerBI与EXCEL连接。 下面是使用DAX S…

neo4j 5.19.0两种基于向量进行相似度查询的方式

介绍 主要讲的是两种相似度查询 一种是创建向量索引&#xff0c;然后直接从索引的所有数据中进行相似度搜索&#xff0c;这种不支持基于自己查询的结果中进行相似度匹配另一种是自己调用向量方法生产相似度进行相似度搜索&#xff0c;这种可以基于自己的查询结果中进行相似度…

中科院报道铁电液晶:从实验室突破到多场景应用展望

2020年的时候&#xff0c;相信很多关注科技前沿的朋友都注意到&#xff0c;中国科学院一篇报道聚焦一项有望改写显示产业格局的新技术 —— 铁电液晶&#xff08;FeLC&#xff09;。这项被业内称为 "下一代显示核心材料" 的研究&#xff0c;究竟取得了哪些实质性进展…

任务26:绘制1-12月各省份平均气温和预测可视化图形(折线

任务描述 知识点&#xff1a; DjangoECharts 重 点&#xff1a; DjangoECharts折线图 内 容&#xff1a; 绘制列表框&#xff0c;能够切换不同的省份根据ECharts官方示例&#xff0c;绘制ECharts折线图根据ECharts配置项手册&#xff0c;修改ECharts图形配置 任务指导…

【Redis】Set 集合

文章目录 常用命令saddsmemberssismemberscardspopsmovesrem 集合间操作sinter && sinterstoresunion && sunionstoresdiff && sdiffstore 内部编码应用场景 集合类型也是用于存储多个字符串类型的数据结构 集合中元素之间是 1. 无序的 2. 不允许重复的…

python打卡训练营打卡记录day43

复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 数据集来源&#xff1a;Flowers Recognition 选择该数据集原因&#xff1a; 中等规模&#xff1a;4242张图片 - 训练快速但足够展示效…

向量空间的练习题目

1.考虑 中的向量x1 和x2 求每一向量的长度 令x3x1x2,求x3的长度&#xff0c;它的长度与x1和x2的和有什么关系&#xff1f; 2.重复练习1&#xff0c;取向量 3.令C为复数集合&#xff0c;定义C上的加法为 (abi)(cdi)(ac)(bd)i 并定义标量乘法为对所有实数a (abi) a bi 证明&…

Android Studio历史版本下载地址汇总

Android Studio 下载文件归档 | Android Developers本页提供了各个 Android Studio 版本的下载归档文件。https://developer.android.google.cn/studio/archive?hlzh-cn

SpringBoot-Thymeleaf

大佬写的真好&#xff1a;Thymeleaf一篇就够了-阿里云开发者社区

序列搜索策略

序列搜索策略 贪心搜索&#xff08;greedy search&#xff09; 在大语言模型中&#xff0c; 对于输出序列的每一时间步t′&#xff0c; 我们都将基于贪心搜索从Y中找到具有最高条件概率的词元&#xff0c;即&#xff1a; y t ′ argmax ⁡ y ∈ Y P ( y ∣ y 1 , … , y t ′…

MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件

MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件 MG影视App电视版是一款资源丰富、免费便捷、且专为大屏优化的影视聚合应用&#xff0c;聚合海量资源&#xff0c;畅享电视直播&#xff0c;是您电视盒子和…

【浏览器】无法连接到互联网解决方法

Mac网络连接一切正常&#xff08;手机连接互联网能正常使用&#xff09; 但是涉及到网络界面就提示“无法连接到互联网”&#xff1a; 解决办法&#xff1a; 点击左上角→系统设置→网络→→位置→编辑位置→→新增一个即可 正常了!!

【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令

目录 五.#和##运算符 5.1--#运算符 5.2--##运算符 六.命名约定&#xff0c;#undef&#xff0c;命令行定义 6.1--命名约定 6.2--#undef 6.3--命名行定义 七.条件编译 常见的条件编译指令&#xff1a; 1.普通的条件编译&#xff1a; 2.多个分支的条件编译(可以利用条…

数据资产评估进阶:精读资产评估专家指引第9号——数据资产评估指导【附全文阅读】

这篇文档是有关数据资产评估的专业报告&#xff0c;以下是文档中需要关注的重点内容&#xff1a; 1. 评估对象&#xff1a;文档中提到了数据资产评估的评估对象&#xff0c;即被评估数据资产。需要关注被评估数据资产的信息属性、法律属性、价值属性等&#xff0c;以及其特征对…

btstack协议栈---ESP32底层逻辑分析

目录 循环体 循环体中,怎么读取、处理数据 packet_handler 上面各层如何处理数据 谁触发了数据的传输? 硬件相关的数据有4类 循环体 BTStack针对不同的运行环境,抽象出了对应的btstack_run_loop结构体,共成员为: 比如其中的execute成员很重要,它是一个循环,在循…

碳中和新路径:铁电液晶屏如何破解高性能与节能矛盾?

一、显示技术困局&#xff1a;当 “高刷” 遭遇 “高耗” 在元宇宙、电竞产业蓬勃发展的当下&#xff0c;显示设备的刷新率与能耗成为行业痛点。传统液晶受 “边缘场效应” 制约&#xff0c;刷新率长期停滞在 300Hz 以下&#xff0c;动态画面拖影问题显著&#xff1b;同时&…

408考研逐题详解:2009年第27题

2009年第27题 一个分段存储管理系统中&#xff0c;地址长度为 32 位&#xff0c;其中段号占 8 位&#xff0c;则最大段长是&#xff08; &#xff09; A. 2 8 2^8 28B \qquad B. 2 16 2^{16} 216B \qquad C. 2 24 2^{24} 224B \qquad D. 2 32 2^{32} 232B 解析 本题…

ASC格式惯导数据文件转IMR格式文件

我们使用惯导采集数据之后&#xff0c;如果需要用现有软件进行解算&#xff0c;比如POSMind等等&#xff0c;就会涉及到IMR格式的惯导数据文件。而NovAtel Convert转换软件只能将原始DAT格式的文件转成ASCLL文件&#xff0c;因此我自编程实现了ASC格式文件到IMR格式文件的转换。…

电脑为什么换个ip就上不了网了

在日常使用电脑上网时&#xff0c;很多人可能遇到过这样的问题&#xff1a;当IP地址发生变化后&#xff0c;突然就无法连接网络了。当电脑更换IP地址后无法上网&#xff0c;这一现象可能由多种因素导致&#xff0c;涉及网络配置、硬件限制或运营商策略等层面。以下是系统性分析…

动中通天线跟踪性能指标的测试

卫星通信动中通天线包括天线、卫星信号跟踪接收机、GNSS接收机&#xff08;含天线&#xff09;、组合导航设备、天线控制器、伺服结构以及其他射频组件等。其中&#xff1a; • GNSS接收机提供系统位置信息&#xff1b; • 组合导航设备提供天线所在平台的方位、俯仰、横滚姿态…