buuctf[HCTF 2018]WarmUp 1

题目环境:

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

F12试试

发现source.php文件

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

回显如下:

PHP代码审计:

php 复制代码
<?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方法检查 p a g e 是否存在于一个名为 page是否存在于一个名为 page是否存在于一个名为whitelist的数组中。这个数组包含两个元素,分别是"source.php"和"hint.php"。如果 p a g e 在 page在 page在whitelist中,方法将返回true。
  5. 如果 p a g e 不在 page不在 page不在whitelist中,那么checkFile方法将尝试通过以下步骤查找匹配的文件名:
    • 首先,它将 p a g e 和问号 ( ? ) 连接起来,然后查找这个字符串在 page和问号(?)连接起来,然后查找这个字符串在 page和问号(?)连接起来,然后查找这个字符串在page中的位置。这可能是为了检查是否存在一个查询字符串。
    • 然后,它对$page进行url解码,再重复之前的步骤。
    • 如果以上两种方式都未能找到匹配的文件名,那么方法将输出"you can't see it"并返回false。
  6. 在类的定义之外,这段代码检查了一个名为 R E Q U E S T [ ′ f i l e ′ ] 的变量。如果这个变量非空且为字符串,并且通过 e m m m : : c h e c k F i l e ( _REQUEST['file']的变量。如果这个变量非空且为字符串,并且通过emmm::checkFile( REQUEST[′file′]的变量。如果这个变量非空且为字符串,并且通过emmm::checkFile(_REQUEST['file'])检查,那么它将包含(include)这个文件并退出。否则,它将显示最初页面的那个滑稽表情包图片。
  7. 总的来说,给了我们一个参数是file,我们给file参数传值就等于是给page参数传值,传的值需要提前用英文问号(?)连接起来,然后我们就可以找flag,怎么找flag是个问题,但是在代码里面还有一个名为hint.php的文件,不妨去看看,或许有咱们需要的信息。

查看hint.php内容

查看格式:
url/hint.php

回显结果:

这里说flag在ffffllllaaaagggg 文件里面

有了目标就好办了,构造下payload:
url/source.php?file=hint.php?/ffffllllaaaagggg

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

  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

回显结果:

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

相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
一次旅行5 天前
网络安全总结
安全·web安全
QQ5110082855 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php