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的更多相关文章

  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. BUUCTF | [HCTF 2018]admin

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

  4. [HCTF 2018]WarmUp

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

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

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

  6. 刷题[HCTF 2018]WarmUp

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

  7. CTF-WEB-HCTF 2018 Warmup

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

  8. warmup(HCTF 2018)

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

  9. [HCTF 2018]admin

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

随机推荐

  1. 用BusyBox制作Linux最小系统

    1.下载busybox-1.30.1 地址:https://busybox.net/downloads/busybox-1.30.1.tar.bz2 2.解压:tar xvf busybox-1.30 ...

  2. 洛谷 P3801 红色的幻想乡

    题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...

  3. JSONPath 表达式的使用

    一.JSONPath使用需要的包 <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactI ...

  4. leetcode349 350 Intersection of Two Arrays & II

    """ Intersection of Two Arrays Given two arrays, write a function to compute their in ...

  5. 使用WinDbg分析蓝屏dump原因

    大多数人或许都经历过系统蓝屏问题,然而大多数人不清楚该怎么处理蓝屏问题,这里主要对系统蓝屏做一些解释,同时介绍下蓝屏问题分析工具WinDbg分析蓝屏问题的一般步骤. 微软官方对蓝屏的定义是,当系统遇到 ...

  6. MyBatis: No MyBatis mapper was found in '[xx.mapper]' package. Please check your configuration

    在应用入口加入@MapperScan("com.IBM.XXXXX.dao")

  7. 吴裕雄--天生自然java开发常用类库学习笔记:取得当前日期

    import java.util.* ; // 导入需要的工具包 class DateTime{ // 以后直接通过此类就可以取得日期时间 private Calendar calendar = nu ...

  8. SSH和SFTP的简单使用

    ssh命令 ssh 命令用来远程登录linux主机:ssh username@hostname 默认端口是22,如果设定了其他端口,那么使用-p参数来指明,例如端口若改为6666, 则登录命令变为 s ...

  9. java中JDBC当中请给出一个DataSource的HelloWorld例子

    在前面 的jdbc的Helloworld程序当中,我们用DriverManager来获取数据库连接.事实上通过这种方法获取数据库连接,是比较耗费计算机资 源的.当然了,这也是没有办法的事儿.就像我们买 ...

  10. css怎么让图片垂直左右居中?(外层div是浮动且按照百分比排列)

    一.原始的居中方法是把div换成table <div style="width: 500px; height: 200px; border: solid 1px red; text-a ...