目 录
论文总页数:20页
1 引言 1
2 Web服务器所受的威胁及防御 1
2.1 缓冲区溢出 1
2.2 SQL注入攻击 1
2.3 基于脚本的DDos攻击 2
2.4 其他的不安全因素 3
3 Web的入侵防御系统的设计 4
3.1 体系结构 4
3.2 处理流程 5
3.3 对客户端访问的响应 7
3.4 策略引擎的设计 8
3.4.1 策略的属性 8
3.4.2 策略的加载 9
3.4.3 策略的调度 10
3.4.4 策略的接口 10
4 Web的入侵防御系统的实现 11
4.1 基于ISAPI 的解析及响应模块的实现 11
4.1.1 使用ISAPI Filter获取Http报文信息 11
4.1.2 使用ISAPI进行Http响应 13
4.1.3 在服务器上的安装配置ISAPI Filter 14
4.2 基于Lua的策略实现 15
4.2.1 对策略的封装 15
4.2.2 Lua策略脚本示例 15
4.3 基于xml的策略管理 16
5 系统运行过程及测试 16
结 论 18
参考文献 18
致 谢 19
声 明 20
(1) 缺少经验的系统管理员往往没有正确的设置服务器文件系统的权限
当一个入侵者获得到Web服务器上的较低的权限时,他通常会想方设法的提升自己的权限,而服务器文件系统的权限系统没有正确设置时,可以通过较低的权限下获取到服务器上的敏感信息,为提升权限提供了条件。
(2) 盗链
盗链虽然不是一种攻击手段,但因其消耗了大量的服务器资源和带宽,所以也是对当前Web服务器的稳定影响比较大的因素。盗链的定义是:此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。另外一种盗链是像讯雷这样的P2SP的下载软件,可以让客户端以类似BT的方式同时从多台服务器上下载文件。
对盗链的防御往往是通过设定一些访问策略来实现,如检查客户端http报头的refer字段等。
(3) 脚本自身的Bug
Web服务器上所运行的动态脚本(ASP、ASP.NET、JSP和PHP等等)自身所带的Bug也会给Web服务器的安全带来极大的威胁。例如前面所提的SQL注入也是属于Web脚本的Bug。恶意的攻击者可能可以利用这些脚本中的Bug轻易的获得Web服务器的权限。很多Web服务器上采用的是开源的网站系统,而有的管理员因为设置上的疏忽(例如编辑源码后产生的bak文件,数据库的路径没有保护等等),给攻击者入侵打开了方便之门。
(3) 数据管理
这一层提供日志记录、配置管理及策略脚本解析的功能。所以对数据进行处理的过程都是在这一层里完成。
每一层都完成相对独立的功能,当某一层的实现发生变化时,只要提供的接口没有变化,对其他几层就没有影响。这样整个结构就有很大的扩展性,例如:我们可以把解析和响应层的具体实现是由调用Web服务器自身接口的方式替换为直接截获传输层网络层封包的方式等等。下面将介绍具体的处理流程。
3.2 处理流程
Web IPS的处理流程如图2所示,具体流程如下:当客户端发送Http请求时,原始的数据报文经Http报文解析模块解析,报文解析模块会通知策略引擎模块对客户端的信息进行检测,策略引擎会依据策略脚本中编写的策略,通知Http响应模块对客户端的行为做出响应,并依据策略脚本中的策略,通知日志记录模块记录相应的日志。
依据Web IPS系统的体系结构及处理流程,系统主要模块和作用如下:
(1) IPS管理模块
负责管理和连接各个模块,管理数据流,读取配置文件后完成整个系统的初始化,对整个系统的状态进行管理:运行,停止,重新加载。当Http报文解析模块通知有客户端的访问时,调用策略引擎对客户端的行为及信息进行检测,对策略引擎返回的结果通知Http响应模块进行响应。
(5) 策略引擎模块
首先策略引擎对策略脚本进行解析,根据策略的属性和优先级组装策略链。当IPS管理模块通知策略引擎对某一个客户端的信息进行检测时,策略引擎利用Http报文解析模块提供的接口获取所需的客户端得信息,分析客户端得行为,通过依次调度策略来控制客户端的访问。在策略中,可以检测客户端请求的各个字段,并对客户端的行为进行分析或记录,通过定义好的规则对客户端不同的行为进行响应。当一个策略中没有对客户端的行为做出响应时,策略引擎调用策略链中的下一条,直到全部调用完。如果有策略返回响应,则通知Http响应模块完成客户端的响应,并停止调动策略链后面的策略。如果没有任何策略对客户端的行为做出响应,策略引擎则返回接受请求的响应。策略引擎需要封装Http报文的解析和响应模块,及日志记录模块,供策略中调用。
(6) 日志模块
日志模块的作用是对系统运行时产生的日志或对入侵防御行为的进行记录。使用统一的格式将日志信息记录在文本文件中。由于系统采用分层的体系结构,所以这一模块可以方便的替换成其他格式的日志记录方式。
3.3 对客户端访问的响应
策略引擎加载策略的步骤如下:
(1) IPS通过配置模块读取出策略属性列表,去掉此列表中策略名称重复的项,然后将此列表作为策略引擎初始化的参数或者作为策略引擎重新加载的参数。
(2) 策略引擎将由此列表中策略类型属性和优先级属性,由系统策略到用户策略,从高优先级策略到低优先级的策略的次序,进行排序。形成一个新的策略列表。
(3) 按后面的步骤依次加载这个策略列表中的属性。
(4) 如果策略的开启状态属性不为Enable,则跳过该策略,继续加载策略列表中后面的策略。
(5) 如果加载器的属性为C++则交由C++的策略加载器处理,如果是为脚本的就由相应的脚本加载器处理。如果不能识别则跳过该策略。
C++的加载器为一个策略对象的工厂类,会根据策略的名称生成不同的策略对象,如果找不到为该名称的策略则返回NULL表示加载失败。
脚本加载器会根据属性中的路径字段去读取策略脚本,加载器要完成策略脚本语法检测的步骤,加载成功时也是返回一个策略对象,加载失败返回NULL。
如上所述,加载器会将策略对象的初始化(C++对象是通过调用构造函数来实现)。所以在策略的调度前不需要再对策略做初始化。
(6) 加载成功后就将该策略的状态属性置为Loaded,如果是加载失败就保持该选项为Unload。
(7) 直到策略列表中的所有项都处理结束后,重新遍历这个列表,把Loaded的项依次提取出来,形成策略调度用的策略列表。
我们在OnPreprocHeaders即可以获得通过GetServerVariable函数就可以获得客户端发送的请求的Http报文头部信息及服务器的变量。在这里我们将封装成一个IClient的对象。策略引擎会对不同的策略引擎把IClient重新封装。
4.1.2 使用ISAPI进行Http响应
(1) 拒绝访问
当在ISAPI Filter中直接返回SF_STATUS_REQ_FINISHED时,IIS服务器就会断开和客户端的连接。
(2) 发送信息
发送信息的响应中有两个参数,一个是http报文响应的状态,例如:http状态200表示正常;http状态403表示拒绝访问;http状态500表示服务器错误等等。另一个参数是所发送信息的内容。通过ISAPI Filter中提供的ServerSupportFunction API可以设置响应的HTTP报文的状态,通过WriteClient可以直接向客户端写数据。以下为发送信息响应方式的部分实现代码