当前位置: 首页 > news >正文

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp(代码审计)

在这里插入图片描述

题目

访问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\" />";}  
?> 
分析

可以看到checkfile里面有4个if,第一个if不能进去进去就false;

后面三个if要进去一个,不然执行结束返回false;

下面的文件包含前的判断条件要三个都为真才能包含

然后通过白名单可以知道有两个文件,我们访问一下hint.php

在这里插入图片描述

得到一个flag所在的文件

让我们分析一下代码:

     if (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}//这个if不进去很简单
if (in_array($page, $whitelist)) {return true;}
//这个if进不去,我们传的$page肯定不符合白名单
 $_page = mb_substr($page,0,mb_strpos($page . '?', '?'));//这段代码的意思就是 将第一个?之前的内容截取出来,注意不包括这个问号//而且可以发现的是这里不再是原封不动的$page拿来比较
if (in_array($_page, $whitelist)) {return true;}
//拿$_page去比较是否匹配白名单,注意这里是截取过.
//可以向办法进入这个if
$_page = urldecode($page);$_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));//先将$page解码再截取if (in_array($_page, $whitelist)) {return true;}//同样这里可以想办法进入这个if
 echo "you can't see it";return false;//之前没有进入任何if去返回值就失败了

在这个URL中,http://url/source.php?file=hint.php?../../../../../ffffllllaaaagggg,包含了两个参数:file../../../../../ffffllllaaaagggg

通常,URL中的参数是用?来分隔的,而参数之间则用&符号来分隔。在这个URL中,file是参数名,hint.php?../../../../../ffffllllaaaagggg是参数值。

现在让我们来解释一下这个参数值 hint.php?../../../../../ffffllllaaaagggg 的含义:

  1. hint.php:这部分是文件名,表明了要访问的文件是hint.php
  2. ?:在URL中,?符号通常用来分隔参数名和参数值。在这个特定的情况下,?可能被用来分隔文件名和查询字符串,以向hint.php传递额外的参数。
  3. ../../../../../ffffllllaaaagggg:这部分是查询字符串,它以?开头。在UNIX和类似系统中,../用来表示上级目录,因此这个查询字符串看起来是在尝试向hint.php传递参数ffffllllaaaagggg,同时在路径中向上跳了多个目录。

总结一下,这个URL中的hint.php?../../../../../ffffllllaaaagggg可能是尝试访问hint.php文件,并向它传递了一个查询字符串参数,同时尝试在文件路径中向上跳转多层目录。

需要注意的是,?符号在URL中通常用来分隔参数名和参数值。在这个特定的情况下,?后面的内容被认为是查询字符串,它可能被hint.php用来解析和处理。然而,具体的含义和行为取决于服务器端对URL的处理方式。

此题?应该是用来绕过白名单所加

网上有两种解释,结合起来看更容易理解

1、tips:include函数有这么一个神奇的功能:以字符‘/’分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。

2、如果我们的file变量为source.php?../…/…/…/…/ffffllllaaaagggg,先截取 ? 号前字符串白名单验证也就是 source.php,符合,返回ture,然后服务器访问时访问 source.php? 文件不存在,目录穿越至ffffllllaaaagggg,得到我们要的flag。至于为什么需要四个…/,可以一个个增加多次尝试。(source或hint都可)

方法一

一次编码,进入第三个if
在这里插入图片描述

方法二

使用urldecode会出现一个问题,假如我将一个字符使用url编码了两遍然后传入的时候,首先浏览器解码了一遍,接下来才是urlencode解码,所以使用两次urlencode,绕过前面的if,进入第四个if
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月27日预测第3弹
  • Word 中将 LaTex 代码渲染为公式的两种方法
  • Windows10映射网络驱动器之后不显示映射盘
  • 视觉SLAM十四讲:从理论到实践(Chapter6:非线性优化)
  • AI 谈“浔川AI翻译机”
  • 基于Android Studio记事本系统
  • vue-封装上下(垂直方向)轮播
  • 【XR806开发板试用】SPI驱动数码管显示
  • 语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(一)音频数据编码与预处理
  • 搭建CMS系统
  • MyBatis的基础操作
  • PHP身份证真伪验证、身份证二、三要素核验、身份证ocr接口
  • 【Redis】 关于列表类型
  • 【论文解读】Performance of AV1 Real-Time Mode
  • 软件测试面试题(七)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • android图片蒙层
  • CentOS从零开始部署Nodejs项目
  • Consul Config 使用Git做版本控制的实现
  • Javascript基础之Array数组API
  • linux安装openssl、swoole等扩展的具体步骤
  • React-redux的原理以及使用
  • SQLServer之索引简介
  • vue学习系列(二)vue-cli
  • 对JS继承的一点思考
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 模型微调
  • 目录与文件属性:编写ls
  • 项目管理碎碎念系列之一:干系人管理
  • 应用生命周期终极 DevOps 工具包
  • FaaS 的简单实践
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何在招聘中考核.NET架构师
  • ​configparser --- 配置文件解析器​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #{}和${}的区别是什么 -- java面试
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (利用IDEA+Maven)定制属于自己的jar包
  • (四)JPA - JQPL 实现增删改查
  • (一)SpringBoot3---尚硅谷总结
  • .NET Core 2.1路线图
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 成都线下面基会拉开序幕
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/C# 使用反射注册事件
  • .NET中GET与SET的用法
  • @JsonFormat与@DateTimeFormat注解的使用
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @ModelAttribute注解使用
  • @RequestBody与@ModelAttribute
  • [30期] 我的学习方法
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)