李浩杰,裘国永
(陕西师范大学 计算机科学学院,陕西 西安 710119)
Web应用程序是互联网上传递信息最流行的方式。由于其分布性和开放性的特点,使得Web应用程序面临诸多潜在的安全攻击。例如SQL注入[1]、文件包含、目录遍历、参数篡改等,可能管理员配置了正确的防火墙和WAF,但是这些安全防御软件仍然存在策略性的绕过。因此,需要定期的对Web应用进行扫描,由于手动测试的复杂性和费时的特点,自动化的渗透测试工具的出现就可以帮助我们完成这项工作。主要有两种方法来测试Web应用程序的漏洞:白盒测试和黑盒测试。白盒测试:也就是对Web应用程序源代码的分析。这可以通过手动或者使用像FORTIFY这样的代码分析工具来完成。黑盒测试:在代码执行过程中查找漏洞。这种方法也被称为渗透测试,扫描器并不清楚Web应用程序的内部信息,它是通过在Web的HTTP请求中使用模糊测试技术。本论文就是通过对比3款自动化渗透测试工具扫描的结果,找到Web应用程序中常见的安全漏洞,并分析使用工具扫描漏洞的一些局限性。
在正式的试验之前,要先明确一些关注的重点:
1)扫描器检测到的漏洞的覆盖率。
2)检测结果中的误报[2]。
3)Web应用程序中常见的漏洞类型。
实验步骤包括:
1)准备阶段:挑选进行测试的Web应用程序和扫描器。
2)执行阶段:使用漏洞扫描器来扫描Web服务以识别出潜在的漏洞。
3)验证阶段:通过手动测试来确认由扫描器识别出来的漏洞。
4)分析阶段:对实验结果数据进行系统化分析。
Web应用程序可能由各种开发语言编写,不可能对所有涉及到的技术进行测试,为此,我们随机的挑选一些用PHP语言编写的,能够免费下载使用的,涵盖诸多应用领域(包括电子商务、论坛、博客等等)的20个Web应用程序进行测试。在挑选的过程中,因为以下的一些原因,需要将其丢弃[3],即:
无效的WSDL:至少有一个扫描器不符合WSDL的语法描述。
无法检索WSDL:至少有一个扫描器找不到WSDL。
没有发现方法:Web服务没有操作来扫描。
认证要求:某个操作需要认证,这意味着有些服务是不能完全检测到的。
未处理的异常:测试中断并且/或者有一个扫描器异常关闭。
通信错误:至少有一个扫描器因为HTTP请求或者SSL连接错误问题而不能进行完整请求。
扫描问题:至少有一个扫描器报告了一个像“无法添加事务”或“不能渲染对象”这样的通用错误。
在试验中我们使用了3款知名的商业Web漏洞扫描器:AWVS、HP WebInspect以及 IBM Rational AppScan。
AWVS,全称为 Acunetix Web Vulnerability Scanner。 它是一个自动化的Web应用程序测试工具,审计、检查漏洞。如SQL 注入、XSS[4](跨站脚本)、CSRF(跨站请求伪造)等等。
HP WebInspect:WebInspect是最准确和全面的自动化的Web应用程序和Web服务漏洞评估解决方案。惠普WebInspect可以提供快速扫描功能、广泛的安全评估范围以及准确的Web应用程序安全扫描结果。该工具具有开创性的评估技术、包括同时爬行和审计以及并发扫描。它是一个广泛的可用于基于Web的应用程序的渗透测试工具。
IBM Rational AppScan:它是Web应用程序渗透测试舞台上使用广泛的工具之一,有助于安全人员进行Web应用程序自动化漏洞测试评估。它可以自动进行漏洞评估、扫描和检测所有常见的Web应用程序漏洞,包括SQL注入、跨站脚本、缓冲区溢出和Flash/Flex应用程序。
在本地使用虚拟机搭建环境,对上述挑选的20个Web应用程序使用扫描器AWVS、WebInspect和AppScan进行扫描测试。
表1 存在漏洞的测试网站Tab.1 Vulnerabilities in tested websites
从表1可以看到:对每一款扫描器而言,表中体现的是检测到的漏洞的总数量以及每种扫描器检测到的漏洞情况。扫描器指出了五种不同类型的漏洞,即:SQL注入、代码执行、缓冲区溢出、用户名/密码泄露以及服务器路径暴漏。
图1 检测到的应用程序错误Fig.1 Application errors detected
扫描器将因为无效的参数而导致的应用程序错误归类为低的安全问题。实际上,这些错误是基于这样一个事实,就是输入的参数没有进行正确的检查(例如:该应用程序可能有鲁棒性问题)。正如图1所示,3款扫描器检测到了不同的应用程序错误。这明显是依赖于每个扫描器所执行的测试。尽管有一小部分情况下,应用程序错误可能会导致恶意的暴漏(例如:错误信息泄露敏感的服务代码或结构信息),在大多数情况下,它们并不是安全漏洞。因此,可以将它们排除在进一步分析之外。
正如在表1中看到的,不同的扫描器检测到了不同类型的漏洞。唯一的例外就是所有的扫描器都报告了SQL注入漏洞。这暗示了扫描器执行了不同形式的渗透测试并且不同扫描器得到的扫描结果可能很难进行比较。这样的结果给我们的启示就是:为了得到一个较好的漏洞覆盖率,在渗透测试的时候,需要使用多款扫描器而不是仅依赖于一种扫描器。
正如前面所述,SQL注入是唯一一个3款扫描器都检测到的漏洞。然而,不同扫描器报告了不同的Web服务中的不同漏洞。实际上,扫描器AWVS检测到的SQL注入漏洞的数目要远高于扫描器WebInspect和AppScan所检测到的SQL注入漏洞。
到目前为止,显示的结果还没有考虑误报(就是说扫描器检测到了漏洞但是实际中并不存在)的问题。众所周知,误报是不可避免。这样的话,决定手动来确认每一个检测到的漏洞是否存在。
确认漏洞的存在性而不能访问程序的源代码是一项困难的任务。因此,定义了一套规则和相应的检查来对扫描器检测到的漏洞分为3类:确实是误报、确认是漏洞以及不确定。
当满足下列条件之一的,检测到的漏洞就归类为误报:
1)对于SQL注入漏洞,如果得到的错误/应答与应用程序的鲁棒性问题相关并且不是一个SQL命令。
2)在Web服务中响应的错误并不是由扫描器的注入引起的。换句话说,当Web服务因有效的输入而执行的时候,相同的问题就会出现。
3)对于路径和用户名/密码泄露,当唤醒Web服务的时候,Web服务返回的信息与客户端提交的信息是一样的。也就是说,没有信息泄露。
检测到的漏洞如果满足下列条件之一就归类为确认的漏洞[5]:
1)对于SQL注入漏洞,如果是注入的值引发导致数据库服务的异常。
2)可能访问未授权的服务或Web页面(例如:用SQL注入绕过认证过程)。
3)对于路径泄露,可能观测到服务器中文件或文件夹的位置。
4)对于缓冲区溢出,如果服务器不回答请求或者引起特别是与缓冲区溢出有关的异常。
如果这些规则中没有一个满足的,那么就没有办法确认该漏洞是否真的存在。这些情况就归类为无法确定。图2显示了SQL注入漏洞的结果。
图2 SQL注入漏洞的误报Fig.2 False positives for SQL injection
正如图2所示,用AWVS扫描到的SQL注入漏洞中,相对来说,不确定的数据结果是比较低的。但是对于WebInspect和AppScan来讲,这个比例就相对来说是相当高的。这意味着对于AWVS这款扫描器而言,误报的结果是相对准确的。确定的误报对扫描器AWVS来说是比较高的,相对而言,对于AppScan也是比较高的。只有扫描器WebInspect显示0误报。
表2显示了其他漏洞的误报结果。
表2 其他漏洞的误报Tab.2 False positives of other vulnerabilities
我们关心的另一个很重要的方面就是检测到的漏洞的覆盖率。覆盖率是检测到的漏洞数量与总漏洞数量的比。很明显,在该试验中,我们不可能知道总共又多少漏洞,因为不同的扫描器得到的扫描结果是不一样的。因此,不可能计算出检测到的漏洞覆盖率。然而,对于目前已经得到的检测结果数据,我们可以得到一个近似的漏洞覆盖率。
实际上,我们知道检测到的漏洞 (相对于移除误报后3款扫描器检测到的漏洞的总和)的总数量以及每个扫描器检测到的漏洞的数量。基于这些信息来可以对每一款扫描器获取一个积极的覆盖率指标(实际的覆盖率要比表现出来的数字低)。很明显,这对SQL注入漏洞是中肯的,因为它是所有扫描器都检测到的唯一一种类型。
表3显示的是覆盖率结果。正如表3所示的那样,有12个SQL注入漏洞被检测到了(和前面一样,我们决定包含不确定的情况为存在的漏洞)。每个扫描器检测了这些漏洞中的一小群部分,结果就是检测覆盖率的一部分。扫描器AWVS表现了良好的结果。相反,扫描器WebInspect和AppScan的覆盖率就比较低了。
表3 SQL注入的覆盖率Tab.3 Coverage for SQL injection
下面对前面的一些分析做一下总结:第一个就是,对于同一个Web应用程序,不同的扫描器会检测到不同类型的漏洞。SQL注入漏洞是所有扫描器都检测到的唯一类型。只有扫描器AppScan检测到了缓冲区溢出、用户名和密码泄露以及服务器端路径暴漏等漏洞。WebInspect只检测到了SQL注入漏洞。SQL注入漏洞是在所有受测试的Web应用程序中发现的主要的漏洞类型。
而对于扫描器检测结果中出现的误报问题。实际上,扫描器中AWVS和AppScan的误报比例已经超过了30%。只有WebInspect表现出了0误报,但是该扫描器检测到的3个SQL注入漏洞中就有1个是不能确定的(不能手动确认是一个真正的漏洞还是误报)。
扫描器WebInspect和AppScan有一个很低的覆盖率,低于17%,然而扫描器AWVS表现出了高达67%的覆盖率。请注意,这个数是一个乐观的覆盖率,因为受测试的扫描器的实际覆盖率肯定要比观测到的数值低。
图3体现出了每种类型的漏洞的最终分布,在移除了确认的误报但是要包括那些不确定的情形(例如:扫描器的乐观估计)。正如前文所述,主要的漏洞是SQL注入。在发现的漏洞中占据了80%。这是一个重要的发现,因为发现在很多的案例中该高危漏洞都存在。
图3 每种漏洞的分布Fig.3 Vulnerabilities distributed per type
本文进行了一次试验探索,通过使用3款商业的漏洞扫描器对20个公开的Web应用程序进行安全漏洞检测,证实了许多Web应用程序在部署之前没有进行合适的安全测试。对于挑选Web漏洞扫描器以对Web应用程序进行安全检查并不是一件容易的事。首先,不同的扫描器会检测到不同类型的漏洞。其次,存在的误报也不容忽视,这严重影响到了检测漏洞的精确性。最后,在某些情况下,检测到的漏洞的覆盖率是很低的,说明仍然有没有检测到的漏洞。而SQL注入漏洞在受测试的Web服务中是普遍存在的,因为它们占据了所有检测到的漏洞的80%左右。在今后的工作中,基于这次的试验研究,借鉴不同扫描工具形成优势互补,促进Web应用程序的安全研究。
[1]秦广赞,郭帆,徐芳,等.一种防SQL注入的静态分析方法[J].计算机工程与科学,2013,35(2):68-73.
[2]Jayakanthan N,Sivakumar R.A Novel Frame Work to Detect Malicious Attacks in Web Applications[J].International Journal Research in Computer Application&Information Technology,2014,2(1):23-28.
[3]冯谷,高鹏.新型SQL注入技术研究与分析[J].计算机科学,2012,39(11):415-417.
[4]Navdeep Kaur,Parminder Kaur.Input Validation Vulnerabilities in Web Applications[J].Journal of Software Engineering,2014,8(3):116-126.
[5]符泉麟.基于OWASP的WEB应用安全检测与防范[J].微型电脑应用,2012,28(8):51-53.
[6]Williams J,Wichers D.2013.OWASP TOP10-2013:The ten most critical web application security risks[BE/OL].http://www.owasp.org.cn/owasp-project/download/OWASPTop10 2013V1.2.pdf.
[7]Hossain Shahriar*,Sarah M.North,YoonJi Lee,Roger Hu.Server-side code injection attack detection based on Kullback-Leibler distance[J].Internet Technology and Secured Transactions,2014,5(3):240-253.
[8]贾文超,汪永益,施凡,等.基于动态污点传播模型的DOM XSS检测漏洞[J].计算机应用研究,2014,31(7):2119-2126.
[9]邢斌,高岭,孙骞,等.一种自动化的渗透测试系统的设计与实现[J].计算机应用研究,2010,27(4):1384-1387.