[HCTF 2018]WarmUp (代码审计)

打开题目:
[HCTF 2018]WarmUp (代码审计)_第1张图片

好好好。

看看源码:
[HCTF 2018]WarmUp (代码审计)_第2张图片

? source.php

让我看看!

[HCTF 2018]WarmUp (代码审计)_第3张图片

发现还有个文件叫hint,php

看看:
[HCTF 2018]WarmUp (代码审计)_第4张图片

得到目的文件是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。然后就是第一种方法中。

[HCTF 2018]WarmUp (代码审计)_第5张图片

就得到了flag。

你可能感兴趣的:(CTF,网络安全)