首页 > 评论 > 关键词 > 宝塔面板最新资讯 > 正文

宝塔面板phpMyAdmin未授权访问漏洞是个低级错误吗?

2020-08-26 08:54 · 稿源:代码审计公众号

声明:本文来自于微信公众号 代码审计(ID:white-hat-note),作者: phith0n,授权站长之家转载发布。

周日晚,某群里突然发布了一则消息,宝塔面板的phpmyadmin存在未授权访问漏洞的紧急漏洞预警,并给出了一大批存在漏洞的URL:

随便点开其中一个,赫然就是一个大大的phpmyadmin后台管理页面,无需任何认证与登录。当然,随后各种神图神事也都刷爆了社交网络,作为一个冷静安全研究者,我对此当然是一笑置之,但是这个漏洞的原因我还是颇感兴趣的,所以本文我们就来考证一下整件事情的缘由。

我们的问题究竟是什么?

首先,我先给出一个结论:这件事情绝对不是简简单单地有一个pma目录忘记删除了,或者宝塔面板疏忽大意进行了错误地配置,更不是像某些人阴谋论中说到的官方刻意留的后门。

我为什么这么说?首先,根据官方的说法,这个漏洞只影响如下版本:

  • Linux正式版7.4.2

  • Linux测试版7.5.13

  • Windows正式版6.8

这个版本就是最新版(漏洞修复版)的前一个版本。也就是说,这个确定的小版本之前的版本面板是不受影响的。我们试想一下,如果是“后门”或者官方忘记删除的目录,为什么只影响这一个版本呢?况且宝塔面板发展了这么久,积累了 400 万用户,体系安全性也相对比较成熟,如果存在这么低劣的错误或“后门”,也应该早就被发现了。

经过实际查看互联网上的案例和询问使用了宝塔面板的朋友,我发现在7.4. 2 以前的版本中没有pma这个目录,并且phpmyadmin默认情况下认证方法是需要输入账号密码的。所以,宝塔出现这个漏洞,一定是做过了下面这两件事:

  • 新增了一个pma目录,内容phpmyadmin

  • phpmyadmin的配置文件被修改了认证方式

那么,我们的问题就变成了,官方为什么要做这两处修改,目的究竟是什么?

为了研究这个问题,我们需要先安装一个宝塔7.4. 2 版本。但是,宝塔的安装是一个傻瓜化的一键化脚本:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

并没有给到用户一个可以选择版本号的选项,官方的Git也许久没更新了,我们如何才能安装到一个合适的版本(7.4.2)呢?

安装一个合适的版本

这当然难不倒我。首先,我安装了最新版的宝塔面板,用的就是上述一键化脚本。

安装的过程自然没什么问题,安装完成后,系统显示的版本号是最新版7.4.3,因为在爆出这个漏洞以后,官方迅速进行了修复升级。不过没关系,我们仍然可以找到离线升级包:

  • http://download.bt.cn/install/update/LinuxPanel-7.4.0.zip

  • http://download.bt.cn/install/update/LinuxPanel-7.4.2.zip

  • http://download.bt.cn/install/update/LinuxPanel-7.4.3.zip

分别是7.4.0/7.4.2/7.4. 3 的版本,我们分别下载并解压,并尝试将自己的服务器版本恢复成漏洞版本7.4.2。

在恢复代码之前,我们先将服务器断网,或者将宝塔设置成离线模式:

这么做的目的是防止宝塔进行自动版本更新,避免好不容易恢复的代码又自动升级了。

宝塔系统代码默认安装完是在/www/server/panel,接着我们直接将将压缩包内的panel目录上传到这里来,覆盖掉已有的文件。重启下宝塔,即可发现系统版本号已经恢复成7.4. 2 了:

还没完,我们使用beyond compare打开7.4. 2 和7.4. 3 的压缩包代码,先看看官方是怎么修复的漏洞:

比较粗暴,直接判断目录/www/server/phpmyadmin/pma是否存在,如果存在就直接删掉。所以,我们虽然恢复了系统版本代码,但删掉的pma已经不在了,我们还需要恢复一下这个目录。

方法也很简单,/www/server/phpmyadmin下本身存在一个phpmyadmin目录,我们直接复制一下这个目录即可:

漏洞究竟是怎么回事

有了环境,我们仍需看看代码。

