**环境:**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文件啦
找到安装目录