HacKerQWQ的博客空间

phpmyAdmin文件包含漏洞在2018-HCTF的例题

Word count: 451Reading time: 2 min
2020/08/13 Share

HCTF-2018-Web-warmup

来人,把朕的源码端上来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) {
return true;
}

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}

逻辑:
接收file变量,三次过滤

第一次:判断文件包含的文件在不在白名单里面

第二次:截取?之前的文件名在不在白名单里面

第三次:url解码并截取?之前的文件名看看在不在白名单里面

根据提示?file=hint.php文件得到提示

解题

绕过:
利用二次编码?==>%253f,原理是服务端首先会进行一次解码,然后php代码中进行二次解码就会还原成?,然后mb_sunstr()进行截取,所以我们需要构造的payload应该是这样的?source.php%253f

之后就需要利用到PHPMyadmin4.81漏洞,具体看https://blog.csdn.net/Mikasa_/article/details/88594749,这里需要利用到的是,如果进行了双重编码,那么包含的文件就会被当做目录看待

比如说hint.php%253f时hint.php就会被当做目录看待

所以payload是:

1
?file=hint.php?file=source.php%253f/../../../../ffffllllaaaagggg

这里之所以要回推目录单纯是不知道ffffllllaaaagggg在哪个目录里面,别想太多了

flag:

CATALOG
  1. 1. HCTF-2018-Web-warmup
    1. 1.1. 解题