首先,由于7.4. 2 是引入漏洞的版本,我们看看官方对7.4. 2 的更新日志:

用beyond compare打开7.4. 0 和7.4. 2 的压缩包代码,看看具体增加了哪些代码:

可见,在7.4. 2 版本中增加了两个视图,分别对应着phpmyadmin和adminer。视图中用到了panelPHP#start方法,这个方法其实也是新加的:

   def start(self,puri,document_root,last_path = ''):
        '''
            @name 开始处理PHP请求
            @author hwliang<2020-07-11>
            @param puri string(URI地址)
            @return socket or Response
        '''
        ...
        #如果是PHP文件
        if puri[-4:] == '.php':
            if  request.path.find('/phpmyadmin/') != -1:
                ...
                if request.method == 'POST':
                    #登录phpmyadmin
                    if puri in ['index.php','/index.php']:
                        content = public.url_encode(request.form.to_dict())
                        if not isinstance(content,bytes):
                            content = content.encode()
                        self.re_io = StringIO(content)
                        username = request.form.get('pma_username')
                        if username:
                            password = request.form.get('pma_password')
                            if not self.write_pma_passwd(username,password):
                                return Resp('未安装phpmyadmin')
                if puri in ['logout.php','/logout.php']:
                    self.write_pma_passwd(None,None)
            else:
                ...
           
        #如果是静态文件
        return send_file(filename)

代码太长,我们不展开分析,只我写出来的部分。在请求的路径是/phpmyadmin/index.php且存在pma_usernamepma_password时,则执行self.write_pma_passwd(username,password)

跟进self.write_pma_passwd

 def write_pma_passwd(self,username,password):
        '''
            @name 写入mysql帐号密码到配置文件
            @author hwliang<2020-07-13>
            @param username string(用户名)
            @param password string(密码)
            @return bool
        '''
        self.check_phpmyadmin_phpversion()
        pconfig = 'cookie'
        if username:
            pconfig = 'config'
        pma_path = '/www/server/phpmyadmin/'
        pma_config_file = os.path.join(pma_path,'pma/config.inc.php')
        conf = public.readFile(pma_config_file)
        if not conf: return False
        rep = r"/\* Authentication type \*/(.|\n)+/\* Server parameters \*/"
        rstr = '''/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = '{}';
$cfg['Servers'][$i]['host'] = 'localhost'; 
$cfg['Servers'][$i]['port'] = '{}';
$cfg['Servers'][$i]['user'] = '{}'; 
$cfg['Servers'][$i]['password'] = '{}'; 
/* Server parameters */'''.format(pconfig,self.get_mysql_port(),username,password)
        conf = re.sub(rep,rstr,conf)
        public.writeFile(pma_config_file,conf)
        return True

这就是为什么7.4. 2 版本中pma可以直接访问的原因。

补个课:

phpmyadmin支持数种认证方法,默认情况下是Cookie认证,此时需要输入账号密码;用户也可以将认证方式修改成Config认证,此时phpmyadmin会使用配置文件中的账号密码来连接mysql数据库,即不用再输入账号密码。

官方做这些动作的原因

其实各位看官看到这里肯定脑子里还是一团浆糊,这些代码究竟意味着什么呢?为什么官方要将认证模式改成config模式?

是很多漏洞分析文章的通病,这些文章在出现漏洞后跟一遍漏洞代码,找到漏洞发生点和利用方法就结束了,并没有深入研究开发为什么会这么写,那么下次你还是挖不出漏洞。

所以,这里思考一下,我们现在起码还有下列疑问:

  • 在7.4. 2 版本以前,用户是如何使用phpmyadmin的?

  • 宝塔为什么要在7.4. 2 版本增加phpmyadmin有关的视图?

  • 宝塔为什么要将phpmyadmin认证模式改成config?

  • 我们如何复现这个漏洞?

第一个问题,我们其实可以简单找到答案。在正常安装宝塔最新版7.4. 3 时,我们点击宝塔后台的phpmyadmin链接,会访问到这样一个路径:

7.4. 3 版本为了修复这个漏洞,回滚了部分代码,所以这种方式其实就是7.4. 2 以前版本的phpmyadmin的访问方式:通过 888 端口下的一个以phpmyadmin_开头的文件夹直接访问phpmyadmin。

