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. L2-002. 链表去重(模拟)

    题意: 给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点.即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留.同时,所有被删除的结点必须被保存在另外一个链 ...

  2. python 文本文件操作

    文件操作三步走:打开.读写.关闭. open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, close ...

  3. C语言中指针和取地址符&的关系

    一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...

  4. Verilog 2001 `default_nettype none

    在Verilog 1995規定,對於沒宣告的信號會自動視為wire,這樣常常造成debug的困難,Verilog 2001另外定義了`default_nettype none,將不再自動產生wire. ...

  5. 047、Java中使用if…else if…else判断

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  6. .Net内存回收

    研究了好半天的GC.Collect(),遗憾的发现,无法主动控制内存的回收. 只有窗体最小化的时候,内存才回收. 貌似gc.collect只是告诉虚拟机,准备回收内存吧.   GC.WaitForPe ...

  7. angularJS 服务

  8. Docker-harbor-V1.3.0 ”私有仓库“搭建 Easy

    准备: centos     7.0 Docker version 1.12.6    docker-compose version 1.19.0   1: updata-yum:   更新yum 源 ...

  9. win下的常用8个命令

    windows下常用的几个指令 一,ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的 ...

  10. jQuery省市联动(XML/JSON)

    准备: 导包 在src下导入c3p0-config.xml 导入JDBCUtil 创建数据库 新建js文件夹导入jQuery配置文件 NO01:创建city.jsp页面 <%@ page lan ...