主页面是一个滑稽

得到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. javaSE-验证码生成

    一.使用Math类的radom() 方法 //生成验证码 String verifcationCode = ""; for (int i = 0; i <= 5; i++) ...

  2. TypeScript 元组

    TypeScript 元组 我们知道数组中元素的数据类型都一般是相同的(any[] 类型的数组可以不同),如果存储的元素数据类型不同,则需要使用元组. 元组中允许存储不同类型的元素,元组可以作为参数传 ...

  3. jadx 定位方法

    目录 链接参数定位 链接参数定位 通过搜索请求链接中的参数来定位函数位置,如下图所示,请求链接为 https://www.python-spider.com/api/app1,app1为链接标识,可以 ...

  4. redis数据类型常用方法

    一.String set:添加String类型数据 get:获取String类型数据 del:删除数据 append:在原基础上追加数据,假如原来k1值是v1,执行append k1 ddd,那么值就 ...

  5. Vue3 + echarts 统一封装

    1. 新建 echartsLib.js 文件,统一导入需要的组件 import * as echarts from "echarts/core"; import { SVGRend ...

  6. 20201003--统计数字字符个数(奥赛一本通 P98 1--字符类型和字符数组)

    输入一行字符,统计出其中数字字符的个数 输入:一行字符串,总长度不超过255 输出:一行,输出字符串里面数字字符的个数. 样例输入:Peking University is set up at 189 ...

  7. Spring系列之验证-14

    目录 Java Bean 验证 Bean 验证概述 配置 Bean 验证提供程序 注入验证器 配置一个`DataBinder` Spring MVC 3 验证 Java Bean 验证 Bean 验证 ...

  8. Vue项目目录树

  9. c++标准官网

    gcc官网: https://gcc.gnu.org/ c++参考手册: https://en.cppreference.com/w/cpp c++教程网站: https://www.learncpp ...

  10. expected expression before')'token

    如上图所示,今天遇到的一个编译问题,明明用法跟其他地方的一摸一样,在主程序里编译就没问题,动态库里死活都编译不过去,可把我折磨死了,最后没办法,只能请教大佬,大佬过来几分钟就找到了问题,真正出错的地方 ...