一种基于渗透性测试的Web漏洞扫描系统设计与实现
扫描二维码
随时随地手机看文章
CNCERT/CC 2006年的工作报告中显示,随着互联网的快速发展,我国公共互联网用户数量已超过1.37亿。在网络发展的同时,互联网作为一个运行系统和一个社会公共环境,所面对的和隐藏的安全威胁也越来越复杂,越来越严重。报告显示,2006年CNCERT/CC接收国内26 476件非扫描类网络安全事件报告中有24 477件是由于Web引起的。从2003年~2006年中国Web攻击事件统计中不难发现,通过Web漏洞进行攻击事件正在逐年迅速的增长。通过Web漏洞进行攻击成了网络漏洞攻击的主要方式与手段。
国内外的许多学术机构、企业和标准化组织在Web漏洞探测方面做了大量的工作。Web漏洞探测系统日趋成熟,当前,比较成熟的漏洞扫描工具有Whisker及Nikto和Nessus。但由于安全产品特殊应用需求以及各个组织的工具自身的技术与安全防护问题,使得这些产品不能很好地被推广或普及。对具体项目需求,设计并实现一个Web漏洞扫描系统是非常必要的。
1 Web漏洞扫描原理
Web漏洞扫描方法主要有两类:信息获取和模拟攻击。信息获取就是通过与目标主机TCP/IP的Http服务端口发送连接请求,记录目标主机的应答。通过目标主机应答信息中状态码和返回数据与Http协议相关状态码和预定义返回信息做匹配,如果匹配条件则视为漏洞存在。模拟攻击就是通过使用模拟黑客攻击的方法,对目标主机Web系统进行攻击性的安全漏洞扫描,比如认证与授权攻击、支持文件攻击、包含文件攻击、SQL注入攻击和利用编码技术攻击等对目标系统可能存在的已知漏洞进行逐项进行检查,从而发现系统的漏洞。远程字典攻击也是漏洞扫描中模拟攻击的一种,其原理与其他攻击相差较大,若攻击成功,可以直接得到登陆目标主机系统的用户名和口令。
Web漏洞扫描原理就是利用上面的扫描方法,通过分析扫描返回信息,来判断在目标系统上与测试代码相关的漏洞是否存在或者相关文件是否可以在某种程度上得以改进,然后把结果反馈给用户端(即浏览端),并给出相关的改进意见。
2 Web漏洞扫描系统设计与实现
Web漏洞扫描系统设计的基本要求是能够找到Web应用程序的错误以及检测Web服务器以及CGI的安全性,其中也包括认证机制、逻辑错误、无意泄露Web内容以及其环境信息以及传统的二进制应用漏洞(例:缓冲区溢出等)。同时要求漏洞扫描功能能够更新及时。本系统结合国内外其他Web漏洞扫描系统设计思想的优点,采用Browser/Server/Database(浏览器/服务器/数据库)和模块化的软件开发思路,通过渗透性检测的方法对目标系统进行扫描。
2.1 系统总体结构设计
本文设计开发的是一个B/S模式的Web漏洞扫描系统。它包括客户端及服务端两个部分,运行环境为Linux系统。首先:使用B/S结构使得用户的操作不再与系统平台相关,同时使得客户操作更方便、直观。其次,系统把漏洞扫描检测部分从整个系统中分离出来,使用专门的文件库进行存放(称为插件)。如果发现新的漏洞并找到了新的检测方法,只要在相关文件夹中增加一个相应的新的攻击脚本记录,即可以实现对漏洞的渗透性测试,同时也实现了及时的升级功能。最后,系统从多个角度来提高漏洞扫描系统的扫描速度以及减少在用客户端与服务端之间的信息传输量,以提高系统的运行效率。其总体结构设计如图1所示。
图1中给出了漏洞扫描系统模型的系统结构图。该漏洞检测系统主要分成四部分:
(1)主控程序。采用多线程处理方式,它接收多个客户端提交的用户指令后,再次利用多线程技术调用相关的插件脚本,利用渗透性测试对目标系统进行检测,并将结果和进程信息传回客户端显示并保存在客户端本地,以方便用户查看详细信息。
(2)客户端,即控制平台。B/S结构比传统的C/S结构优越的地方在于方便性和与平台无关性,用户通过Web浏览器设定扫描参数,提交给服务器端,控制服务器端进行扫描工作。同时,对服务器返回的各种检测结果进行相应的显示、汇总和保存。
(3)插件系统。它保存现在已知各种漏洞检测方法的插件,合理安排插件之间的执行顺序,使扫描按既定的顺序进行,以加快扫描速度提高扫描的效率与准确性。
(4)数据库,即探测数据库,是系统的核心。它保存已知各类Web漏洞的渗透性的探测数据即攻击代码或信息获取代码,比如SQL注入攻击、跨站点脚本攻击、会话攻击或输入验证编码信息等,逐条给目标发送探测数据,通过把返回信息与预先设定的“返回信息”和状态码进行匹配,进而获得目标返回系统的健壮信息。
在规划系统体系组成部分的基础上,如何把这些组成模块有机地集成为一个系统也是设计本系统的重点。我们要求服务器端同时处理多用户的连接,因此首先要进行多线程处理。在进行单用户处理中,当用户登陆时,检测服务器对用户的用户名和密码进行认证,判断用户是否具有使用权限。用户认证通过后,检测服务器给客户端发送可使用的基本检测信息。客户端接收到服务器的这些信息后,根据具体的使用要求选择和填写各种检测脚本要求的参数,或使用默认参数,然后返回给服务器端。服务器端建立新的进程,开始一个新的漏洞检测任务,对目标系统进行扫描。
2.2客户端的实现
网络的发展要求在任何地点进行登陆并进行扫描工作,并且漏洞检测参数繁多、设置扫描参数具有很高的复杂性,所以选择现在流行的Web页面作为客户端。这样就可以在世界的任何地点,任何环境使用客户端,用简单的图形化界面进行参数设定和系统的控制工作。
客户端在认证通过后,开始接收服务器发送过来的各种待设定的参数及相关信息以供用户选择。用户根据相关帮助信息及自己相关的要求设定参数,同时设定目标系统的IP地址(或主机名)和端口号等参数。根据客户端的参数设定,服务端建立扫描任务,对目标系统进行检测扫描。
检测过程中,客户可以自行设定是否实时显示服务端扫描状态信息及结果信息,以及在客户端是否保存相关信息,便于用户对扫描任务进行实时的控制,从而制定相应的安全策略。
[!--empirenews.page--]2.3通信协议设计
自从1990年以来,人们就用Http协议进行Web数据传输,Http协议是一种在TCP/IP之上的request/response型协议。多数Http数据传输由请求服务器上的某种资源开始,通过网络上的一些中介,如代理、网关等到达服务器,而后服务器处理请求并送回应答。但是Http 1.0并不完全支持各层代理、缓冲、持续的连接以及虚拟主机等技术。Http请求及应答数据包如图2所示。
对于目标系统Web漏洞扫描,使用渗透性的探测方法,渗透性探测方法主要通过更改Http请求信息包中的某些信息,从目标系统的应答信息包中获取状态信息及相关内容以判断目标系统的输入或软件错误,或其他一些配置信息,所以要求开发者可以自定义Http请求信息包。
Libwhisker是一个全面的API,是由一些不同的与Web应用程序相交互的功能模块构成的数据库,它有如下的特点:
(1)可以与Http 0.9,1.0以及1.1相通信;
(2)可以建立持续的连接;
(3)能有效地支持代理;
(4)支持Anti-IDS技术;
(5)支持SSL;
(6)支持Basic和NTLM认证。
所以使用Libwhisker与Http通信,以通过Libwhisker来自定义Http协议信息包以及提供相应的支持。
2.4特征信息数据库
此漏洞扫描系统的核心就是特征信息数据库,特征信息数据库保存了远程Web系统可能存在的各类Web隐患和漏洞的获取或攻击信息或代码。通过给远程Web系统发送此数据库中的数据以获得目标Web系统的安全性。
考虑到信息的共性与个性、方便性等因素,特征数据库信息大体分为以下几类:
(1)Web系统软件版本信息数据库:此类信息以检测当前Web系统相应软件的版本隐患及其漏洞信息,以及Web系统相应软件版本最新信息,并给出相关的提示。
(2)Web系统授权信息:此类信息以检测当前Web相应系统资源的授权情况以及漏洞信息。
(3)漏洞控测信息数据库:此类数据库是最主要的信息数据库,包含各类Web服务器中存在的各种隐患和漏洞探测信息。具体而言分为以下几个大类:认证攻击、授权攻击、识别“支持”文件、识别包含文件、目录攻击、识别错误、一般的输入验证、源代码泄露、URL编码、Unicode编码、Base64编码、识别请求方法、SQL注入、会话攻击、目录遍历攻击以及跨站点脚本攻击等。
特征信息数据库各记录分别为:
Web服务器类别、检测目标URI、预设返回信息、Http方法、描述信息。
2.5 Web漏洞扫描系统的实现
由于允许多用户同时使用服务器端,要求针对不同目标的扫描、检测任务同时进行,所以执行扫描机制就成了服务器端设计中的首要问题。根据服务器并行处理的理论,而且使用B/S的总体结构,考虑到开发语言和开发环境,对于扫描服务器的构架选择Linux平台下的PERL开发语言,使用并发服务器的模型。
并发服务器的思想是每一个客户的请求并不由服务器直接处理,而是由服务器创建相应的子进程进行处理。对于每一个子进程而言,客户可以设定其扫描范围包括不只一个目标地址,同样由服务器创建相应的子进程(即二级进程)来处理,以提高系统的扫描速度。利用Linux下的fork函数来完成一、二级进程处理功能。其流程如图3所示。
另外,由于PERL本身的效率问题,为进一步提高漏洞扫描系统的性能,对目标系统首先利用现阶段已经非常成熟的工具NMAP进行端口扫描,以获得开放的端口,在此基础上进行进一步的端口扫描,以判断在此端口上是否提供的是Web服务。
为进一步加快扫描速度,系统使用扫描知识库来保存已扫描过的主机信息,在获取用户请求以后,首先检测知识库,若有知识库中保存相关信息,则不进行新的扫描工作,只需调用相关的知识库信息返回给用户即可。
在对端口渗透性探测的实现方式上,使用插件脚本的方式来进行。用户可以通过参数选取相应的插件执行,以进行更为完整的漏洞扫描。插件可以动态地升级,其实现方式是每次升级插件时都将已升级的插件根据既定的顺序添加在插件调用清单当中,在插件执行过程中,主控程序根据插件调用清单中的插件执行顺序依次调用插件。插件的执行结果扩充了各类数据库探测信息,这样即可以增加各类特殊的信息,进行更为深入的扫描目标Web系统以发现更新、更多的漏洞信息。
3结语
提出对Web系统进行安全扫描的必要性,以及Web漏洞扫描的基本原理,在此基础上提出并设计了一个完整的Web漏洞扫描系统,介绍了它的协议基础以及组成模块。
本文设计的Web漏洞扫描系统已经完全实现,并经过测试,该扫描器基于浏览器/服务器结构,可以扫描UNIX/Windows等多种平台下的Web系统,与同类产品相比,可以看出该扫描器具有如下特点:利用多进程/知识库等技术加快了扫描速度;扫描封装在插件中使系统具有可扩展性;使用B/S结构使得用户操作方便,扫描结果详尽。此扫描系统实现了Web隐患扫描和漏洞检测,并可以提供漏洞的修补建议,将会在很大程度上确保Web系统安全。