前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >buuctf[HCTF 2018]WarmUp 1

buuctf[HCTF 2018]WarmUp 1

作者头像
用户8909609
发布2023-10-23 09:04:01
3740
发布2023-10-23 09:04:01
举报
文章被收录于专栏:BM CTF

题目环境:

在这里插入图片描述
在这里插入图片描述

发现除了表情包,再无其他 F12试试

image.png
image.png

发现source.php文件 访问这个文件,格式如下: url/source.php 回显如下:

image.png
image.png

PHP代码审计:

代码语言:javascript
复制
<?php
highlight_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\" />";
}  
?>

  1. 定义了一个名为emmm的类,该类有一个静态方法checkFile。checkFile方法接受一个字符串参数$page,这个参数可能代表一个文件名。
  2. 定义了一个$whitelist数组,这个数组里面存在两个元素是"source.php"和"hint.php"。
  3. checkFile方法首先检查$page是否存在且为字符串。如果不满足这些条件,它将输出"you can’t see it"并返回false。
  4. 然后,checkFile方法检查
page是否存在于一个名为

whitelist的数组中。这个数组包含两个元素,分别是"source.php"和"hint.php"。如果

page在

whitelist中,方法将返回true。

  1. 如果
page不在

whitelist中,那么checkFile方法将尝试通过以下步骤查找匹配的文件名:

  • 首先,它将
page和问号(?)连接起来,然后查找这个字符串在

page中的位置。这可能是为了检查是否存在一个查询字符串。

  • 然后,它对$page进行url解码,再重复之前的步骤。
  • 如果以上两种方式都未能找到匹配的文件名,那么方法将输出"you can’t see it"并返回false。

  1. 在类的定义之外,这段代码检查了一个名为
_REQUEST['file']的变量。如果这个变量非空且为字符串,并且通过emmm::checkFile(

_REQUEST[‘file’])检查,那么它将包含(include)这个文件并退出。否则,它将显示最初页面的那个滑稽表情包图片。

  1. 总的来说,给了我们一个参数是file,我们给file参数传值就等于是给page参数传值,传的值需要提前用英文问号(?)连接起来,然后我们就可以找flag,怎么找flag是个问题,但是在代码里面还有一个名为hint.php的文件,不妨去看看,或许有咱们需要的信息。

查看hint.php内容 查看格式: url/hint.php 回显结果:

image.png
image.png

这里说flag在ffffllllaaaagggg文件里面 有了目标就好办了,构造下payload: url/source.php?file=hint.php?/ffffllllaaaagggg

image.png
image.png

竟然什么都没有显示 分析一下原因:

  1. 首先我们的payload要在source.php文件下进行,因为参数在这里面。
  2. flag在ffffllllaaaagggg里面,ffffllllaaaagggg又在hint.php里面,并且$whitelist数组里面也存在hint.php文件,所以说要先进到hint.php文件里面。
  3. 英文问号(?)连接后面的字符串也没有问题
  4. 到这里payload构造是没有问题的,那么问题就出在了找flag的位置不对!
  5. 我们这个payload是在hint.php文件里面找的,但是没有,返回上一级找找看?问题是也不知道flag具体在哪一级,那就构造多一些,溢出的部分没关系,这里只会显示最后一个目录。
  6. 了解一下:

1、“.”表示当前目录,也可以用“./”表示。

2、“…”表示上一级目录,也可以用“…/”表示。 3、“~” 代表用户自己的宿主目录。 4、“/”处于Linux文件系统树形结构的最顶端,我们称它为Linux文件系统的root,它是Linux文件系统的入口。

继续构造payload: url/source.php?file=hint.php?../../../../../../ffffllllaaaagggg 这里就是说一直返回上一级查找,直到查找到flag为止,最终返回到/root根目录,因为ffffllllaaaagggg原本是在hint.php文件里面嘛,所以说要一直往上一级目录找它的原始位置, …/倒不是一定是6个,看你的flag具体在那个上一级目录了😉 上传payload 回显结果:

image.png
image.png

爆出flag: flag{89c3539b-c6f4-4454-892a-ff1e460a560b}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
代码审计
代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档