用脚本类IDS抵御针对WEB的攻击
来源:asp之家 发布时间:2009-06-28 09:44:00
IDS是英文“Intrusion Detection Systems”的缩写,中文意思是“入侵检测系统”。传统的IDS是一个监听设备,这个设备通过网络链路挂接在服务器和客户端所有流量都必须流经的链路上,IDS就是通过特有IDS规则匹配黑客恶意攻击入侵行为的流量,进行即时的监测和报警。
在历年来开源的Web程序中,被披露最多最严重的安全漏洞一直是SQL注射,为了减少SQL注射漏洞对各大网站造成的安全威胁,Web安全研究组织80SEC在2008年编写了国内第一个脚本类IDS - MysqlIds,使用MysqlIds可以更好的、更有效率的帮助网站管理员和程序员抵御和检测SQL注射漏洞。
现在流行的技术大部分是旁路监听,一般不会因为IDS的性能影响网站正常的访问流量,而Mysqlids也是按照类似的思路同样不会影响程序的性能。Mysqlids存在于应用程序和数据库操作之间的一个环节,完全以数据库的语法来分析执行的SQL语句,而不是采用传统的关键字检测的方法,对于一些非正常的SQL语句能进行阻止并且记录相关的信息,这样就可以很快地定位程序中存在注射漏洞的地方,为漏洞的及时修复提供必要的信息。
MysqlIds原理
MysqlIds是由PHP编写的,通过一个封装的安全函数,监测程序中运行的SQL查询语句,针对黑客经常使用的union查询、select子查询、不常用的SQL注释符、文件操作和benchmark等危险函数行为进行报警,这个IDS是无缝封装在程序里的数据库操作流程里的,也就是黑客通过程序漏洞进行恶意的SQL注射都能被非常详细的监测到,程序员或者网站站长甚至能使用IDS发现自己网站程序中未被察觉的0DAY漏洞。下面我就分析MysqlIds的部分代码,使大家可以从原理上更容易的理解MysqlIds,我们看看MysqlIds如何监测黑客SQL注入经常使用的恶意的联合查询。部分代码如下:
if (strpos($clean, 'union') !== false && preg_match('~(^ [^a-z])union($ [^[a-z])~s', $clean) != 0){
$fail = true;
$error="union detect";
}
MysqlIds使用了PHP中strpos函数来判断程序执行的SQL语句是否存在恶意的SQL注射,这个函数可以高效率的查找指定字符串返回一个布尔值,当程序执行SQL语句中使用联合查询,规则条件就开始生效,启用preg_match函数调用IDS规则来匹配恶意的联合查询语句,这个IDS规则是精心构造的正则表达式,类似于大家使用的传统IDS规则,由于MysqlIds是在程序的数据库操作层来检测,所有能抓取到有效且实实在在的安全问题,且更有效更具有针对性。MysqlIds还针对程序运行的SQL语句出现的异常情况进行了监控,如SQL语句中出现异常的注释符,一般黑客进行SQL注射攻击,很多情况下需要注释符完成SQL注射攻击的SQL语句,同时黑客还有可能使用一些比较危险的MYSQL函数和功能,如sleep、benchmark、load_file和into outfile功能等,这些黑客在程序中使用SQL注射的恶意动作都能被MysqlIds监测到。
MysqlIds与传统Web安全防御措施的区别
传统的Web安全防御措施都非常滞后,在Web程序里未知的漏洞被攻击的情况下,管理员往往要排查很多东西才能找到问题的关键点,有的时候可能是使用的程序中存在一个未知的SQL注射漏洞被黑客利用,却无法确定黑客是如何攻击,而导致整个网站一而再,再而三的沦陷。合理地部署Mysqlids后,就可以帮助管理员第一时间准确的定位网站的Web程序漏洞,关键在于MysqlIds核心的日志功能,它能准确的将每次精确匹配报警后的信息存入日志,代码如下:
if (!empty($fail))
{
fputs(fopen($log_file,'a+')," $db_string $error\r\n");
die("Hacking Detect[url]http://www.80sec.com[/url]");
}
else {
return $db_string;
}
}
当程序的SQL语句被监测到恶意行为后,会打开相应条件语句里的fail开关,也就是触发监测后根据信息会留下一条精确的日志信息。管理员排查日志就能精确定位程序中的SQL注射漏洞。
如何部署MysqlIds
MysqlIds暂时只支持PHP+MYSQL架构的Web程序,作为开源程序和其原理的灵活性,大家可以很方便将MysqlIds和自己程序无缝结合。比如国内站长采用比较广泛的一款PHP建站程序DeDecms,在DeDecms历史版本中被披露过很多安全问题,其中SQL注射是其安全问题中危害最大也最多的问题。为了解决SQL注射问题,DedeCms在其发布的最新版中的数据库类中封装了80sec的Mysqlids,以用来抵御和检测Sql注射漏洞。我们可以参考DeDecms的MYSQL数据库类,将MysqlIds部署在程序中:
\include\dedesql.class.php
DeDecms的MYSQL数据库类161行的ExecuteNoneQuery函数封装了MysqlIds,程序运行的SQL语句在进入MYSQL查询之前都会使用MysqlIds的CheckSql函数处理。
if($this->safeCheck) CheckSql($this->queryString,'update');
return mysql_query($this->queryString,$this->linkID);
脚本类IDS展望
近年来大家对安全越来越重视,Web程序的开发也越来越多的考虑程序的安全性,脚本类IDS作为一种花销很小当最有效的安全措施值得大力推广,也许以后的WEB程序在开发之初就会将这类脚本IDS的概念设计在自己的程序中,那么大家只需要打开程序中的一个设置开关就能被实时保护,并能最准确的定位安全问题。目前MysqlIds在80SEC的官方网站上仍然是1.0版,希望他们以后能提供功能更强大脚本IDS,同时感谢80SEC给我们带来的全新WEB安全概念。