这种老的访问方法中, 888 端口是一个单独的Nginx或Apache服务器,整个东西是安全的,访问也需要输入账号密码。

但是这种访问方法有些麻烦,需要额外开放 888 端口,而且每次登陆都要重新输入密码。所以,官方开发人员提出了一种新的做法,在宝塔后端的python层面转发用户对phpmyadmin的请求给php-fpm。这样有三个好处:

  • 直接在python层面做用户认证,和宝塔的用户认证进行统一,不需要多次输入mysql密码

  • 也不需要再对外开放 888 端口了

  • 使用phpmyadmin也不再依赖于Nginx/Apache等服务器中间件了

这就是为什么宝塔要在7.4. 2 增加phpmyadmin有关的视图的原因,这个视图就是一个phpmyadmin的代理,做的事情就是转发用户的请求给php-fpm。

用户在第一次使用这种方式登录时,系统会自动发送包含了Mysql账号密码的数据包,宝塔后端会捕捉到此时的账号密码,填入phpmyadmin的配置文件,并将认证方式改成config。对于用户来说,感受到的体验就是,不再需要输入任何Mysql密码即可使用phpmyadmin了。

这的确给用户的使用带来了更好的体验。

漏洞复现

此时我们应该还有个疑问:既然官方目的是“直接在python层面做用户认证,和宝塔的用户认证进行统一”,那么仍然是有认证的呀?为什么会出现未授权访问漏洞呢?

我们可以来复现一下这个漏洞。首先,我们以系统管理员的身份登录宝塔后台,来到数据库页面,点击“phpMyAdmin”按钮,会弹出如下模态框:

这个里面有两种访问模式,“通过Nginx/Apache/OIs访问”是老版本的访问方式,“通过面板安全访问”就是7.4. 2 新增加的代理模式。

我们点击“通过面板安全访问”,并抓包,会抓到这样一个数据包:

宝塔前端将我们的Mysql账号密码填好了直接发给phpmyadmin。又因为我们前面分析过的那段代码,后台将账号密码直接写入了phpmyadmin配置文件,来做到免认证的逻辑。

如果一个未认证的用户,直接访问http://ip:8888/phpmyadmin/index.php呢?会被直接重定向到登录页面:

如果仅仅是这样,这个过程是不存在漏洞的。但是,官方开发人员犯了一个错误,他将pma应用放在了/www/server/phpmyadmin目录下,而这个目录原本是老的phpmyadmin访问方式所使用的Web根目录。

这意味着,我通过老的 888 端口+pma目录,可以访问到新的phpmyadmin,而新的phpmyadmin又被官方修改了配置文件,最终导致了未授权访问漏洞:

所以,如何解决这个问题呢?也很简单,只需要将pma移到其他目录去即可。

总结

我们来做个总结。

首先,宝塔面板绝对不是弱智,这个漏洞不是简简单单的放了一个未授权的pma在外面忘记删。这其实会打很多人脸,因为大部分人认为这只是个简单的phpmyadmin未授权访问漏洞,并对宝塔进行了一顿diss,没有想到这后面其实是一个复杂的逻辑错误。

其次,用户体验和安全绝对是不冲突的,我十分不喜欢为了保障安全而阉割用户体验的做法。所以希望宝塔官方不会因为这次的漏洞事件而彻底将代码回滚(据说7.4. 3 的更新只是临时解决方案),该改进的地方还是要改进。

