主页面是一个滑稽

得到source.php

观看源码,提示source.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\" />";
}
?>

通过源码得到hint.php,尝试包含改文件



得到flag在ffffllllaaaagggg

直接包含是失败的,所以这里需要分析源码。

分析file传参

追踪源码的接受参数file

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方法获取file传参,通过is_string函数判断必须是一个字符串,emmm:checkFile自定义函数判断file

所以这里继续追踪到checkFile()函数

分析checkFile()方法

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;
}

定义了几种可以成功包含文件的条件

第一种可以绕过的条件

1.通过isset()判断,如果为空返回false,不为空返回true,这里取反,为空就是true,不为空就是false。还有is_string()判断,默认是字符串就为true,不为字符串就是false;这里也进行了取反,所以是字符串就是false,不为字符串就是true,所以这里字符串不能为空和不能不是字符串,否则会返回失败。

如果page在whitelist列表中,则会返回true。

所以如果绕过这里,file传入参数必须是source.php、hint.php,所以这里没有方法包含ffffllllaaaagggg

第二种可以绕过的条件

2.使用mb_substr()方法截取字符串,其中第二个值为截取的结束位置,mb_strpos()会获取第一个字符出现的位置;

所以这里就是通过mb_substr函数配合mb_strpos()获取第一个?出现的位置之前的内容

举例说明

?file=source.php  ->传入变为->  source.php?  ->通过mb_strpos()截取->  source.php

传入后默认会给我们的文件名加上一个?号,然后通过mb_strpos获取传入的文件名,最后判断文件名是否在whitelist列表中,如果存在则成功包含文件

这里可以进行绕过,payload如下

?file=source.php?./../../../../../ffffllllaaaagggg

得到flag

flag{adf218fe-948c-4a5d-8245-8bf91ff819d7}

payload分析,由于通过mb_strpos()函数获取?前面的内容判断是否存在列表,这里source.php、hint.php都可以为文件名,然后加入?后面提供传参,因为include()函数支持./、../这种相对路径,而且这关flag刚好在根目录下,所以可以得到flag。

第三绕过的方法

与第二种一样,不过对page多了一个urldecode()url解码的过程,这里可以使用二次编码绕过,将?编码两次进行绕过。

?的二次编码为%25%33%66

payload如下

?file=source.php%25%33%66./../../../../ffffllllaaaagggg

二次编码的原理是,中间件默认会进行一个url解码,然后传入PHP中又进行了一次解码,所以可以进行二次编码注入

[HCTF 2018]WarmUp 1的更多相关文章

  1. [原题复现]HCTF 2018 Warmup(文件包含)

    HCTF 2018 Warmup 原题复现:https://gitee.com/xiaohua1998/hctf_2018_warmup 考察知识点:文件包含漏洞(phpmyadmin 4.8.1任意 ...

  2. 攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup

    攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup 题目介绍 题目考点 PHP代码审计 Writeup 打开 http://220.249.52.134:37877 常规操 ...

  3. [HCTF 2018]WarmUp

    靶场首页 打开靶场后,查看源码即可看到<!--source.php--> 打开source.php页面 代码如下 <?php     highlight_file(__FILE__) ...

  4. [BUUOJ记录] [HCTF 2018]WarmUp

    BUUOJ Web的第一题,其实是很有质量的一道题,但是不知道为什么成了Solved最多的题目,也被师傅们笑称是“劝退题”,这道题的原型应该是来自于phpMyadmin的一个文件包含漏洞(CVE-20 ...

  5. 刷题[HCTF 2018]WarmUp

    解题思路 进入页面之后,一个大大的滑稽. 查看源码 查看源码发现有source.php .打开 发现还有一个hint.php.打开发现 由此可知是代码审计了 解题 代码审计 先看此段代码,大致意思是. ...

  6. CTF-WEB-HCTF 2018 Warmup

    题目链接 攻防世界-Warmup 解题思路 [原题复现]HCTF 2018 Warmup(文件包含)

  7. warmup(HCTF 2018)

    为啥想写这道题的wp呢,因为这道题就是照着phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)复现出来的 题目 查看源码很容易找到source.php,直接访问 分析 题 ...

  8. BUUCTF | [HCTF 2018]admin

    首先爬一遍整个网站,发现有没注册的时候有“login”,"register",这两个页面,注册一个123用户登录后发现有 "index“,”post“,”logout“, ...

  9. [HCTF 2018]admin

    前言: 最近在BUUCTF刷题,参照师傅们wp后复现一下 0x01 拿到题目后进去如下界面 发现有登录和注册界面,相比是要登录后才能查看想要的信息. 查看页面源代码,看看有没有上面提示,界面如下 提示 ...

  10. BUUCTF-[HCTF 2018]WarmUp

    php中可以使用strpos函数与mb_strpos函数获取指定的字符串在别一个字符串中首次出现的位置,也可以使用它们判断一串字符串中是否包含别一个字符串. PHP strpos() 函数 查找 &q ...

随机推荐

  1. Unity3D——关于质量的设置

    在Unity3D中,你开发一款游戏,可能需要同时发布到不同平台中.比如,对于PC平台,你可能需要引擎打包高质量的材质纹理,光照图信息.而对于Mobile平台,由于CPU上载数据到GPU需要一定宽带,想 ...

  2. docker从C盘迁移到D盘

    docker镜像在C盘占据大量的空间,将.docker从C:\Users\Administrator迁移到E:\.docker. 一.关闭virtual Box 使virtual Box处于关闭.停止 ...

  3. demo----日常报错

    yolov5:报错1:OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized ...

  4. 「SOL」数树 (LOJ/WC2019)

    WC 果然还是 WC # 题面 有一张 \(n\) 个点的图,图上有红蓝两种边(可能重叠),且两种边各自形成一个 \(n\) 个点的树. 用 \(m\) 种颜色给图上的所有点染色.若 \(u,v\) ...

  5. mac中Mysql各种版本下载

    https://downloads.mysql.com/archives/community/ 安装后,5.8以下修改密码,参考 https://www.cnblogs.com/xuyin/p/121 ...

  6. jmeter中response data出现乱码的解决方法

    步骤如下:1.进入jmeter\apache-jmeter-5.1.1\bin,打开jmeter.properties2.jmeter.properties中搜索"sampleresult. ...

  7. GraalVM & Spring Boot初体验

    前言 这两天封在家里,一直在琢磨想去把这个博客项目改成微服务的形式.不过就目前而言我的服务器内存放好几个Java进程是吃不消的,原因在于一个独立的JVM所占用的内存资源太吃内存.不过在云原生时代,使用 ...

  8. [杂谈吐槽]UE国内社区环境

    此篇博客是我个人想法,当然也是不争的事实,如果您有意见,那您也是我说那些人其中的一员. --此部分为社区环境差最恶劣的原因-- 国内的虚幻社区环境可以说不能再烂了,虚幻商城和虚幻引擎的蓝图是非常强大的 ...

  9. CentOS 8.x下编译php 7.4、php5.6、php5.3多版本报错处理教程

    一.编译安装php 7.4.x 参考CentOS 8.0.1905编译安装Nginx1.16.1+MySQL8.0.18+PHP7.3.10 1.安装编译工具及库文件(使用yum命令安装) yum i ...

  10. 如何运用Vue自定义组件以及组件的传值

    Vue自定义组件 引入组件 首先在项目内的components新建.vue文件. 创建完成之后搭建完整的框架.其实就是新建组件,在此之前,需要在VScode中引入一个插件(vue 2 snippets ...