我曾经写过一篇对锐捷GSN入侵检测系统分析的文章,这种系统适用于企业或学校这样的组织机构,但今天我要介绍的不是这类系统,而是本人使用PHP脚本语言编写的,用于快速检测web服务器是否被挂马的迷你入侵检测系统,既然是使用PHP编写的,自然也就只适用于PHP类的网站了。
目前关于入侵PHP类网站的技术及相关的ODAY也很火,流量大一点的网站都成了hacker们的“眼中钉”,要不然瑞星公司也不会成立瑞星云安全网站联盟这样用于方便站长检测挂马的网站了。我将从实现原理、代码分析以及功能演示等三个方面来介绍这个在WEB服务器上的迷你入侵检测系统是如何实现的。
一、实现原理
我们部知道一个网站其实就是一台服务器上的一个文件夹,就以内容管理系统来说,比如PHP168、PHPCMS、DEDECMS等类型的PHP类整站系统,把它安装在一个磁盘的某个文件夹下,通过搭建一个LAMP或WAMP平台,也可以使用IIS或nginx等WEB服务器来搭建,然后通过修改或添加相应的模扳来构建不同类型的网站,当网站搭建完成后,上面的脚本程序就很少改动了,除非是升级WEB程序或是网站管理员手工修改,还有就是网站管理员在后台添加新闻文章、回复留言等,但这些改动都是对数据库的修改,并没有改动网站的脚本程序,这就给我们编写相应的检测程序提供了条件。
这个迷你入侵检测系统的原理是这样的:通过循环遍历网站文件夹下的所有文件及子文件夹下的所有文件,把它们的文件名、创建时间以及md5值写人一个记事本文件1中,并把它作为参考文件。当网站创建好了后,就可以创建备份文件了。接下来,我介绍一些很重要的关键点,同时也是本系统能探测成功的前提条件,如果网站被确认挂马了,那如何通过本系统来探测设挂马的具体脚本文件。我的PHP脚本有两个按钮,第一个表单按钮是用来完成刚才我提到的备份操作,第二个按钮除了能创建第一个按钮完成的功能外,它的主要功能就是用生成的第二个保存有改动和没有被改动的所有文件及其子文件夹下的文件的所有md5值去与第一个记事率里的文件的md 5值逐行比较,当文件的md5值发生改变后,便显示出改动的文件的文件名及其前后对应的md5值,以方便网站管理员找出被挂马的文件。
但这里有三种情况会干扰本程序的检测精度,或者直接就检测不出来:第一,就是文件的增加,因为我们都知道,要想成功控制一台服务器,hacker们通常会上传PHPSPY或者留一个记事本,里面写着某某到此一游和自己的联系方式等。这样,两次对比的文件数目就会发生变化,造成对比的文件顺序发生错位。解决的办法就是在两次生成的记事本文件中加入文件的创建时间对比,原因就是网站的源文件安装成功后它的创建时间都是相同的,而入侵者上传的脚本本马的创建时间和原网站安装文件的创建时间却是不一样的,还有一个原因就是目前大家广泛使用的PHPSPY2006或PHPSPY2008是不能修改文件的创建时间的,除非已经成功登录服务器的远程桌面再使用相关的工具修改。第二,就是文件的修改,经过本人的实验,文件的修改是不会改变对应文件的创建时间的。第三,就是文件的删除也会造成检测的失败,但是入侵者是很少删除网站对应文件夹下的源文件,除非是有特殊需要,所以也不会造成太多的干扰。
一、代码分析
为了节约篇幅,代码就不贴出来了。
代码中有详细的注释,熟悉PHP的朋友相信很容易就能看懂,我这里简单的提几点,第一就是应该把这个PHP脚本放在网站的根目录下,并分别建立两个空的记事本文件,分别命名为file_md5.txt和file_md5intrusion.txt,当然你也可以修改源代码换为别的文件名。第二就是源代码里有一个参照文件,是用采对照文件的创建时间的,它可以是网站中的任意文件,因为网站程序安装好后,文件的创建时间是一样的,当选好参照文件后修改相应参数就可以了。第三就是假如你网站中的程序非常多的话,可能运行本脚本程序的时候会造成CPU的急剧上升的现象,所以解决的办法就是在网站中的子文件夹中运行,逐个文件夹的检测,这样就不会导致由于CPU过高而出现浏览器崩溃的现象了。
三、功能演示
我以本机安装好的SHOPEX网上商城系统进行演示,先把PHP入侵检测脚本程序保存到网站根目录下,本机的目录就是F:\PHPWeb\shopex,在这个目录下分别建两个空的记事本文件,分别命名为file_md5.txt和file_md5_intrusion.txt,第一个是写入文件名、创建时间和对应MD5值的参照文件,第二个是网站设挂马后要写入网站中所有改动和非改动文件名、创建时间和对应MD5值的文件。建立好后,就可以运行脚本程序了。当点击了第一个按钮并运行成功后,我们就可以打开file_md5.txt来查看了。
当网站被挂马后就可以再次运行本程序,点击第二个按钮“check change or no”,这里我以根目录下的API.PHP文件作为创建时间的参考文件,井在它的源代码中加入几个无关的字符串。结果那个被修改的API.PHP文件被顺利的检测出来了。
最后我再说几句,界而里只显示了假想中的被挂马文件的文件名,并没有把文件的全路径显示出来,毕竟这只是一个入侵检测系统的锥形,还有很多需要完善的地方,比如数据库挂马就是检测不出来的。
本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。