mysql注入攻击解决及数据恢复方案

438 阅读2分钟

有个同学的网站数据库被攻击了,帮助他解决了问题,方案总结如下:

解决注入攻击

先从binlog中查看delete发生的一些信息,其中xxx是被注入攻击的数据表

/*!*/;
# at 336709848
#210329  8:56:28 server id 1  end_log_pos 336710012 CRC32 0x2b65da43    Query   thread_id=2709226       exec_time=0     error_code=0
SET TIMESTAMP=1616979388/*!*/;
delete from xxx where plid='-1' OR 2+224-224-1=0+0+0+1 or 'KdbhJkw4'=''
/*!*/;
# at 336710012
#210329  8:56:28 server id 1  end_log_pos 336710100 CRC32 0xb3246006    Query   thread_id=2709226       exec_time=0     error_code=0
--
/*!*/;
# at 336710811
#210329  8:56:29 server id 1  end_log_pos 336710964 CRC32 0x515b7b9d    Query   thread_id=2709228       exec_time=0     error_code=0
SET TIMESTAMP=1616979389/*!*/;
delete from xxx where plid='if(now()=sysdate(),sleep(15),0)'
/*!*/;

再找到nginx对应的日志,查询可能被攻击的接口
解决:针对数值型参数, intval转换一下,或者使用pdo占位符或者使用mysql_escape_string防sql注入攻击。

mysqlbinlog恢复指定数据表解决

连接mysql服务器,执行如下命令:

show master status;
flush logs; //刷新binlog 
show master status; //确认是否刷新成功

再用mysqlbinlog执行如下命令:

mysqlbinlog -d jingguan mysql-bin.005806 >recover_jingguan.sql
mysqlbinlog -d jingguan mysql-bin.005807 >>recover_jingguan.sql
mysqlbinlog -d jingguan mysql-bin.005808 >>recover_jingguan.sql
mysqlbinlog -d jingguan mysql-bin.005809 >>recover_jingguan.sql
mysqlbinlog -d jingguan mysql-bin.005810 >>recover_jingguan.sql
mysqlbinlog -d jingguan mysql-bin.005811 >>recover_jingguan.sql
mysqlbinlog -d jingguan mysql-bin.005812 >>recover_jingguan.sql

cat recover_jingguan.sql |grep  --ignore-case -E 'insert|update|delete' -A2 -B2|grep xxx >./recover_pl.sql

awk '{print $0";"}' recover_pl.sql > ./recover_pl2.sql

mysqlbinlog命令还可以带--start-date="" --stop-date="" 指定日志的开始和结束日期。
连接mysql执行如下命令:

source recover_pl2.sql; 

至此数据恢复完成。 养成定期备份mysql数据库的习惯。