缅怀先烈,吾辈当自强。
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 | public static function checkPageValidity(&$page, array $whitelist = []) |
函数分析:如果传入的白名单为空的话,就去找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