【CVE-2018-12613】phpmyadmin 4.8.1 远程文件包含漏洞复现

**环境:**http://62.234.56.138:8080/server_databases.php
在这里插入图片描述

官网下载phpmyadmin 4.8.1

源码:index.php文件中
在这里插入图片描述
函数含义:

  • targer非空
  • targer是否位字符串
  • 不能以index为开头,即过滤了index
  • 值不能出现在blacklist内,即黑名单
  • Core类的checkPageValidity方法判断(菜鸡扣jio)

前两个不重要,第三个条件:
全局搜索:
在这里插入图片描述
说明过滤了 ‘import.php’, ‘export.php’ 两个字符串

第四个条件:
代码在libraries\classes\Core.php 443-476行
在这里插入图片描述

含义:
checkPageValidity函数里又是五个判断:

1、$ whitelist为空则引用静态声明的$goto_whitelist

2、如果$ page没有被定义过或者$page不为字符串则return false

3、$ page存在$whitelist中的某个值则返回true

4、$ _page存在$whitelist中的某个值则返回true

5、经过urldecode函数解码后的$ _page存在$whitelist中的某个值则返回true

绕过:
所以传入二次编码后的内容,会让checkPageValidity()这个函数返回true,但index中实际包含的内容却不是白名单中的文件
例如传入
?target=db_datadict.php%253f
由于服务器会自动解码一次,所以在checkPageValidity()中,$ page的值一开始会是db_datadict.php%3f,又一次url解码后变成了db_datadict.php?,这次便符合了?前内容在白名单的要求,函数返回true
但在index.php中$_REQUEST[‘target’]仍然是db_datadict.php%3f,而且会被include,通过目录穿越,就可造成任意文件包含

即:缺陷在urldecode() 我们可以利用这个函数绕过白名单检测,只要把 ? 两次url编码为 %253f 即可绕过验证

漏洞复现:
执行:SELECT ‘<?php phpinfo()?>’;
在这里插入图片描述

查看cookie:
查看自己的sessionid(cookie中phpMyAdmin的值)
在这里插入图片描述
访问:http://192.168.20.128:8080/?target=db_sql.php%253f/…/…/…/…/…/…/…/…/tmp/sess_7350253b89aa88dbbfda47e4307c64a2
在这里插入图片描述
就可以看到session文件啦

找到安装目录
在这里插入图片描述