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}

相关推荐
2401_894915538 小时前
Geo搜索优化排名源码部署搭建全流程详解
android·开发语言·flask·php·精选
2601_963771378 小时前
Hardening Enterprise WordPress Sites Against REST API Leaks and Bad Headers
前端·windows·word·php
云水一下10 小时前
DVWA从入门到精通(十八):Cryptography(密码学问题)
web安全·密码学·dvwa
菩提小狗11 小时前
每日安全情报报告 · 2026-07-09
网络安全·漏洞·cve·安全情报·每日安全
糖果店的幽灵11 小时前
安全测试从入门到精通 - 环境搭建与基础工具选择
安全·web安全
数据知道17 小时前
DNS 安全攻防:缓存投毒、DNS 隧道与检测实战
安全·网络安全·缓存·缓存投毒
weixin_BYSJ198718 小时前
springboot美食食谱小程序---附源码24044
java·spring boot·python·spring cloud·django·tomcat·php
其实防守也摸鱼1 天前
蓝队相关知识学习(1)---常用堡垒机和服务器
服务器·功能测试·学习·网络安全·网络攻击模型·攻防对抗·蓝队
木木子221 天前
[特殊字符] 音乐播放器——状态驱动的多媒体控制
android·开发语言·华为·php·harmonyos
酷酷的身影1 天前
Drivers/LedManager.cs
开发语言·php