有个同学的网站数据库被攻击了,帮助他解决了问题,方案总结如下:
解决注入攻击
先从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数据库的习惯。