打开题目:
好好好。
看看源码:
? source.php
让我看看!
发现还有个文件叫hint,php
看看:
得到目的文件是ffffllllaaaagggg
分析代码:
$_REQUEST
变量 $_REQUEST用于收集HTML表单提交的数据,默认情况下包含了$_GET,$_POST和$_COOKIE的数组。
GET是从服务器上获取数据,GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
POST是向服务器传送数据,POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址,用户看不到这个过程。
通过POST和GET方法提交的所有数据都可以通过$_REQUEST["参数"]获得。
empty()
empty(var) 函数用于检查一个变量是否为空,当 变量var 存在,并且是一个非空非零的值时返回 FALSE 否则返回 TRUE。
is_string()
is_string(var)检测变量是否是字符串,如果var是字符串则返回true,否则返回false。
include
include语句包含并运行指定文件。
文件查找过程:
1、被包含文件先按参数给出的路径寻找。
2、如果没有给出目录(只有文件名)时则按照include_path指定的目录寻找。
3、如果在include_path下没找到该文件,则include最后才在调用脚本文件所在的目录和当前工作目录下寻找。
4、如果最后仍未找到文件则include会发出一条警告。
逻辑结构
传入的file参数需满足以下3个条件,才可包含并运行file:
(1)不为空。
(2)为字符串。
(3)emmm::checkFile($_REQUEST['file']) 返回 true,也就是必须在白名单里。
函数作用:
mb_substr: 获取部分字符串。
mb_strpos: 查找字符串在另一个字符串中首次出现的位置。
in_array($needle, $haystack):needle待搜索值,haystack待搜索数组。
两种方法:
NO.1:
我们可以采用的方法就是构造payload?file=hint.php?../../../../../../ffffllllaaaagggg,利用第二个if进行绕过,使checkFlie返回真值,从而包含我们的ffffllllaaaagggg文件得出flag
NO.2:
我们可以通过对?进行二次编码从而绕过p a g e = u r l d e c o d e ( _page = urldecode(
page=urldecode(page)
?file=hint.php%253f../../../../../ffffllllaaaagggg
原理如下:在我们将参数传给file时,服务器端会自动进行一次url解码,然后这里还有个urldecode再进行一次解码。共两次解码,所以我们可以使用两次编码进行绕过urldecode,?一次url编码%3f,二次url编码%253f。然后就是第一种方法中。
就得到了flag。