上周三晚上,我正窝在沙发刷手机,突然收到一条短信:‘您的账户在异地登录,IP地址为118.24.130.x’。心里咯噔一下——这可不是什么好兆头。虽然最后发现是虚惊一场,但这件事让我想起去年参与过的一个真实渗透测试项目,客户是一家做在线教育的公司,他们的数据备份系统差点成了黑客的后门。
从一个备份接口开始的渗透
这家公司的主站做了不少安全加固,WAF开着,SQL注入、XSS基本没机会。但我们注意到他们每周会把用户数据打包上传到一个独立的备份服务器,接口地址藏得挺深:/api/v1/backup/sync。按理说这种接口应该只允许内网调用,可他们为了运维方便,加了个临时白名单机制——只要携带特定token就能从外网访问。
问题出在这个token生成逻辑上。我们抓了几次请求发现,token是基于时间戳拼接固定密钥生成的,算法简单得像十年前的PHP教程代码:
<?php
echo md5($timestamp . "backup_2023_secret");
?>
这意味着只要猜中时间窗口(误差不超过5分钟),就能算出有效token。我们写了个小脚本跑了一下,不到两分钟就拿到了访问权限,直接下载了最近三天的备份包。
备份包里的“宝藏”
打开压缩包一看,心都凉了半截。数据库导出文件里明文存着用户手机号、身份证号、支付记录,甚至还有部分人的真实姓名和学校信息。更离谱的是,备份脚本还顺手把配置文件 config.php 一起打包了,里面清楚写着生产库的连接密码。
很多人以为备份就是“藏起来”,其实错得很彻底。你把数据拷一份放到角落,却不给它上锁,那就像把家门钥匙藏在门口地毯下——小偷迟早能找到。
修复不是加把锁那么简单
我们提交报告后,对方第一反应是“加个IP限制”。但这治标不治本。真正的解决方式是分层处理:接口层面改用双向证书认证,备份数据本身要做字段级加密,敏感字段如身份证、手机号必须脱敏。另外,自动备份任务完成后,原始压缩包应立即删除或转移到隔离存储区。
后来他们换了套方案,用AWS S3做目标存储,开启版本控制和服务器端加密,再配合IAM角色最小权限策略。现在每次备份完还会触发一条钉钉通知,提醒管理员检查日志。
说到底,数据备份不该是安全链条中最弱的一环。它本该是最后一道防线,而不是留给攻击者的备用入口。