猜你喜欢
- Linux命令搜索命令whereis与which的区别一 whereis1、语法whereis 命令名搜索命令所在的路径以及帮助文档所在的位
- 近期国内部分站点遭到了较大规模的拒绝服务(D.O.S)攻击(包括类似前期yahoo等大型国际网站所遭受的的DDoS攻击——分布式拒绝服务攻击
- nginx配置x-forwarded-for头部本地用tomcat起了一个j2ee的应用,然后又起了一个nginx做反向代理。nginx.c
- 使用下面的步骤来设置ftp进行日志记录:1.# cp /etc/inetd.conf /etc/inetd.conf.bak2.# vi /
- 有时候搭建集群机器是,需要在多台机器中间相互拷贝文件,一种方式是同事sftp拷贝到本机,再分别拷贝到其他服务器上。这里介绍一种直接在两台服务
- ASP防注入之解决方案特殊页面处理因为有些页通过流式传递(比如含有文件上传的表单)如果单一使用穷举Form对象的操作就会出错所以要把这些页面
- 帝国cms是我们用得比较多得PHP的建站系统,在建站过程中,如果自己没有信息源,只能靠手工不断的重复copy和粘贴,这样费时费力,于是我们就
- 对于破解站网站,相信很多人都很熟悉,它是一个破解软件下载站。但谁也不曾料到,就这么一个小站在短短的四个月时间里居然能在这个无限宽广的互联网领
- 刚刚接触虚拟机,或者刚在虚拟机中安装linux的朋友们,因为是在虚拟机中安装的系统,所以需要自己配置IP地址。下面分几步来配置这个IP地址:
- 大家好,我是杜晓帅~,做为一个后端开发,因为要学的技术比较多,而各种技术又必须要安装各种包或者配置环境,所以为了保护自己电脑的系统,不让他轻
- 一、grub.cfg文件介绍1.grub.cfg文件位置/boot/grub2/grub.cfg[root@node1 grub2]# ls
- 由于周边环境的原因,我接触网络不是很久,可以这样说,高中以前连电脑是什么样子也没见过,只听同学讲过,以及课外书上描述的。电脑于我来说似乎是可
- 我的虚拟机总是各种连不上网,每次都要折腾一番。现在我把虚拟机连不上网的原因总体排查一下,按照流程一步步来,基本上可以解决大部分人的问题。首先
- 系统服务篇一1. 服务名称:Al
- 【故障原因】局域网内有人使用ARP欺骗的木马程序(比如:传奇 * 的软件,某些传奇 * 中也被恶意加载了此程序)。【故障原理】要了解故障原理,我
- 雨林木风推出自主研发操作系统12月25日早间消息,在雨林木风工作室解散一周年之时,雨林木风团队官方宣布于昨日正式推出“雨林木风开源操作系统(
- 这几天发现很多中国的网站设计者和推广者有一个很大的误区,就是惜链接如金,很怕从自己的网站链接到其他网站。应该说这种担心是不必要的。在很多情况
- 最近在百度和google上搜索了“官方下载”这个关键词,发现两处都是迅雷排在第一,然后都是腾讯QQ,
- glibc是gnu发布的libc库,即c运行库,glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glib
- Hadoop streamingHadoop为MapReduce提供了不同的API,可以方便我们使用不同的编程语言来使用MapReduce框