宝塔PMA漏洞复现

之前有一天,宝塔发短信给我说紧急安全更新,然后发现一些Q群也炸开了锅。

才发现事情的严重性,好在我把不必要的端口号禁用了,所以没受到攻击。

漏洞原因

在Linux面板7.4.2/Windows面板6.8.0 版本中加入了phpmyadmin安全访问模块,原理是通过面板进行访问phpmyadmin,而不是nginx/apache,但因在目录存放时存在一个致命逻辑漏洞,导致nginx/apache也可以访问到专门给面板使用的phpmyadmin目录,我们在做安全审计时将重心放在面板程序中,忽略了除面板外被访问的可能,从而导致了此事件的发生。

漏洞影响

受影响的机器

需同时满足以下所有条件

1、软件版本为Linux面板7.4.2 或者Windows面板6.8.0

2、开放888且未配置http认证

3、安装了phpmyadmin,mysql数据库

4、至少通过面板管理链接进入过phpmyadmin一次

自行检测漏洞方式:http://IP:888/pma

如果能直接访问phpmyadmin,则存在安全漏洞

不受影响的机器

只需满足一条则不受影响

1、未开放888端口

2、针对888端口做了严格的安全认证

3、未安装phpmyadmin

4、未安装mysql数据库

5、面板版本不为Linux面板7.4.2/Windows面板6.8.0

漏洞复现

通过访问ip:888/pma则可无需任何登录操作直接进入phpmyAdmin,漏洞利用难度为”0“。

防御

很多人都喜欢用第三方面板,因为方便可以一键傻瓜式部署而不用去纠结一些环境的配置,但是只要是第三方就一定存在漏洞。这类漏洞有大有小,如果被一些不法分子利用,将会造成很严重的影响,毕竟数据无价。我总结出了一下几点:

  1. 每天定时备份全站数据尤其是数据库,建议本地服务器备份一份,其他地方再备份一份(对象存储或云盘或FTP等),阿里或腾讯云可以创建定时快照
  2. 每天关注安全漏洞话题,发现与自己有关的漏洞及时自查,以免造成损失
  3. 设置好数据库等敏感端口(22、888、3306、3389、6379、27017)的防火墙规则或者设置白名单,能走内网的服务就不要走公网
  4. 尽量减少使用第三方面板,使用 Docker 或者命令行编译安装的方式部署环境

恢复数据库

如果你能按照我上面所述的做,就算数据库被删也能轻而易举的恢复,但是不少站长都没有数据库备份,一旦数据库丢失就只能傻眼,其实还有一种方法可以恢复数据库,但是不一定能完全恢复。

MySQL 有二进制日志,里面记录了由开启到停止所有数据库的所有增删改操作,所以只能恢复出现过 SQL 语句的数据,比如你在 WordPress 上发布了一篇文章,本质就是 MySQL 数据库执行了一条 SQL 插入语句。此恢复方法适用于数据灾难的、数据库总体和高精度的恢复,不适合日常的数据恢复,所以平常还是要做好数据的备份!

此方法在使用前必须先创建一个服务器快照,以防万一。

先登陆 MySQL,使用 mysql -h localhost -uroot -p<password> 指令或者使用任意一款第三方数据库连接软件。

使用 show variables like 'log_bin'; 检查是否开启 binlog 日志功能,ON 代表开启,OFF 代表没有开启;宝塔默认都是开启的,如果是 OFF 那没救。

使用 show master logs;show binary logs; 命令查看已有的 binlog 日志文件。

恢复数据库,使用 mysqlbinlog 命令恢复数据库。

--start-date 开始日期,时间格式为2020-08-23 00:00:00,恢复到这个时间之后的数据
--stop-date 结束时间,时间格式为2020-08-23 00:00:00,恢复到这个时间段之前的数据
--start-position 指定开始位置,恢复到此位置之后的数据
--stop-position 指定结束位置,恢复此位置之前的数据

例:
先导出你要还原的 binlog 日志文件,得到时间或者位置
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000004 > /root/test.txt
恢复整个日志文件
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-binlog.000004 | mysql -uroot -p
按时间还原
/www/server/mysql/bin/mysqlbinlog --start-datetime="2020-08-23 00:00:00" --stop-datetime="2020-08-23 23:59:59" /www/server/data/mysql-binlog.000004 | mysql -uroot -p
按位置还原
/www/server/mysql/bin/mysqlbinlog --start-position=150 ---stop-position=340 /www/server/data/mysql-binlog.000004 | mysql -uroot -p

然后回到数据库表,看看数据是否已经恢复,不保证 100% 恢复。

开启binlog日志记录

已经开启的就不用管了,没开启的按如下操作:

修改 etc/my.cnf 文件,在 [mysqld] 下加入

log-bin=mysql-bin
binlog_format=mixed
server-id = 1

重启 MySQL 服务即可

systemctl restart mysqld

防御-开启binlog日志记录的内容为转载

转载地址:https://m1314.cn/512.html

Comments | NOTHING

    空空如也!

消息盒子
# 您需要首次评论以获取消息 #
# 您需要首次评论以获取消息 #

只显示最新10条未读和已读信息