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

BUUCTF[HCTF 2018]WarmUp 1题解

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.xdnf.cn/news/771823.html

相关文章:

  • 《人性的弱点》能带给我们什么?
  • C++哈希表:冲突解决与高效查找
  • uni-id-pages login-by-google实现
  • 05.MySQL表的约束
  • 使用免费wordpress成品网站模板需要注意点什么
  • NX847NX855美光固态闪存NX862NX865
  • 向量空间的练习题目
  • 前端高频面试题2:JavaScript/TypeScript
  • SOC-ESP32S3部分:26-物联网MQTT连云
  • 《深度剖析:基于Meta的GameFormer构建自博弈AI游戏代理》
  • 趋势因子均值策略思路
  • 基于STM32的循迹避障小车的Proteus仿真设计
  • hot100 -- 6.矩阵系列
  • Linux(信号)
  • 第十天:Java反射
  • 灵动相册,助力教学:在线教学场景的图片管理利器——仙盟引渡仙君-智能编程——仙盟创梦IDE
  • 通俗理解“高内聚,低耦合”
  • react 生命周期
  • “等待-通知”机制优化(一次性申请)循环等待
  • 电子电路:4017计数器工作原理解析
  • 【Java EE初阶】计算机是如何⼯作的
  • “application/json“,“text/plain“ 分别表示什么
  • 【C#朗读文本DLL动态按钮控件组及按钮事件文本框拖放数据】2022-1-21
  • 【Go-补充】ioReader + ioWriter + bufio
  • Charles青花瓷抓取外网数据包
  • 【笔记】Windows 部署 Suna 开源项目完整流程记录
  • 格密码-LWE问题
  • Python基础:人生重开模拟器(小游戏)
  • 编译原理实验 之 TINY 之 语义分析(第二次作业)
  • PHP舆情监控分析系统(9个平台)