漏洞描述:
2018年6月19日,phpmyadmin在最新版本修复了这这个漏洞。
一个攻击者可以在服务器上包含(查看和潜在执行)文件的漏洞被发现。
该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。
攻击者必须经过身份验证,但在这些情况下除外:
$ cfg ['AllowArbitraryServer'] = true:攻击者可以指定他/她已经控制的任何主机,并在phpMyAdmin上执行任意代码
$ cfg ['ServerDefault'] = 0:这会绕过登录并在没有任何身份验证的情况下运行易受攻击的代码
影响版本:
phpMyAdmin 4.8.0和4.8.1
漏洞分析:
漏洞入口在index.php文件,55-63行。
包含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中的数组。
加上条件为否,所以就是不能import.php,export.php.只要不是这两个值就行。
最后看下Core类下的checkPageValidity方法,在/libraries/classes/Core.php。
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.
只能接这么多了,还差8个,哈哈哈。
第二个判断就是判断是否为字符串,这里需要为字符串。第三个判断target是否为$whitelis中的。是返回true。再看下个判断,这里对target做了判断,用?隔开。这里主要是phpmyadmin考虑问题比较周全,他想?后面可能还有参数。所以对?前面的数据做判断。这也是漏洞产生的原因。后面是直接对?做一次解码。然后判断经过urldecode函数解码后的$_page存在$whitelist中的某个值则返回true。这里就需要对?进行二次编码。?二次url编码为%253可绕过。
漏洞复现:
4.8.1环境。
检测是否存在漏洞
http://192.168.220.131:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd
可以看到,直接运行了etc/passwd文件。说明存在漏洞。
getshell:
第一种:general_log,直接参考以下链接:
https://blog.csdn.net/Mikasa_/article/details/88425166
第二种:
这种比较简单,我用的就是第二种。
首先可以先执行一下SELECT '<?php phpinfo()?>';,执行成功之后
执行成功后,查看然后查看自己的sessionid,phpMyadmin的值
把值带到sess_,最后直接访问:
http://192.168.220.131:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_9cbee809ad7f5563614a5961739ed19d
可以执行成功。
修复建议:
在漏洞发布不久,该漏洞已经被修复,漏洞存在于版本号小于4.8.2的所有历史版本中,通过git changelog查看官方如何修复漏洞的。查看补丁源码,参考URL:https://github.com/phpmyadmin/phpmyadmin/commit/d1360f46cef76c5182116eb2b8fdbab1b20e687a
发现修复手法简单粗暴,直接在checkPageValidity中多加了一个参数$include。当$include=true时,仅执行第一次判断$page的合法性,我们的payload也就没有办法进入到urldecode的步骤了.
参考链接:
作者:低调求发展
链接:https://www.jianshu.com/p/67457e72cdec
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。