[HCTF 2018]WarmUp 1 滑稽图(详解)

2024-02-16 01:10
文章标签 详解 2018 hctf warmup 滑稽

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

[HCTF 2018]WarmUp 1

查看页面源代码,发现html中忽视了 source.php ,接下来我们访问 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\" />";}  
?>

我们先看最后一段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\" />";}  
?>

empty — 检查一个变量是否为空

is_string — 检测变量是否是字符串

最后一段 php 代码的意思是:如果我们输入的文件名 不为空,是字符串,并且传过来的文件满足emmm类中的checkFile的这个函数的话 就会对给文件进行文件包含。否则输出一张滑稽图片

再看前半段代码:

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

&$page: 引用传递 变量

public static function checkFile(&$page) : public static function 静态方法 public static 静态属性

[]是PHP数组索引标识符号

isset() 函数用于检测变量是否已设置并且非 NULL

in_array() 函数搜索数组中是否存在指定的值。

语法

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

mb_substr() 函数返回字符串的一部分,之前我们学过 substr() 函数,它只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()。

mb_strpos — 查找字符串在另一个字符串中首次出现的位置

在这段php代码中:
先建立一个叫 emmm 的类,建立了一个 静态方法 checkFile 并且是数值传递:

定义了一个变量 $whitelist (白名单数组)

一个是source.php 一个是hint.php

查看hint.php,发现:

flag not here, and flag in ffffllllaaaagggg

如果没有定义 p a g e 变 量 或 者 page变量或者 pagepage变量不是字符串,就输出 you can’t see it 并且返回false

如果在$page变量中搜索到 白名单里的东西 就返回true 换句话说,在搜索的时候我们要包含 source.php 或者 hint.php。

并且mb_substr函数会将 p a g e 变 量 会 截 取 从 第 零 位 开 始 到 m b s t r p o s ( _page变量会截取 从第零位开始 到 mb_strpos( pagembstrpos(page . ‘?’, ‘?’)

mb_strpos($page . ‘?’, ‘?’): $page . ‘?’ 会在后面自动对我们搜索文件路径添加一个 ?

mb_strpos($page . ‘?’, ‘?’) 整体的话,就是匹配第一次出现问号的位置。和前面的mb_substr函数一配合就会 从一开始截取到第一次问好的位置

例如:我们输入file=source.php?../…/…/…/flag

就会截取到 file=source.php?

截取完之后就又会进行一次判断 if (in_array($_page, $whitelist))

如果 $_page 在白名单里面就返true,换句话说就是检查我们输入的文件路径是否还包含 source.php或者hint.php

做题步骤
  1. 先查看 hint.php

    http://6e33302e-9f50-4d03-a55c-293092589c56.node4.buuoj.cn:81/hint.php
    
  2. 构造 我们的查询 flag 语句

    因为有 mb_substr() mb_strpos() 函数所以我们不能直接使用 问号 ,需要先对其进行 两次url编码

    ?file=source.php%253F../../../../ffffllllaaaagggg
    

    如果没有查询到flag,就接着查询下一个子文件夹 多添加一次 ../ 直到查见flag为止

在这里插入图片描述

这篇关于[HCTF 2018]WarmUp 1 滑稽图(详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