我有数年不再使用Linux面板了,这次也算重新体验了一下 2020 年的Linux面板,个人感觉宝塔看外在其实是一个比较注重安全的系统,比如自动生成的用户密码、用户名和密码的策略、默认的Php安全配置、自动的版本更新等等,相比于很多国内其他的商业系统,绝对属于有过之而无不及了。但是看代码其实需要改进的地方还有很多,这个以后有机会再细说吧。

  • 相关推荐
  • 大家在看
  • 宝塔面板曝出严重安全漏洞!站长需赶紧升级到最新版本

    昨日,宝塔面板被曝出存在严重安全漏洞,目前官方已经给宝塔面板用户发送短信提醒升级,影响范围包括了宝塔linux面板 7.4.2以及宝塔windows面板 6.8。

  • 迪普科技:慧眼识漏洞之【后门漏洞

    风险管理很头痛?慧眼帮您识漏洞。后门持久又隐蔽,绕过认证和加密。执行代码传文件,注入程序来攻击。漏洞补丁常升级,可疑文件不接收。实时关注新动态,慧眼快速来排查。后门 后门是一种绕过认证或系统加密来获取系统访问权的方法。有时开发人员会出于某原因,有意或无意为自己的程序构建后门程序,但是,如果这些后门被其他人发现,那么它就成了安全风险,容易被黑客当成漏洞进行攻击。而另一方面,攻击者则会将后门注入到有漏洞

  • 思科数据中心管理系统爆出大量漏洞,或将影响所有Nexus和MDS系列交换机

    Cisco Data Center Network Manager(DCNM)是美国思科(Cisco)公司的一套数据中心管理系统。该系统适用于Cisco Nexus和MDS系列企业交换机,提供存储可视化、配置和故障排除等功能。Nexus 系列交换机为不同企业提供多种规格,可实现经验证的高性能、高密度(最高达 400G),以及低时延和出色的能效。这些交换机可编程性高,提供行业领先的软件定义网络,可助力实现数据中心自动化。2020年第一季度,思科交换机和路由器全球市场占

  • NEC爆出大量安全漏洞,或将影响所有中小企业及政府!

    日本NEC是全球IT、通信网络的领先供应商之一,也是全球500强企业之一。NEC主要从事IT服务、平台业务、运营商网络、社会基础设施、个人解决方案等产品的研发、集群软件、生产和销售,产品多达15000多种.NEC在全球150多个国家和地区开展业务,融合先进的信息技术和网络技术,向政府、企业及个人提供卓越的综合解决方案。不过7月30日,NEC被爆其通信产品和解决方案中存在大量安全漏洞,旗下多款通信服务器和电话交换机纷纷中招,或将影响

  • 苹果Safari被曝安全漏洞 可导致用户设备文件泄露

    今天,一名安全研究人员公布了关于Safari浏览器漏洞的详细信息,该漏洞可能被用来泄露或窃取用户设备中的文件。

  • 高通DSP芯片被曝 6 个漏洞事件引发的安全危机猜想

    近日,国外知名安全研究机构Check Point发现,高通骁龙系列芯片的数字信号处理芯片(DSP)中存在大量漏洞,总数多达 400 多。研究人员表示,由于易受攻击的DSP芯片“几乎见于世界上所有的安卓手机上”,导致全球受此漏洞影响的机型超过40%,其中不乏有全球知名品牌手机。报告中指出,攻击者利用这些漏洞不仅可以将手机变成一个完美的监听工具,而且还能够使手机持续无响应,或者锁定手机上的所有信息,使用户永远不可访问。此外,?

  • IBM 多款产品爆出漏洞,或严重影响银行等金融机构

    IBM是全球最大的信息技术和业务解决方案公司,其全球能力包括服务、软件、硬件系统、研发及相关融资支持。IBM始终以超前的技术、出色的管理和独树一帜的产品领导着信息产业的发展,保证了世界范围内几乎所有行业用户对信息处理的全方位需求。不过IBM于7月31日发布了安全公告,IBM 旗下多款产品存在大量漏洞,或严重影响银行等金融机构。以下是漏洞详情:一.金融事务管理器(FTM HVP)IBM Financial Transaction Manager for High Va

    IBM
  • 安全人员称苹果Enclave存在漏洞 但不会影响大多数iPhone用户

    安全研究人员近日披露了苹果Secure Enclave处理器的一个漏洞,但虽然敏感信息的数据存储,意味着包括Apple Pay详情和Face ID生物识别记录在内的数据有可能受到攻击者的攻击,但事实上,这对于绝大多数苹果客户来说,它不大可能成为一个问题。

  • 盘古团队发现苹果不可修复漏洞:iOS 14能完美越狱

    来自中国的安全团队盘古对iOS 14进行了完美越狱,而他们利用了苹果Secure Enclave安全协处理器上的一个“永久性”的漏洞。Secure Enclave安全协处理器几乎是苹果产品的标准配置,它

  • 盘古团队演示iOS 14越狱:发现Secure Enclave存“不可修复”漏洞

    日前召开的 Mosec 2020 大会上,国内越狱团队盘古发现了苹果 Secure Enclave 安全协处理器上的一个“永久性”的漏洞。这可能会让 iPhone、iPad、Mac、Apple Watch 和其他苹果设备处于危险当中。

  • 云安全提醒:火狐浏览器爆出大量安全漏洞,赶紧更新!

    美国Mozilla是一个以创作Firefox网页浏览器而闻名的自由软件社区。Mozilla社区开发、推广和支持Mozilla相关项目,致力于推动自由软件与开放标准的发展。Mozilla Firefox(火狐浏览器)是Mozilla基金会的产品,它是一款开源Web浏览器,引擎反应快,内存占用少。Firefox从2005年开始,每年都被媒体选为年度最佳浏览器。Mozilla Firefox ESR是Firefox(Web浏览器)的一个延升支持版本,适用于企业或者工作单位,又称Firefox企业版。它具有体?

  • 谷歌Chrome浏览器发现漏洞 需尽快升至 84 及以上版本

    8 月 10 日 , 安全研究员在 Windows,Mac 和 Android 的基于 Chromium 的浏览器(Chrome,Opera 和 Edge)中发现了零日 CSP 绕过漏洞(CVE-2020-6519)。该漏洞使攻击者可以完全绕过 Chrome 73 版(2019 年 3 月)至 83 版的 CSP 规则 , 潜在受影响的用户为数十亿,其中 Chrome 拥有超过 20 亿用户。

  • Windows 10再爆重大漏洞:微软5月就知晓但迟迟不行动

    Windows 10又出现了新的漏洞,不过这次跟之前不太一样,因为微软早在几个月前就知道了,只是迟迟没有行动。在Windows Print Spooler中存在一个未打补丁的漏洞,攻击者可利用该漏洞以提升系统权

  • 深信服EDR推出下一代轻补丁漏洞免疫

    漏洞利用在现今的各类网络攻击和恶意软件中拥有很高的曝光率,已经成为了攻击过程中的重要环节。与此同时,高危漏洞频发,微软官方2020年以来已披露了约620种能够被黑客攻击利用的漏洞。因此,漏洞修复防御的问题已不容小觑。 然而,传统的漏洞修复方案存在很大的不足。一方面新型漏洞不断增加,补丁难以及时发布,对于微软停更的系统,更无法提供漏洞修复支持;另一方面企业即使打上补丁也需要重启服务才能修复,影响业务连续性?

  • Windows10再爆重大漏洞:微软5月就知晓但迟迟未采取行动

    8月8日消息,微软Windows10 又出现了新的漏洞,不过这次跟之前不太一样,因为微软早在几个月前就知道了,只是迟迟没有没有采取任何行动。

  • 云安全日报:思科厂商发现BootHole漏洞,需要尽快升级

    思科(Cisco)于8月4日晚,针对先前广为人知的BootHole漏洞发布了安全公告。思科表示,目前而言,特定产品漏洞暂未有可用的解决办法,但是思科正在调查其产品线,以确定哪些产品和云服务可能受此漏洞影响。随着调查的进行,思科将使用有关受影响的产品和服务的信息更新此通报。BootHole漏洞这里,我们先回顾下BootHole漏洞。7月29日,安全研究员在GRUB2引导加载程序中发现了一个名为BootHole的严重漏洞(代号CVE-2020-10713)。该漏

  • 热搜安排!微信亲属卡存漏洞:账户资金被盗刷

    7月27日消息,“微信亲属卡存漏洞成新型诈骗利器”登上微博热搜。据媒体报道,来自广州的吴某冒充贷款中介人员与被害人沟通,诱导被害人与其建立微信“亲属卡”,从而盗刷

  • 微软Office漏洞可控制苹果macOS 会影响不定期更新软件的用户

    前美国国家安全局黑客Patrick Wardle发现了微软Office 的Mac版本存在的一个安全漏洞,可导致黑客控制整台Mac电脑。

  • 过去一年,微软为安全漏洞奖励支出1370万美元

    微软透露,自去年 7 月以来,它已向安全研究人员奖励了 1370 万美元,用于鼓励提交微软软件漏洞的行为。

  • 微信亲属卡存漏洞成新型诈骗利器 专家提醒防范建议介绍

    【微信亲属卡存漏洞成新型诈骗利器】近日有多家媒体报道,,近日广州吴某通过冒充贷款中介人和审核员,诱使被害人与其建立微信「亲属卡」,从而盗走账户内的资金。

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议
  • 热门标签

热文

  • 3 天
  • 7天