当前位置: 首页 > 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
在这里插入图片描述

http://www.lryc.cn/news/355185.html

相关文章:

  • 力扣爆刷第145天之图论五连刷(dfs和bfs)
  • Host头攻击-使用加密和身份验证机制
  • 衍生品赛道的 UniSwap:SynFutures 或将成为行业领军者
  • TypeScript中的`let`、`const`、`var`区别:变量声明的规范与实践
  • 【python】python商家会员数据分析可视化(源码+数据集+课程报告论文)
  • Python限制输入的数范围
  • postman都有哪些功能?
  • 华为ensp中USG6000V防火墙双机热备VRRP+HRP原理及配置
  • ROS for LabVIEW:实现LabVIEW与ROS的无缝集成
  • yolov8+ROS+ubuntu18.04——学习记录
  • Java小抄(一)|Java中的List与Set转换
  • 【每日随笔】小人畏威不怀德 , 君子畏德不畏威 ( 先礼后兵 )
  • 不一样的2024
  • linux mv操作和cp操作
  • 第十二届蓝桥杯物联网试题(国赛)
  • 小而美的前端库推荐
  • 【LeetCode】力扣第 399 场周赛 优质数对的总数 II
  • YOLOv8+PyQt5面部表情检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)
  • ROS 工作空间
  • 【科普】ChatGPT-4o 是什么?和之前的ChatGPT4.0有什么区别,各有什么优劣势
  • django-celery-beat自动调度异步任务
  • 【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片
  • Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】
  • 【Redis】Widows 和 Linux 下使用 Redis
  • 统计计算四|蒙特卡罗方法(Monte Carlo Method)
  • 大模型时代的具身智能系列专题(三)
  • 使用 FileZilla 在 Windows 和 Ubuntu 之间传文件
  • 【C++初阶】—— 类和对象 (上)
  • 基础—SQL—图形化界面工具的DataGrip使用(2)
  • 4-主窗口