缅怀先烈,吾辈当自强。
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
 