2020.3.28 xctf(warmup)②

由于不熟悉PHP的几个函数,我查了几个小时才弄明白后面讲的什么!!
我们首先要弄懂的几个php函数:in_array(), mb_substr(), mb_strpos(),
在这里插入图片描述在这里插入图片描述可以看到有注释source.php,访问后可以看到其源码
在这里插入图片描述发现一个hint.php文件,先访问一下
在这里插入图片描述我猜测flag就在这个ffffllllaaaagggg里面
现在我们就开始看看代码中讲的啥!!
在这里插入图片描述
这里的整个逻辑就是这里的三个判断,其中最后一个判断是利用函数,前面两个判断是很容易绕过的。
我们这里分析一下,这个函数里讲的啥!!!
在这里插入图片描述这里就相当于创建一个python中的字典(当然这里是php)
然后第一个if条件就是判断这个变量是不是存在以及是不是字符串。
第二个if条件是判断我们传进来的这个参数是不是存在于前面创建的字典中

在这里插入图片描述首先mb_strpos()返回的是?在 p a g e m b s u b s t r page中的位置(也就是一个数), mb_substr()函数是在 page字符串中截取从第二参数到第三个参数之间的字符串。
下面就接着判断这个$page是不是开始创建的字典中的值。
在这里插入图片描述这里的代码和上面的代码差不多,唯一就是多了一个urldecode(),

urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%。
urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原理就是把十六进制字符串转换为中文字符

当我们这里传进去的是hint.php或者 source.php时,经过urldecode()是不会发生任何变化的。
在这里插入图片描述http://111.198.29.45:58041/?file=hint.php?/././././ffffllllaaaagggg
或者

http://111.198.29.45:58041/?file=hint.php%253f/../../../../ffffllllaaaagggg

***%253f是 ? 的二次编码***因为这里的?第一次会在url中自动解码一次,函数中还有一次。
由此得到flag
至于这里为什么include()会执行成功!!
include函数:以字符‘/’分隔(而且不计个数),如果在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。
…/和./以及/的含义
不知道目标文件在几级目录,有几个“…/”,就向上多跳几级。

在这里插入图片描述

发布了48 篇原创文章 · 获赞 3 · 访问量 3369

猜你喜欢

转载自blog.csdn.net/DSR446/article/details/105168487