20200404学习笔记

缅怀先烈,吾辈当自强。

CVE-2018-12613 phpmyadmin LFI &&buuoj ezweb : )

参考链接:https://www.freebuf.com/vuls/176064.html
首先分析index.php:
在index.php 第56行,

传入的target参数需要满足四个条件:
1.是字符串
2.不能以index开头
3.不在黑名单内
4.通过checkPageValidity函数检验,即返回true
跟进checkPageValidity函数

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
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
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;
}

return false;
}

函数分析:如果传入的白名单为空的话,就去找goto_whitelist。
如果没有设置page或者page变量不是字符串 返回false。
如果page在白名单内,返回true
mb_strpos($page . ‘?’, ‘?’)获得page变量?前的长度 注意:’.’用来连接两个字符串
mb_substr 获得[start,end)长度的字符串。
举例如下:

继续分析。
来到

1
2
3
4
5
6
7
8
9
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

将?两次urlencode编码后为%253f。进入php后会自动解码一次,变成%3f,然后再次解码,成功绕过检验。(不双重编码无法绕过的原因为:如果直接给一个?的话,在第一个截取验证中,php会把问号后面的东西当作参数,include的还是db_sql.php。)
所以index.php中的INCLUDE变成了:
include db_sql.php%3f(由于php会把db_sql.php%3f当成目录,所以需要多加一个../来跨目录。)
payload:http://192.168.0.106:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd