2020.3.28 xctf(warmup)②

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

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

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

当我们这里传进去的是hint.php或者 source.php时,经过urldecode()是不会发生任何变化的。
2020.3.28 xctf(warmup)②_第9张图片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会自动包含‘/’后面的文件——注意是最后一个‘/’。
…/和./以及/的含义
不知道目标文件在几级目录,有几个“…/”,就向上多跳几级。

2020.3.28 xctf(warmup)②_第10张图片

你可能感兴趣的:(web安全)