ChinMOdillinux root 密码修改改

当前位置: >>
基于Web的应用软件安全漏洞测试方法研究
华中科技大学 博士学位论文 基于Web的应用软件安全漏洞测试方法研究 姓名:杜经农 申请学位级别:博士 专业:计算机软件与理论 指导教师:卢炎生
华 中 科 技 大 学 博 士 学 位 论 文 摘 要随着互联网和电子商务、电子政务的广泛使用,针对 web 应用软件的攻击快速 增长,导致研究者们越来越关注 web 应用软件安全性的研究。与普通的应用程序相 比,Web 应用软件的运行特点决定了它在安全性上更为脆弱,主要是由于两个方面 的原因所导致。一是由于 web 应用软件客户端运行环境不可信任,Web 应用软件的 客户端运行在浏览者的机器上,其运行环境数据容易被伪造或修改,同时黑客们很 容易精心构造恶意数据进行攻击。二是由于其运行状态是开放的。http 协议是无状 态的,Web 应用软件的开发人员需要自己记录程序运行的状态信息,并在客户端和 服务器端进行保存和传输。这些信息对终端用户公开,容易被恶意更改和伪造。此 外其客户端脚本的原代码对用户是可见的,容易被修改。其页面执行顺序也很容易 被打乱和跳过,如果程序处理不当,将导致安全问题的发生。 当前, web 应用系统的安全性研究主要集中于对 web 应用软件的运行环境例 对 如服务器操作系统、数据库系统、web 服务器软件的安全评估和分析,以及 web 系 统的入侵容忍技术等等, 这些研究都是立足于 web 应用系统整体运行的层面上进行 安全性研究,缺少对 web 应用软件自身安全性的深入分析。而当前开展的一些有关 web 应用软件自身的安全性的研究, 主要关注的是对部分特定的 web 应用软件漏洞 进行分析和防范,尚未见到对 web 应用软件安全性测试理论和技术的全面、系统性 研究。因此,研究 web 应用软件安全性测试的理论与技术具有重要的理论和实践意 义。 对 web 应用软件的各类安全漏洞进行研究并分类是做好安全性测试的基础, 它 可以帮助研究者了解 web 应用软件安全问题的特点,指导有效生成安全性测试用 例,提出科学实用的安全性测试方法。通过研究环境错误与状态错误引发 web 应用 软件安全漏洞的模式,提出了一种用于进行 web 应用软件安全漏洞分类的方法,给 出了漏洞分类的层次结构,对层次结构中的各类漏洞进行了定义和分析,并提出了 基于分类树的安全漏洞编码方法。使用该分类方法对来自 OWASP 的 web 应用软件I 华 中 科 技 大 学 博 士 学 位 论 文安全漏洞进行了分类,并与使用 EAI 模型分类的结果做了对比。评估结果表明,该 模型具备良好的漏洞分类能力, 适用于指导 web 应用软件的安全测试和安全防御工 作。 环境错误注入是一种有效的软件安全性测试方法,该方法人为制造错误并注入 到程序的运行环境中,观察程序的反馈并判断是否存在安全问题。但是,使用传统 的错误注入方法进行 web 应用软件安全漏洞检测时,存在较大不足。因为它仅考虑 环境错误对软件安全性的影响,没有考虑到另一重要方面,即内部运行状态错误对 web 应用软件安全性的影响。在综合考虑环境错误与状态错误对安全性影响的基础 上,提出了一种适用于 web 安全性测试的环境与状态错误模型(EAS 模型) 。基于 该模型提出了错误注入点判定规则库和错误构造算子,并提出了应用该模型进行安 全性测试的具体方法和步骤。使用该模型对 web 应用软件 PEGames 进行了测试, 有效地测试出了该软件在 CVE 漏洞库中已收录的所有漏洞,并发现了新的漏洞。 实验表明 EAS 模型具有良好的漏洞揭示能力,能有效指导 web 应用软件安全性测 试。 在进行安全性测试时,需要选择合适的测试用例集,以便在时间和费用有限的 情况下,尽可能充分地测试软件安全漏洞。为了量化评价测试用例集的充分性,提 出了一种基于层次分析法的软件安全性测试充分性评价方法。建立了测试用例集的 层次分析结构和两两比较矩阵,求出了各类测试用例的重要性权值,定义了测试效 果评价函数。使用该评价方法对 BBS 软件 IPB 的实际测试效果进行了评价计算。 实验表明,评价函数计算出的测试充分性评价值与实际测试中发现的漏洞个数是正 相关的,说明该评价方法能正确反映测试用例集的测试效果,所提出的评价方法是 实用和有效的。关键词:web 应用软件,漏洞分类,错误注入,错误模型,安全性测试,层次分析 法,测试充分性II 华 中 科 技 大 学 博 士 学 位 论 文AbstractWith the widespread use of the internet、e-commerce and e-government system, the number of attacks against web applications are growing fast, which has resulted in increasingly concerns on web application security among reaserchers. Compared with common applications, web applications are more insecure because of two facts: their trustless runtime environment and open runtime state. A web application is composed of sever part and client part. The client part runs on the explorer’s computer. Its environment is easy to be perturbed and forged by a malicious attacker. Besides the environmental perturbation, the web application’s internal state is also prone to be attacked. First, the sever part of the web application must transfer its internal state information to the client part because the http protocol is stateless. Thus a malicious user can view the internal state information and modify it. Second, the source code of the client part is open to the explorer and easy to be forged. Last, the execution of a web application is composed of many requests of web pages. A malicious attacker can change the sequence of these requests or ignore some execution steps by jump to the later part of the execution sequence. Thus cause security violations. Currently, the reaserch on web system security focus on the vulnerability of operation systems, database and web server softwares, or the technology of Intrusion Tolerance rather than the security of the web application itself. Lots of reaserches on the security of web application only focus on some special vulnerability. To the best of our knowledge, there is not a Comprehensive study on the web application security testing. The study and classification of security vulnerabilities is the important basis for reaserching the technology of web applications security testing. It can help to build an effective test model and design good test cases. This paper proposes a taxonomy model using analytic hierarchy process for classifying security flaws of web application, andIII 华 中 科 技 大 学 博 士 学 位 论 文defines all kinds of vulnerabilities classfied by the taxonomy model. Then apply the taxonomy model to classifying 87 security flaws from the OWASP security flaw database, and compare the classification results with that of using EAI model to classify. The result of the experiment reveals that the taxonomy model is effective. Fault injection is an effective method for security test of software. It injects Faults into the application’s environment to see how the application responds and whether there is a security violation. Environment fault injection method is easy to define common procedure to make appropriate test cases. It is suitable to security testing of web applications. However, when used to test the web application, environment fault injection method has a weakness. It only considers the perturbation from the web application’s environment, but ignores internal status disturbances which also play an important role in the security attribute of web applications. To overcome this weakness, this paper proposes a test model named EAS fault model, provides an vulnerability determine rule base, and designs Error constructor operators. Then we test a web application named PEGames using EAS model. The experiment revealed that the fault coverage of EAS model is high. When testing a web application for security purpose, testers have to select a test case set with appropriate scale because of the limit of time and money. In order to quantify the evaluation of the adequacy of the selected test set, this paper propose a test effect evaluation model based on the Analytic Hierarchy Process, and define a test effect evaluation function. An experiment was made by using the evaluation model to evaluate the vulnerability test effect of a BBS application name IPB. The experiment result revealed that the evaluation value calculated by the evaluation function is positively correlated with the number of vulnerabilities found in the real test. It proves that the evaluation method proposed by this paper is practical and reliable.Key words: web application, vulnerability classification, fault injection, fault model, security test, Analytic Hierarchy Process, Test AdequacyIV 独创性声明本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的 研究成果。尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他个人 或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已 在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。学位论文作者签名: 日期: 年 月 日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权 保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借 阅。本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进 行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密□ ,在_____年解密后适用本授权书。 本论文属于 不保密□。 (请在以上方框内打“√” )学位论文作者签名:日期: 年 月 日指导教师签名:日期: 年 月 日 华 中 科 技 大 学 博 士 学 位 论 文 1 绪1.1论web 应用软件安全漏洞测试的意义随着互联网和电子商务的广泛应用, 基于 web 的应用软件 (以下简称 web 应用软件)得到了越来越广泛的使用。除了传统的应用如新闻网站、电子邮件等等外, 目前越来越多的关键性任务也使用 web 应用软件来完成, 例如网上银行、 网上证券、 网上购物等涉及到金钱交易的应用,以及政府部门使用互联网来开展电子政务等 等。这些关键性的应用对软件安全的要求越来越高,如果由于软件不安全造成信息 泄露或系统破坏,将会带来巨大的损失。因此,确保 web 应用软件的安全是非常重 要的。不幸的是,由于 web 应用软件及其运行环境天生的脆弱性,web 应用软件经 常容易出现安全问题。这主要是由于以下三个原因造成的。 一是由于 web 应用软件及其应用环境的开放性。 Web 应用软件基于 http 协议开 发,而这种协议是无状态的,web 应用软件需要自己记录软件状态信息并在客户端 与服务器之间来回传送,这就导致软件的内部信息容易被篡改而出现安全问题。同 时,由于 web 应用软件的客户机端是开放的,任何用户都可以访问并使用因此,它 很容易受到恶意用户的攻击。 二是由于 web 应用软件虽然得到较为广泛的应用, 但相对来说仍然是一种较为 新型的应用软件。 大部分开发 web 应用软件的程序员都是从传统的数据库或信息系 统程序员转行过来的,他们习惯于开发传统的 c/s 结构系统。这种系统中通常客户 端是给受信任的用户使用的,因此这些程序员在开发软件时容易忽略对来自客户端 输入的过滤和校验,这很容易导致软件产生可利用的漏洞。 三是由于 web 应用软件有着广泛的用户群。传统的 c/s 结构系统的客户端通常 是给受过培训的专业操作人员使用,而 web 应用软件面向广大的普通用户,他们的 计算机知识有限,容易因为不适当或者不谨慎的操作而在使用中造成自己私密信息 被泄露或者自己的机器被入侵。1 华 中 科 技 大 学 博 士 学 位 论 文因此,web 应用软件在部署和使用前,需要进行广泛的测试,以确保其在复杂 的应用环境中能正常运行而不至于导致安全问题。特别是对于电子政务系统、银行 证券等金融系统和网上交易等电子商务系统而言,在 WEB 系统部署前进行充分的 安全性测试是非常必要的。 当前, web 应用系统的安全性研究主要集中于对 web 应用软件的运行环境例 对 如服务器操作系统[1-3]、数据库系统[4-6]、web 服务器软件的安全评估和分析[7-9],以 及 web 系统的入侵容忍技术[10,11]等等, 这些研究都是立足于 web 应用系统整体运行 的层面上进行安全性研究,缺少对 web 应用软件自身安全性的深入分析。当前有关 web 应用软件自身的安全性的一些研究, 主要关注的是对部分常见的 web 应用软件 漏洞进行总结分析和防范[12-14],或者对 web 服务等组件进行安全测试[15,16],尚未 见到对 web 应用软件安全漏洞测试理论与技术的全面、系统性的研究。因此,研究 web 应用软件安全漏洞测试的理论与技术具有重要的理论和实际意义。1.2国内外研究现状当前,对 web 应用软件安全漏洞测试的主要研究集中于渗透测试、针对特殊漏洞的测试和错误注入测试等方面。 1.2.1 渗透测试渗透测试是一种传统的软件安全性测试方法。渗透测试的概念最早由R.R. Linde 于1975年提出,并被用于操作系统的安全性测试中[17]。渗透测试的主要方式是安排 专业的测试人员针对各类已知漏洞类型,模仿黑客的行为,采取各种手段试图入侵 软件系统[18]。目前渗透测试在web应用软件安全漏洞测试中应用最广,其步骤为[19]: 1、定义渗透测试的目标:确定测试范围,建立测试规则,明确测试对象和测试 目的。 2、进行背景知识研究:搜集测试目标的所有背景资料,包括系统设计文档、原 代码、用户手册、单元测试和集成测试的结果等。.2 华 中 科 技 大 学 博 士 学 位 论 文3. 漏洞猜测。测试小组的成员根据对系统的了解和自己的测试经验猜测系统中 可能存在的漏洞,形成漏洞列表,随后测试组对这个漏洞列表进行分析、过滤,并 排列出待测漏洞的优先级。 4. 漏洞测试:根据漏洞类型生成测试用例,运行程序并进行测试,确认漏洞是 否存在。 5. 根据已发现漏洞推测新漏洞:根据已发现漏洞类型推测系统中可能存在的其 它类似漏洞,并进行测试。 6. 修补已发现的漏洞:提出修改完善软件原代码的方法。 上述传统的渗透测试方法是以线性的方式遍历所有的已知漏洞类型,这种方式 有其缺陷:一是测试过程极大地依赖测试人员的经验和知识,不同的人员测试结果 会有很大的不同;二是测试过程是线性地对单个漏洞依次检验,没有考虑到不同的 漏洞组合导致的安全问题。针对这些不足,国内外一些学者采用不同的方式对渗透 测试进行了建模,并提出了相应的测试用例生成算法。其中McDermott提出了一种利 用Petri网的渗透测试结构化建模方法[20],称之为“攻击网(attack nets)。Martin等 ” 则进一步使用时间约束的有色petri网进行渗透测试建模[21]。国内的一些研究者也在 这些研究的基础上提出了一些改进的模型[22,23]。这些模型的特点是能对并发的、复 杂的网络攻击行为进行模拟,对测试过程进行建模,并提出了生成测试用例的算法。 但总体而言,目前渗透测试仍然是一种严重依赖于测试人员个人经验与能力的测试 方法。 1.2.2 针对特殊漏洞的测试当前,对于 web 应用软件安全性的研究主要集中于几种常见的安全漏洞上,其 中关注度最高的是 sql 注入漏洞和 xss 漏洞的检测。Sql 注入漏洞和 xss 漏洞是当前 web 应用中增长最快的两类漏洞[24]。在 2010 年 owasp 组织发布的前 10 位最具威 胁的安全漏洞中,注入类型的漏洞和 xss 漏洞分别排名第 1 位和第 2 位[25]。这两 类漏洞都是由于编程者未严格校验和过滤用户输入而产生的。对于这两类漏洞的检3 华 中 科 技 大 学 博 士 学 位 论 文测是当前研究的热点,研究者们发表了大量的文章,从不同的角度提出了多种类型 的方法,大致可分为基于语法分析的方法、检测输入数据的方法、检测输出数据的 方法等等。 1、基于语法分析的方法:该方法主要用于对 sql 注入漏洞的检测[26-29],它使 用有限状态机[27,29]或者解析树[26]等方式为 sql 语句建模,这种建模有两次,先对 原程序语句建模,然后对接受用户输入后对应的动态构建的语句建模,如果两个模 型存在差异,说明用户的输入改变了语句的语法结构,原程序存在漏洞。一些研究 者在论文中也提出,他们设计的基于语法分析的 sql 漏洞检测方法也可以用于 xss 的检测[30-32],但并没有实现相应的检测工具。 2、基于输入特征数据检测的方法:该方法先生成一个非法输入(包含可以改 编 sql 语句或脚本语法结构的字符)列表,然后检查程序是否对用户的非法输入进 行了校验,如果程序不加检验和过滤就使用该输入构建 sql 语句或页面脚本,则认 为该程序包含漏洞[33-36]。这种方法通常和程序控制流的静态分析相结合来使用。 例如文献[37]分析程序从接受用户输入到生成页面输出之间的控制流程,并自动生 成包含非法输入的测试用例来检测 xss 漏洞。文献[38]则在静态分析过程找到不安 全的控制流后,在用户输入节点上插入校验代码以降低漏洞误判率。 3、基于输出特征模式检测的方法:该方法检测程序的输出数据,受到 sql 或 xss 攻击的程序通常会在动态生成的 sql 语句中包含某种特定的模式, 例如包含重言 式或不匹配的引号等等。如果检测到程序输出的 sql 语句或者页面脚本中包含这种 不安全的模式,则认为该程序存在漏洞。例如,文献[39]检测程序生成的页面脚本 内是否含有不安全的编码模式, 文献[40]检测动态生成的 sql 语句内是否含有不安全 的语句模式。 4、基于异常行为监控的方法:该方法通过自动测试软件实现。先对测试软件 进行训练,通过输入正常的数据得到一个正常行为数据库。当被测软件运行时,监 测其行为,并与正常行为进行比对,如果两者有差异,则认为存在安全漏洞。例如, 文献[13]通过一个安全策略来表达 javascript 脚本的正常行为,如果被测软件运行时 违反了该安全策略,则认为存在 xss 漏洞。某些入侵检测技术也应用了异常行为监4 华 中 科 技 大 学 博 士 学 位 论 文控方法来防止 sql 或者 Xss 注入攻击[41,42]。 上述研究针对专门的漏洞进行了深入的分析,并且开发了各类不同的工具用于 辅助检测和防范漏洞。部分检测方法对漏洞的误判率和漏判率降低到 50%以下,具 备较好的实用价值。但是,对 web 应用软件的安全性测试仅仅局限于常见漏洞是不 够的。随着 web 技术的广泛使用和深入发展,更多的新的漏洞类型和攻击方式也不 断涌现。Web 应用软件中不存在常见的漏洞并不意味着安全,非常见的漏洞反而更 容易造成严重的安全问题。 需要有系统的方法对 web 应用软件的安全性进行全面的 测试。 1.2.3 错误注入测试方法错误注入技术起源于对容错系统的测试,最早用于硬件设计。错误注入方法按 照一定的错误模型, 人为地制造生成错误, 并将生成的错误注入到被测试的系统中, 用来促进系统崩溃或失效的发生,通过观察系统在错误注入后的反馈,对系统进行 验证和评价 [43]。1978 年,DeMillo 等人首次提出了在软件测试中应用错误注入技 术的方法[44]。 错误注入测试既可以使用黑盒方法实现[45], 也可以使用白盒方法实 现[43],在软件测试方面具有很广泛的应用,如用于集成测试[46]、软件组件测试 [47]、容错分析[48]、可靠性测试[49,50]、安全性测试[51-53]等。其中应用最广泛的 领域是软件可靠性测试和安全性测试。 在用于软件安全性测试时,purdue 大学的 Wenliang Du 等人提出了环境错误注 入的方法,并设计了 EAI 模型(Environmental-Application Interaction fault model) 来对环境错误进行分类[51]。这种模型认为系统是由环境与应用软件组成的,当环 境出现错误而应用软件不能适应时,就可能产生安全问题。Yao-Wen Huang 等人应 用环境错误注入的方法对某些特定的漏洞类型如 SQL 注入漏洞和 XSS 漏洞进行了 自动化测试[52],取得了较好的效果。国内一些学者也应用环境错误注入的方法进 行了安全性测试的研究[53]。错误注入测试技术易于形成系统化的方法,且方便实 现自动化测试,因此用于 web 应用软件安全脆弱性测试是较为合适的。但是,使用 传统的 EAI 模型进行 web 应用软件安全漏洞检测时,尚存在不足之处。EAI 模型仅5 华 中 科 技 大 学 博 士 学 位 论 文仅考虑环境错误对应用软件安全性的影响。 但是, web 应用软件有较为特殊的性质, 其内部运行状态易受干扰,仅仅注入环境错误并不能全面检测漏洞。1.3本文研究的主要内容本文广泛了解和研究了 web 应用软件安全问题、 错误注入测试方法和测试充分性评价方法等技术,研究了 web 应用软件安全漏洞分类方法、web 应用软件安全性 测试模型和评价安全性测试充分性的标准,用以对 web 应用软件安全性进行全面、 系统化的测试。概括来说,本文主要研究了如下三个方面的内容。 1. 一种 web 应用软件安全漏洞分类方法 研究了环境错误与状态错误引发 web 应用软件安全问题的途径, 在此基础上提 出了一种用于进行 web 应用软件安全漏洞分类的层次分析模型, 对各类漏洞进行了 具体分析和描述,并提出了基于分类树的安全漏洞二进制编码方法。使用该模型对 CVE 漏洞数据库中抽取的 web 应用软件安全漏洞进行了分类,并与使用 EAI 模型 分类的结果做了对比。评估结果表明,该模型具备良好的漏洞分类能力,适用于指 导 web 应用软件的安全测试和安全防御工作。 2、一种 Web 应用软件安全性测试模型 提出了一种新的适用于 web 安全性测试的错误注入模型, 即环境与状态错误模 型(Environment and Status Fault Model),简称 EAS 模型。根据该模型提出了错误 注入点判断规则库和错误构造算子,并给出了在任一类错误注入点上应该使用的错 误构造算子和相应的漏洞判定准则。设计了应用错误模型进行实际测试的方法和步 骤。使用该测试方法对 PEGames 软件进行了测试,测试结果发现了该软件在 CVE 漏洞数据库中已经记载的全部漏洞,并发现了该软件中一个尚未被 CVE 记载的新 漏洞。 3. 一种安全性测试效果评价方法 使用层次分析方法对 web 应用软件脆弱性测试效果进行评估, 提出了 web 应用 软件安全测试充分性评价的层次分析模型,定义了测试充分性评价函数。使用本文6 华 中 科 技 大 学 博 士 学 位 论 文提出的评价方法对 BBS 软件 IPB 的实际测试效果进行了评价。实验表明,评价函 数计算出的评价值与实际测试中发现的漏洞个数是正相关的,所提出的评价方法是 实用和可靠的。1.4论文组织结构本论文的全文内容安排如下: 第 1 章,绪论。提出了 web 应用软件安全性测试的意义和研究背景。介绍了当前应用于 web 应用软件安全性测试的几种主要技术和研究现状, 并评价了各类技术 的优缺点。明确了本文研究的内容。 第 2 章, 一种 web 应用软件安全漏洞分类模型。 提出了一种 web 应用软件安全 漏洞的层次分类模型,分析讨论了各类漏洞,并提出了基于分类树的安全漏洞编码 方法。 第 3 章, 一种 Web 应用软件安全性测试模型。 提出了环境与状态错误注入模型 (EAS 模型) ,用于指导 web 应用软件安全性测试。给出了错误注入点判定规则库 和错误构造算子,基于 EAS 模型提出了具体的测试方法。 第 4 章,一种安全性测试充分性评价方法。基于层次分析法提出了一种安全性 测试充分性的评价方法,设计了测试用例的层次结构模型,利用两两判断矩阵求出 各类测试用例的重要性权值,定义了充分性评价函数用于量化评价测试充分性。 第 5 章,总结与展望。对全文所作工作进行总结,并做进一步展望。7 华 中 科 技 大 学 博 士 学 位 论 文 2 一种 web 应用软件安全漏洞分类方法2.1 安全漏洞分类研究的意义和相关背景研究 web 应用软件的安全性测试技术, 首先应对已知的 web 应用软件安全问题 进行研究,了解各种漏洞产生的原因、触发的条件、造成的后果,抽象出各类漏洞 的特征,进行科学的分类,才能有效指导安全性测试工作,保障其科学性、高效性 和针对性。具体而言,在 web 应用软件安全性测试方法的研究中,研究安全漏洞分 类有以下几点意义。 1、通过对已有安全漏洞的研究,有助于分析 web 应用软件安全问题的特点, 了解 web 应用软件安全问题的本质,提出有针对性的安全测试理论和技术。 2、通过漏洞的分类,研究各类漏洞的产生原因,有利于指导安全性测试用例 的生成,缩小测试用例的范围,提高软件安全性测试的效率,降低测试的开销和成 本。 3、通过漏洞研究与分类,掌握不同漏洞的特征和危害性大小,有助于评价测 试方法的实用性和效果,有利于制定测试出安全漏洞后的改进方案。 实际上,不仅仅是研究安全性测试时需要研究漏洞分类,其它大部分涉及计算 机安全问题的研究,如入侵检测、安全策略、脆弱性数据库和网络攻防等方面的研 究,都需要先研究漏洞分类模型,以此为基础才能提出进一步的策略。因此,软件 漏洞分类一直是计算机安全研究方面的焦点之一。不同的学者从不同的角度出发, 根据不同的研究目的和应用范围,提出了多种漏洞分类方法。 软件漏洞分类的研究起源于 20 世纪 70 年代以来美国开展的一系列工作,其早 期启动的 RISOS(Research in Secured Operating Systems) 和 PA(Protection Analysis Project)项目和 PA(Protection Analysis)项目是计算机安全研究的起点[54,55],主 要研究了操作系统漏洞。1994 年美国信息部海军实验室的 landwher 等人提出了一 种分类模型,按照漏洞的来源、产生时间、所处位置三个要素进行分类[56]。19988 华 中 科 技 大 学 博 士 学 位 论 文年普渡大学 COAST 实验室的 Krsul 等人在此前研究的基础上,提出了更为完整的 漏洞分类模型,并建立了专用漏洞数据库[57]。同时期 aslan 和 bishop 等人也分别 提出了不同的漏洞分类模型[58,59]。随着九十年代末期互联网应用的广泛流行,一 些学者开始研究互联网应用的安全漏洞,如 Howard 等提出了一种基于网络攻击者 的攻击路线进行漏洞分类的方法[60]。MITRE 公司的&公共漏洞列表& (Common Vulnerability Enumeration, CVE)项目为每个漏洞建立了统一标识,方便了漏洞信息 共享和交换[61]。OWASP(The Open Web Application Security Project)是一个致力 于 web 应用安全的国际组织,OWASP 分析实际应用中经常出现的安全漏洞,并对 各类漏洞进行总结描述,发布每年度的最危险的十大漏洞[62]。但它并没有形成一 个明确的漏洞分类标准。 以错误注入理论为基础,普渡大学的 Wenliang Du 等从一个较高的层次,即软 件 与 运 行 环 境 交 互 的 层 次 进 行 研 究 , 提 出 了 EAI ( Environmental-Application Interaction fault model)错误注入模型 [51]。EAI 模型认为系统由软件和运行环境组 成,当软件不能正确处理运行环境发生的错误时,就产生安全漏洞。该模型借鉴了 容错系统测试的思想,并且能很好地用于指导软件安全性测试。但是,如果根据该 模型来指导 web 应用软件测试, 则不能完全覆盖 web 应用软件的所有漏洞。 这是因 为 web 应用软件较为特殊,它基于 http 这种无状态的协议,必须由软件自身在客户 端与服务器端之间保存、传输和处理运行状态信息。因而对于 web 应用软件而言, 其运行环境和内部状态均容易受到恶意攻击, EAI 模型没有考虑到内部运行状态 而 直接受到攻击而产生的错误。 本文借鉴了 EAI 模型以错误注入角度来进行安全性测试的思路,针对 WEB 应 用软件的安全特性进行研究, 在综合考虑环境与状态错误对 web 应用软件造成安全 影响的基础上,提出了一种用于 web 应用软件安全漏洞分类的层次分类方法,并与 近期发表的一些新的漏洞分类方法进行了对比分析。9 华 中 科 技 大 学 博 士 学 位 论 文2.2 基于环境和状态错误的漏洞分类从错误注入的角度来看,应用软件的安全漏洞是由于其不能正确处理错误而产 生的。引发 Web 应用软件安全漏洞的错误主要体现在两个方面: web应用软件运行环境出现错误; web应用软件运行状态出现错误。 上述两种错误引发 web 应用软件安全漏洞的途径是不一样的,环境错误发生 时, web 应用软件的外部环境实体例如如外部文件、 用户输入数据等处于错误状态, 这些环境实体被 web 应用软件读取或操作后,其错误被传导至应用软件内部,导致 软件出现安全问题。当环境错误引发安全漏洞时,程序的执行流和攻击者的攻击流 交互的情况如图 2.1 所示。攻击者环境错误环境错误传递到内部安全漏洞Web 应用软件开始 执行 读取和操作外部实体 将外部实体赋给内部实体,并操作内部实体 产生执行结果图2.1 攻击序列和程序执行序列(环境错误漏洞)状态错误发生时,应用软件的外部运行环境是正常的,但是程序内部实体由于 恶意用户的攻击而发生了错误,例如恶意用户直接修改了客户端代码、篡改程序维 护的状态信息数据如 cookies、session ID 或隐含表单变量等等,此时错误直接在程 序内部发生,不需要经过环境实体的传导。图 2.2 示意了环境错误引发安全漏洞时, 程序的执行流和攻击者的攻击流交互的情况。攻击者 Web 应用软件开始 执行 读取和操作外部实体状态错误安全漏洞将外部实体赋给内部实体,并操作内部实体产生执行结果图2.2 攻击序列和程序执行序列(状态错误漏洞)10 华 中 科 技 大 学 博 士 学 位 论 文2.2.1 相关的形式化定义前面分析了引发web应用软件安全漏洞的两类错误,根据这两类错误的不同可以 相应地对web应用软件漏洞进行分类。为便于进一步讨论,先对这两类错误以及web 应用软件做形式化定义。 在EAI模型中,提出了环境实体和内部实体的概念,任何位于程序代码或内部数 据空间之外的元素被称为环境实体,记为 e 。例如,用户输入数据、外部文件、网络 等均属于环境实体。本文沿用EAI模型中环境实体的概念,并将所有环境实体的集合 记为 E 。在环境实体的基础上,可进一步定义环境错误。 定义2.1 因环境实体的状态或属性被恶意更改而出现的错误称为环境错误,处于错误状态的环境实体的集合记作 E f ,显然 E f ? E 。 本文对EAI模型中的内部实体概念进行扩展后,得到定义2。 定义2.2 处于Web应用软件代码、数据空间之内的元素以及反映程序运行顺序的 元素均称为内部实体,记为 i ,内部实体的集合记为 I 。因内部实体被恶意更改或伪 造而出现的错误称为状态错误。处于错误状态的内部实体的集合记作 I f ,显然If ? I 。例如, Web应用软件为保存页面运行状态信息而设置的隐含表单变量、URL参数 或cookies都是内部实体,这些实体很容易被恶意用户篡改而处于不正确状态,这种 错误称为状态错误。此外,程序执行的顺序也被视为内部实体,WEB程序的执行顺序 对用户而言是以一系列页面的形式展现的,设页面为 p ,则有序元组 ( p1 , p2 ...., pn ) 是 一个表示程序执行顺序的内部实体。 定义2.3 Web应用软件执行后,程序对已有外部实体或内部实体属性进行的改变称为操作,记为 t ,所有操作的集合记为T 。程序生成的新的内部或外部实体称为 数据,记为 d ,所有数据的集合记为 D 。程序输出异于设计者所期望的操作称为错误 操作,所有错误操作的集合记为 T f 。程序输出异于设计者所期望的数据称为错误数 据,所有错误数据的集合记为 D f 。显然,有 T f ? T , D f ? D 。11 华 中 科 技 大 学 博 士 学 位 论 文从错误注入测试的角度来看,Web应用软件的运行方式是:接受一组输入的外部 实体,并在一定的内部状态(由一系列内部实体的状态组成)下运行,最后输出某 些操作或数据。当测试者对外部实体或内部实体的状态注入错误后,如果程序能正 常运行,则程序具有容错性,不存在安全漏洞;如果程序出现错误操作或输出错误 数据,则程序在该错误下出现了一个安全漏洞。根据以上运行特点,可定义Web应用 软件的数学模型如下。 定义2.4 Web应用软件可抽象为集合 I ? E 到集合 2T ∪ D 上的一个函数,记为f : I ? E ? 2T ∪ D 。其中 2T ∪ D 为集合 T ∪ D 的幂集, ? 为定义在全集合上的运算, ?→ 且:I ? E = {{i1 ,i 2 ,..., in , e1 , e2 ,..., em }| in ∈ I , em ∈ E ,1 ≤ n ≤# I ,1 ≤ m ≤# E}从以上定义可知,Web应用软件运行时,对每一个输入集 {i1 ,i 2 ,..., in , e1 , e2 ,..., em }, 均有一个唯一的输出集与之对应,这个输出集可以只包含操作:{t1 ,t 2 ,..., t n } ,或只包 含数据: {d1 ,d 2,..., d n } ,或既包含操作也包含数据: {t1 ,t 2 ,..., t n , d1 , d 2 ,..., d m }。 2.2.2 环境错误漏洞web应用软件分为服务器端和客户端两部分,其客户端的运行环境是浏览者的机 器,来自客户端的数据容易被伪造或修改,某些恶意用户也会针对应用程序的弱点 精心构造攻击性的输入数据。因此web应用软件的运行环境容易出现错误,如果不能 正确处理这些错误,就会产生安全问题。因web应用软件不适应环境错误而产生的漏 洞称为环境错误漏洞。其形式化定义如下: 定义2.5?→ 设有WEB应用软件 f : I ? E ? 2T ∪ D ,如果对于某个 a ∈ G ,在 f (a) 中至少存在一个元素 x ,且 x ∈ T f ∪ D f ,则称web应用软件 f 存在一个环境错误漏洞, 记为 VEa 。所有环境错误漏洞的集合记为 VE 。上述定义中 G 为:12 华 中 科 技 大 学 博 士 学 位 论 文__ ? ? G = ?{i1 ,i 2 ,..., in , e1 , e2 ,..., em }| in ∈ I f , em ∈ E且至少存在某个ei ∈ E f ,1 ≤ n ≤ # I ,1 ≤ m, i ≤# E ,? ? ?2.2.3状态错误漏洞在运行状态上,Web应用软件具有很强的开放性,导致运行状态容易被恶意更改 而产生错误,这主要体现在三个方面。一是状态信息的开放性。http协议是无状态 的,Web应用软件的开发人员需要自己记录程序运行的状态信息,并在客户端和服务 器端进行保存和传输。这些信息对终端用户公开,容易被恶意更改和伪造。二是原 代码的开放性。Web应用软件的客户端程序大部分由Javascript或VBScript等脚本语 言编写,其原代码对用户是可见的。此外还有些用java编写的applet程序,也可以 通过反编译得到原代码。恶意用户可以通过修改原代码来进行攻击。三是执行顺序 的开放性。Web应用软件的执行通过多次页面请求来实现,恶意用户很容易跳过某些 程序执行步骤, 而直接去执行后面的内容。 如果web应用软件不能正确处理这些错误, 则容易引发软件的安全问题。因为web应用软件不能正确处理内部运行状态错误而产 生的漏洞,称为状态错误漏洞。其形式化定义如下: 定义2.6: 设有WEB应用软件 f : I ? E ? 2T ∪ D , ?→ 如果对于某个 a ∈ H ,在 f (a) 中 至少存在一个元素 y ,且 y ∈ T f ∪ D f ,则称web应用软件 f 存在一个状态错误漏洞, 记为 VI a 。所有环境错误漏洞的集合记为 VI 。上述定义中 H 为:? H = ?{i1 ,i 2 ,..., in , e1 , e2 ,..., em }| in ∈ I ?2.2.4且至少存在某个i j__ ? ∈ I f , em ∈ E f ,1 ≤ n, j ≤ # I ,1 ≤ m ≤ # E ,? ?漏洞的分类层次结构及具体描述Web 应用软件的漏洞种类多而复杂,如何合理分类是一个较为困难的问题。前文从错误注入的角度对引发漏洞的原因进行了分析,并归纳出环境错误和状态错误 两种类型以及相应的漏洞类别。由此,可以得出一种基于环境和状态错误的安全漏 洞层次分类方法,该方法根据引发漏洞的错误的位置、错误的来源和错误数据的结 构特点等三个方面对漏洞进行层次性分类,具体的层次结构见图 2.3。13 华 中 科 技 大 学 博 士 学 位 论 文图 2.3 所示的 web 应用软件漏洞分类层次结构图包含三个子层,各子层的分类 依据如下: 第1子层分类依据:该层按照引发漏洞的错误的位置来分类。即根据该错误 是发生在web应用软件外部的环境实体中、 还是在内部的状态实体中来分类, 由此可以分为环境错误漏洞和状态错误漏洞。 第2子层分类依据:该层按照错误的来源进行分类。对于Web应用软件而言,环 境错误主要来自用户输入、网络输入和文件系统输入三个来源,根据不同的错 误输入来源,环境错误漏洞可分为用户输入漏洞、网络输入漏洞和文件输入漏 洞。状态错误主要来自状态信息被篡改、原代码被修改、执行顺序被扰乱等三 个来源,因此相应地被划分为状态信息漏洞、代码修改漏洞和执行顺序漏洞。 第3子层分类依据:该层按照错误数据的内容和结构特点来分类。对于不同 来源的错误,其数据内容和结构上都包含了一定的特点。例如,同样是用户 数据漏洞,一个来自使用SQL注入攻击的恶意用户输入的错误数据,其中必 然包含了非法字符内容和SQL命令结构, 由此触发的漏洞可以细分SQL注入漏 洞; 使用XSS攻击的恶意用户在输入的错误数据中包含了WEB脚本语言命令结 构,由此触发的漏洞细分为跨站点脚本漏洞。同理,其他的漏洞类型也可以 根据其错误数据的内容和结构特点做进一步细分。V Web 应用软件漏洞E 环境错误漏洞S 状态错误漏洞E1 用户数据漏洞E2 网络传输漏洞E3 文件系统漏洞S1 状态信息漏洞S2 代码修改漏洞S3 执行顺序漏洞注 入 漏 洞E 1 1跨 站 点 脚 本 漏 洞E 1 2缓 冲 区 溢 出 漏 洞E 1 3协 议 信 息 修 改 漏 洞E 2 1解 析 漏 洞E 2 2外 部 文 件 执 行 漏 洞E 3 1文 件 权 限 漏 洞E 3 2隐 藏 表 单 参 数 漏 洞S 1 1参 数 漏 洞S 1 2页 面 代 码 修 改 漏 洞S 2 1脚 本 代 码 修 改 漏 洞S 2 2跳 跃 漏 洞S 3 1目 录 猜 测 漏 洞S 3 2S Q LD N SU R LU R L图2.3基于环境与状态错误的漏洞分类层次结构图14 华 中 科 技 大 学 博 士 学 位 论 文下面,对漏洞分类层次结构图中的各类主要漏洞做详细的描述和分析,研究引 发这些漏洞的错误数据的具体特征,为后面研究错误注入测试的注入点判断和错误 生成方法奠定基础。 2.2.4.1 几种主要的环境错误漏洞分析环境错误漏洞中以用户输入漏洞在实际应用中最为常见。在用户输入错误中, 最为常见的是用户输入数据在格式或长度属性上发生的错误,以下列举一些有关用 户输入错误所产生的漏洞并进行简要分析,其中部分例子来自 OWASP 的安全攻击 库。 (1)SQL注入漏洞 因用户在输入数据中插入SQL语句,改变软件动态生成的SQL语句的结构,导致 软件出现执行错误的漏洞称为SQL注入漏洞[63]。例如,程序用如下语句动态构造查 询:string query = &SELECT * FROM items WHERE owner = '&+ userName + &' AND itemname = '&+ ItemName.Text + &'&;如果用户给变量ItemName.Text输入的数据是:name' OR 'a'='a。则当程序用其来 动态构造SQL查询时,如果不对输入的字符串进行过滤,而是直接使用它们拼接形 成SQL查询语句,则生成的SQL查询语句将会成为:SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name' OR 'a'='a'。这样查询语句结构被改变,由于表达式'a'='a'的值总是为真值,导致整个where子 句的查询条件总为真,从而可以绕过限制查询到数据表内的所有内容,使其它用户 的数据也被泄露,产生安全问题。 (2)跨站点脚本(XSS)漏洞 在输入数据中插入页面脚本代码,如果此后该输入数据被包含在页面上输出, 则脚本代码被执行,产生安全问题,这类漏洞称为跨站点脚本(XSS)漏洞[64]。例如 下面的代码用于在留言簿程序中输出用户的留言:&% String word = request.getParameter(&word&); %&15 华 中 科 技 大 学 博 士 学 位 论 文... Visitors' message: &%= word %& 如果用户仅仅输入留言的字符, 那么一切正常, 留言会在输出的页面显示出来。 如果用户的输入包括页面脚本,则将会产生严重的安全漏洞。例如下面的输入:&SCRIPT type=&text/javascript&& var adr = '../evil.php?cakemonster=' + escape(document.cookie); &/SCRIPT&留言簿软件把上面的代码作为页面的一部分输入后,这段代码将在其它访问这 个留言簿的用户机器上执行,其结果是把其它用户机器上的 cookie 值读出,并提交 给攻击者指定的程序 evil.php, 这样保存在其它用户 cookie 中的私人数据将被泄露。 (3)缓冲区溢出漏洞 恶意用户构造超长的输入数据,当超过程序为其分配的内存空间时,会覆盖内 存中的其它数据,导致软件崩溃或者攻击者的代码被运行,这类漏洞称为缓冲区溢 出漏洞。在 web 应用软件使用初期,这种漏洞广泛存在于使用 c 或 c++语言编写的CGI 程序中,或者以 dll 为后缀的 ISAPI 程序中。但随着目前 jsp 和 asp 等语言中引入缓冲区检查机制,目前缓冲区溢出问题在 Web 应用软件中呈下降趋势。但是,在asp 等实现了缓冲区检查机制的语言中,缓冲区溢出漏洞仍然可能发生。例如在 windows 系统中, ASP 程序中使用了非托管 API 调用, 当 且把用户的输入作为参数传递给该调用时,就有可能产生缓冲溢出问题。(4) 命令注入漏洞用户在输入数据中插入操作系统命令,导致软件在接受用户输入,并以此为参 数调用某些操作系统命令或外部程序时,执行了意外的操作,这类漏洞称为命令注 入漏洞。 例如, 假设程序调用了 finger 命令来进行查找, 如果用户输入数据:ls “-al”或者“name \r\n ls -al” 。则命令 ls Cal 也会执行。(5) Xpath 注入漏洞 在输入数据中插入 Xpath 查询语句,使程序动态构造的 Xpath 查询的结构被改 变,导致意外的操作被执行,这类漏洞称为 Xpath 注入漏洞。例如,对于程序中的16 华 中 科 技 大 学 博 士 学 位 论 文查询: FindUserXPath = &//Employee[UserName/text()='& + Request(&Username&) + &' And Password/text()='& + Request(&Password&) + &']&; 如果用户输入用户名为“blah' or 1=1 or 'a'='a” ,输入口令为“blah” ,则查询 语句变为: //Employee[UserName/text()='blah' or 1=1 or 'a'='a' And Password/text()='blah'] 这样不管输入的用户名和口令是否正确,该查询条件总为真。 (6)重编码漏洞 对输入的恶意数据进行重编码或双重编码,以绕过字符检查的限制,因不能 处理这类错误而产生的漏洞称为重编码漏洞。例如,如果程序检查并过滤字符“&” 和 “ & ” 那 么 可 以 对 他 们 进 行 编 码 , 例 如 使 用 html 编 码 , 恶 意 数 据 变 成 。 “&#3cscript&#3e” ,如果程序进行解码验证,还可以对%再进行一次编码,形成双 重编码 %253cscript%253e” 当服务器和程序均进行解码时, “ , 由于解码匹配的错误, 可能导致恶意数据仍然产生破坏。 (7)LDAP 注入漏洞 在输入数据中使用 LDAP 的查询语句。例如对于下述程序:String ldapSearchQuery = &(cn=& + $userName + &)&; System.out.println(ldapSearchQuery);如果在页面上接受 username 的地方输入“jonys) (| (password = * ) )” ,则查询语 句会变成:( cn = jonys ) ( | (password = * ) )这会导致输出用户 jonys 的密码。 除上述用户输入数据错误所产生的漏洞外,环境错误漏洞还包含因文件系统和 网络输入错误所产生的漏洞。其中文件系统漏洞包括外部文件执行漏洞和文件权限 漏洞等等,是指 WEB 应用软件在操作外部文件时,外部文件在名称、路径、权限 或内容等属性上发生错误,而软件不能正确处理而产生的漏洞。例如,当 web 应用17 华 中 科 技 大 学 博 士 学 位 论 文软件需要执行或调用一个外部文件时,如果该文件的目录或权限被篡改,而软件不 能正确处理,则可能执行了错误的文件,或者执行了不应该发生的操作。 网络输入漏洞包含协议信息修改漏洞和 DNS 解析漏洞等,是指 web 应用软件 在创建网络连接,或分析网络协议信息时,不能正确处理恶意用户植入的错误而产 生的漏洞。例如 http 报文头信息在网络传输中被伪造和篡改后,当程序利用这些信 息构造回复报文头时,可能发生恶意脚本注入和代码执行。例如下面的程序从一个http 请求中读出参数 author,然后将参数的内容作为构造 http 回复报文头的一部分: String user = request.getParameter(USWE_PAR); ... Cookie par1 = new Cookie(&user&, user); Par1.setMaxAge(cookieExpiration); response.addCookie(par1);如果参数author的值是正常的字符串值,例如john时,构造的http应答将是正常 的,如下所示:HTTP/1.1 200 OK ... Set-Cookie: user=john ...如果来自网络输入的http请求头被篡改,参数author变成“&john\r\nHTTP/1.1 200OK\r\n...”,则对应输出的http应答头变成: HTTP/1.1 200 OK ... Set-Cookie: user=johnHTTP/1.1 200 OK ...这样,http应答的报文头被分割成为两个,在第二个应答中,攻击者可以任意构18 华 中 科 技 大 学 博 士 学 位 论 文造应答头和应答正文,从而使访问者的浏览器重定向或者执行恶意代码。 2.2.4.2 几种主要的状态错误漏洞分析Web 应用软件的状态错误漏洞包括状态信息漏洞、代码修改漏洞和执行顺序漏 洞。其中状态信息漏洞在实际应用中最为常见,以下对一些主要的漏洞类型进行描 述和分析。(1) 状态信息漏洞 Web 应用软件必须在客户端保留某些运行状态信息,这些信息处于不可信任的环境中,容易被篡改而发生错误,软件因不能正确处理这些错误而产生的漏洞称为 状态信息漏洞。主要包含以下几类。 隐藏表单参数漏洞:页面中保存状态信息的隐藏表单参数值被修改,当软件 不 能 识 别 时 , 就 会 产 生 漏 洞 。 例 如 以 下 代 码 : &input type=”hidden”name=”number” value=3&。在在某个电子商务网站中这段代码用来记录用户购买货物数量,在后面的步骤中将用来计算付款。Value值保存了状态信息, 如果它被修改,而软件没有识别出来,则最终付款会出现错误。Cookie值修改漏洞:指软件不能正确处理被篡改的Cookie值而产生的漏洞。例如Cookie中可以保存很多敏感信息,如帐号、密码、信用卡号以及文件序 列号等等。如果修改文件序列号,而软件没有正常识别,则可能会偷窃到其 他人的个人文件。url参数漏洞:指软件不能正确处理被篡改的URL参数而产生的漏洞。在CGI协议中,GET方法传递的参数是包含在URL中的。在Web应用软件中,URL 参数经常被用来记录状态信息,并形成一个链接反馈给用户,以便点击执行 下一步。例如,用户在一个下载站点查询某个文件后,程序找到该文件并返 回链接:http://site.com/getfile.asp?file=a.rar。但是用户可以修改这个信息,将 参数改为 getfile.asp?file=../../../etc/password.txt 。这样就得到了系统的口令文 件。(2) 代码修改漏洞代码修改漏洞主要有如下三种类型。19 华 中 科 技 大 学 博 士 学 位 论 文页面代码修改漏洞:指因攻击者修改页面的html代码而产生的漏洞,例如修 改用来限制输入的代码,例如列表框、单选框、多选框等,将选项改为恶意 数据,如果web应用软件不能正确处理,就会产生漏洞。 脚本代码修改漏洞:指恶意用户修改页面上脚本代码而产生的漏洞,例如修 改用于限制和过滤用户输入的javascript或vbscript脚本,以便输入恶意数 据,当服务器端的软件对此不做校验时,就产生了安全漏洞。 Applet代码修改漏洞: 这类漏洞是因为用户反编译页面的Applet代码而产生。 如果软件开发员没有考虑到用户可能通过反编译看到原代码,而在原代码中 包含了敏感信息如帐号、密码、加解密算法等,或者对页面applet的执行结 果不做任何审查,就会产生安全漏洞。(3) 执行顺序漏洞执行顺序漏洞是指因 Web 应用软件不适应其执行顺序被恶意用户打乱而产生 的漏洞。主要有以下两种: URL 跳跃漏洞: 指攻击者打乱 URL 页面执行的业务流程而产生的漏洞。一般 web 应用软件都需要用户按照一定次序来执行某项流程,例如一个卖书的网站可能 会有“挑选书――确定数量――付款――填写发货信息”等步骤。但是浏览者 很容易通过直接在地址栏输入页面 URL 来跳过程序给定的某些执行步骤, 例如, 不付款而直接跳转到发货页面,如果程序不能正确处理这种错误,就会产生安 全问题。 目录猜测漏洞:指攻击者跳过认证步骤或在资源正式发布前, 直接访问网站目录 和文件资源而产生的漏洞。这一般通过猜测目录名或文件名来实现。一些web应 用系统在生成临时文件时,以不为该文件增加页面链接的方法来防止该文件发 布,但是这是非常不可靠的。例如,路透社曾经通过猜测一家公司网站的季度报 表文件的命名规则,在该公司没有正式发布指向该文件的链结时,直接取得了文 件。20 华 中 科 技 大 学 博 士 学 位 论 文2.2.5 漏洞分类编码方法在漏洞测试或者入侵检测系统的开发过程中,为方便对漏洞的描述和计算机处 理,一般应对漏洞进行编码。根据本文提出的漏洞分类层次结构,设计了一种基于 分类树的二进制编码方法。漏洞分类树如图 2.4 所示。图2.4用于web应用软件漏洞编码的分类树在图 2.4 的漏洞分类树中,结点代表漏洞类别,每一大类和其下的细份类别之 间通过有向边相连,有向边的方向为从大类指向其细分类别。每条边均带有不同的 权值,为一组二进制码,同一层次的边权值码的长度一样。因此,该分类树为一个 带权有向树。利用该分类树为漏洞类别编码的方法为: 从根结点 V 出发到达某类漏洞结点, 按先后顺序将经过的边的权值从左到右排 列,形成一个二进制数,即得到该类漏洞的编码。 示例:根据上述编码方法可以得到下列漏洞类型的编码。 环境错误漏洞(E)的编码为: 0, 文件系统漏洞(E3)的编码为 0010, 页面代码修改漏洞(S21)的编码为 。 上述漏洞类别编码方法的特点是: 唯一性:由于从根结点到每个结点的路径都是唯一的,因此保证了每种漏洞 编码的唯一性;21 华 中 科 技 大 学 博 士 学 位 论 文自解释性:由于同一层次的边长度固定,但每条边所带的权值是不同的,因 此从漏洞的编码可以反映出该类漏洞在分类体系中所处的层次位置,以及该 漏洞类别以上的大类的层次结构。 可扩充性:从第2层的边开始,权值码的长度有一定的冗余,保证了漏洞分类 编码体系的可扩充性。便于将以后随着技术发展出现的新漏洞类型纳入该体 系。2.3对比分析除了早期美国 RISOS 和 PA 计划提出的分类,以及九十年代 purdue 大学COASTA 实验室以及 Landwehr、Krsul 和 Bishop 等人提出的一些经典的漏洞分类方法外。近年来,一些专家和研究者根据不同的目的和研究需要,针对不同的分类 对象提出了一些新的安全漏洞分类方法。下面,对这些新的分类方法与本文所提出 的分类方法进行详细地对比和分析。 泸文大学(leuven university)的 Frank Piessens 于 2002 年提出了基于漏洞成因 的分类方法[65]。该分类方法有两个层次,第一层根据开发过程的不同分为分析、 设计、研发、部署和维护等 5 个阶段。第二层根据不同阶段漏洞引入软件的原因进 行细分,共分为 19 个子类。例如分析阶段就包含无风险分析、偏颇的风险分析和 没有预料到的风险等三种类型。Piessens 的分类方法贯穿整个软件生命周期,有利 于指导软件的正确开发和安全使用,并具有较高的教学意义。其缺点在于第二层的 分类较为模糊。例如分析阶段“偏颇的风险分析”和“没有预料到的风险”就互相 存在交叉。2004 年,Maryland 大学的 Kanta Jiwnani 等人在 Landwehr 的分类方法基础上进行了改进,提出了基于原因、位置和影响等三个维度的对操作系统漏洞进行分类 的方法[66]。第一个维度是原因,描述漏洞是怎样进入操作系统的,包含验证错误、 域错误、边界错误等 8 个子类别。第二个维度是位置,指出了漏洞在软件的哪个函 数内。包含系统初始化、进程管理、文件管理等 6 个子类别。第三个维度是影响,22 华 中 科 技 大 学 博 士 学 位 论 文指漏洞被利用后对系统造成的破坏,包含非授权访问、根或系统访问、拒绝服务等9 个子类别。Jiwnani 的分类方法使用了三个维度,可以较全面地描述漏洞的特性,适用于对操作系统进行全面的安全审查和评估。其缺点在于没有提出明确的分类准 则和定义,存在分类含糊不清和完备性不够的问题。例如在“影响”这个维度的分 类中, “根或系统访问”实际上就是“非授权访问”的一种,而“位置”维度的分 类中,包含了进程、文件管理等类别,但较为重要的“网络通信管理”却没有包含 在内。与 Jiwnani 分类方法类似的还有 Weber 等人于 2005 年提出的基于 Landwehr 分类框架进行扩充的分类方法[67]。2007 年,Bazaz 和 Arthur 等人从一个新的角度进行了研究,提出了基于约束和假设的漏洞分类方法[68]。他们从研究对漏洞的实际攻击入手,认为漏洞形成的原 因,是由于应用软件没有确保使用计算机资源时应服从的约束和假设被遵守。该分 类将软件使用的资源分为 3 大类,分别是主内存、I/O 系统和加密资源,随后对该 3 大类进一步细分为 6 个子类,主内存分为“动态内存”和“静态内存”两类,I/O 分为“网络接口”和“文件系统”两类,加密资源分为“随机数”和“加密算法及 协议”两类。并对不同类别需遵守的约束和假设做了进一步分类。Bazaz 的基于约 束和假设的分类方法有很强的实践意义,能较好地用于软件安全性检验和评估。其 优点在于根据不同资源进行分类,分类规则很清晰。但是该分类方法还显得较为粗 糙,漏洞类别不够完备,例如在 web 应用软件中很常见的 SQL 注入漏洞和 XSS 漏 洞均无法归入任何一类中。 前面提到,Purdue 大学 COASTA 实验室 wenliang du 等人于 2000 年提出了基 将漏洞分为直接环境错误漏洞和间接环境错误漏 于错误注入的 EAI 漏洞分类方法, 洞。这该方法分类规则较清晰,且非常适合于指导软件的安全性测试。但是,在对web 应用软件安全漏洞进行研究和分类的实际工作中, 发现 EAI 分类法及前述多种分类方法均不够适用。这是因为 web 应用软件具有开放性和无状态性,其安全保护 特性较传统的应用软件更为复杂。而上述分类法要么过于笼统和模糊,无法对 web 应用软件漏洞进行明确归类;要么完备性不够,不能概括 web 应用软件内部状态容 易受到恶意攻击的特点,对于较多的漏洞无法归类。23 华 中 科 技 大 学 博 士 学 位 论 文为解决上述问题,本文对 EAI 方法进行了改进和扩充,提出了基于环境和状态 错误的漏洞分类方法。该方法将 EAI 中的直接环境错误和间接环境错误归为一类, 并新增了状态错误的类别, 用于纳入因 web 应用软件没有正确处理被篡改的内部状 态而造成的漏洞。基于环境和状态错误的分类法继承了 EAI 分类规则清晰的特点, 类别明确且没有交叉,适用于指导 web 应用软件的安全性测试,便于根据类别特点 快捷找到测试点,并根据测试点的特性构造相应测试用例。与 EAI 分类法相比,该 方法对 web 应用软件漏洞的覆盖更为全面, 能有效地分类绝大部分实际应用中常见 的 web 安全漏洞。 在本文后面的实验评估部分, 使用这两种分类法对一些 web 应用 软件漏洞进行了分类,并对分类结果做了对比分析。 要评估一种漏洞分类方法的优劣,主要看其是否满足以下几类主要原则: 互斥性:分类目录不重叠,一个漏洞只能分类到一个类别中。 确定性:有明确的步骤用于分类,分类结果不因分类人员或时间而改变。 完备性:分类目录包含所有可能的漏洞。 适应性:分类方法能够适用于不同的目的、环境和系统。 可扩展性:当发现新的安全漏洞时可以方便地扩展漏洞类别。 根据这些原则,对上述几种分类方法进行了比较分析,以“好、较好、中等、 较差”四个等级进行了评价,各类等级的含义如下。 好:漏洞分类法明确地符合该原则。 较好:漏洞分类法基本符合该原则,存在少数漏洞特例,在分类这些漏洞 时破坏了该原则,但对总体的分类结果影响较小。 中等:漏洞分类法仅仅部分符合该原则,存在较多的特殊漏洞,在分类时 破坏了该原则。 较差:漏洞分类法基本不符合该原则。 各种安全漏洞分类法的评价结果见表 2.1。事实上,影响安全漏洞分类的因素 非常复杂, 漏洞分类的视角、 目的和对象各有不同。 有的用于帮助建立漏洞数据库, 有的用于指导软件开发,有的用于安全测试,有的用于入侵检测。研究对象也包含 操作系统、 应用软件和 web 应用软件等等。 到目前为止尚未出现被广泛接受的清晰、24 华 中 科 技 大 学 博 士 学 位 论 文全面的理想分类方法。由于漏洞分类的复杂性,这样的理想分类方法也难以设计出 来。Bishop 研究了各种分类方法后,得出的结论是:不存在具有普遍适应性的最佳 漏洞分类方法,而应根据研究目标的不同来构建和使用不同的漏洞分类方法[69]。 本文通过研究,也得出类似的观点:虽然安全漏洞是普遍而广泛存在的,但是由于 各类软件安全特性和使用资源的不同,它们在实际应用中出现的安全漏洞有很大的 区别。例如在 web 应用软件中经常出现的命令注入、跨站点脚本和 session 劫持等 类型的漏洞,在单机应用软件和 c/s 结构的软件中较少出现。而传统的缓冲区溢出 漏洞却很少发生在利用.net 或 j2ee 技术开发的 web 应用软件中,因为它们是在一个 受限制的环境中运行的。因此,在无法做到大而全的情况下,根据研究目标和对象 的不同,针对某类研究中经常、广泛出现的大多数漏洞类型,设计有针对性的漏洞 分类方法,是较为合适且具有良好实践意义的。本文提出的基于环境和状态的分类 方法正是从这一观点出发,针对 web 应用软件的安全特性和测试需要来设计的。在 实践应用中, 它能较全面地分类 web 应用软件漏洞, 并有利于定位 web 应用软件中 的测试点,并设计对应的测试用例,具备良好的实用性。表 2.1 各种安全漏洞分类法的比较 比较项 Piessens分类法 Jiwnani分类法 Bazaz分类法 EAI分类法 本文提出的分类法 互斥性 中等 较好 较好 较好 较好 确定性 中等 中等 好 好 好 完备性 较好 较好 较差 中等 较好 适应性 扩展性 目的 好 (适用于所有软 较好 指导软件开发 件) 较差 (主要适用于 评估审计操 中等 操作系统) 作系统安全 较好 (适用于多数 测试和评估 较好 应用软件) 软件安全 较好 (适用于多数 软件安全漏 中等 应用软件) 洞测试 较差 (主要适用于 web应用软件 中等 web应用软件) 安全漏洞测试2.4实际分类示例与评估要评价漏洞分类方法的适用性, 可使用该方法对实际的 web 应用软件漏洞进行分类,以考察该分类方法能否清晰地、完整地分类所有漏洞。下面定义评价指标: 漏洞覆盖率。25 华 中 科 技 大 学 博 士 学 位 论 文定义2.7 设 F 为导致web应用软件产生安全问题的漏洞总数,Fc 为能够被错误模 型所分类的漏洞数,则 Fc 与 F 的比值称为漏洞覆盖率,记作 α , α = Fc / F 。 以下通过一个具体示例来示范使用本文提出的层次分类方法分类web应用软件安 全漏洞的过程,并与使用EAI方法分类的结果进行了对比。所分类的漏洞来自OWASP 的安全攻击数据库,共收集了96个漏洞。其中8个漏洞属于服务器软件缺陷、站点伪 造、网络窃听、密码分析和拒绝服务攻击等范畴,不在本文研究的范围内。除此之外 属于Web应用软件自身问题的漏洞共87个,分别使用本文提出的层次分类方法和EAI 模型对其进行了分类。使用层次分类方法的分类结果见表2.2,其中有一个漏洞无法分 类,它属于程序编码方面的错误,导致程序存在内存资源泄露的问题,因此将它列为“其它”类别。从表2.2结果可以计算得出层次分类方法的漏洞覆盖率为98.8%。表2.2 使用层次分类方法分类的结果 类别 数量 百分比 环境错误漏洞 58 66.7% 状态错误漏洞 28 32.2% 其它 1 1.1%在初步分类的基础上,对表 2.2 的结果进行了进一步的细分。对环境错误漏洞 分类的结果见表 2.3,对状态错误漏洞分类的结果见表 2.4。 从上述两个表的分类结果 可以看出,在环境错误漏洞中,与用户输入错误相关的漏洞占最大的比率,达到84.5%,这表明由于互联网的开放性,Web 应用软件的用户端使用环境非常复杂,编程人员对此考虑不足就容易产生漏洞。在状态错误漏洞中,与状态信息有关的漏 洞占最大比率,达到 75%,这反映了 Web 应用软件在内部状态信息的保护上较为 脆弱。表2.3 环境错误漏洞(共58个) 类别 数量 百分比 用户输入 49 84.5% 网络输入 7 12.1% 文件系统输入 2 3.4%26 华 中 科 技 大 学 博 士 学 位 论 文表2.4 状态错误漏洞(共28个) 类别 数量 百分比 状态信息修改 21 75% 原代码修改 5 17.9% 执行顺序打乱 2 7.1%为了进行对比,还使用EAI模型对漏洞库进行了分类,结果见表2.5。使用EAI模 型的分类时,有29个漏洞无法分类,漏洞覆盖率只达到了66.7%,远低于使用层次分 类模型分类时达到的98.8%的漏洞覆盖率。这是由于EAI模型只考虑环境实体发生错 误时对程序安全性的影响,而在WEB应用软件中,有较多的漏洞是由于内部实体发生 错误引起的,EAI模型对这类错误无法分类。由此可以看出,在使用错误注入的方法 来测试Web应用软件的安全性时,采用层次分类模型更为合适。表2.5 使用EAI模型分类的结果 类别 数量 百分比 直接环境错误漏洞 49 56.3% 间接环境错误漏洞 9 10.4% 其它 29 33.3%2.5小结在有关软件安全性的研究中,收集软件漏洞并进行分类分析是非常必要的。通过漏洞分类分析,可以掌握软件安全性问题的特点,了解各类漏洞的成因,以便有针对 性地进行测试和改进。从上世纪70年代美国率先启动计算机安全研究以来,国内外许 多学者从不同的角度,出于不同的应用目的提出了较多的漏洞分类方法。而对于web 应用软件安全性测试而言,从错误注入的角度来进行安全漏洞分类是较为合适的。但 是,传统的用于软件安全性测试的环境错误注入模型并不适用于Web应用软件的安全 性测试。这是因为web应用软件的安全性不仅易于受到环境错误的影响,也同样容易 受到软件内部运行状态错误的影响。为此,本文提出了一种基于环境和状态错误的漏 洞分类方法,设计了用于进行web应用软件漏洞编码的分类树,以便对相关漏洞进行 编码。随后对一些重要的漏洞类型进行了定义和分析。最后,对比分析了近年来出现 的几种新的漏洞分类方法和本文提出的漏洞分类方法,讨论了各自的优缺点。使用本 文提出的漏洞分类方法进行了漏洞的实际分类。其结果表明,本文提出的漏洞分类方27 华 中 科 技 大 学 博 士 学 位 论 文法能有效地分类web应用软件安全漏洞,对于所搜集到的87个web应用软件漏洞,能正 确分类其中的86个;而使用传统的EAI模型仅能分类其中的58个。其原因是EAI模型仅 能分类环境错误,而很多web应用软件漏洞是因为状态错误引起的。因此,在使用错 误注入的方法来测试web应用软件的安全性时,使用本文提出的基于环境和状态错误 的漏洞分类方法更为合适。未来的研究工作,将致力于建立一个基于层次分类方法的web应用软件安全漏洞库。28 华 中 科 技 大 学 博 士 学 位 论 文 3 一种 Web 应用软件安全性测试模型通过对已知的各种web应用软件安全漏洞进行收集、 整理和分类, 得出的结论是, 从错误注入的角度来看,web应用软件的安全漏洞主要由两类错误引发:环境错误和 状态错误。则在web应用软件安全性测试工作中,可以根据上述结论来指导错误注入 点的判定,并生成需要的注入错误。根据上述思路,本文提出了一种基于环境与状态 错误注入的安全性测试模型――EAS错误注入测试模型(Environment and Status FaultModel), 对模型进行了形式化定义, 研究了模型的注入点判定规则库和错误构造算子,提出了基于该模型进行安全性测试的执行机制,并进行了实验和分析。3.1EAS 错误注入测试模型web应用软件容易产生安全漏洞的根本原因在于其运行环境和运行状态都具有共享的特性。运行环境的共享特性较为明显,web应用软件的客户端是浏览器中的页面, 任何可以登陆互联网的用户都可以访问并使用,并可以进行各种程序员意想不到的输 入。在服务器端,除应用程序本身外,其它程序或用户也能访问环境实体并对其做出 改变,例如修改引用文件的属性或更改数据库数据等。 与普通应用程序不同的是,web应用软件的很多内部实体也具有共享的特性。普 通应用程序的内部变量、数据都保存在内存中,由操作系统对进程空间进行保护,恶 意用户难以访问、跟踪和更改。而Web应用软件的运行状态数据一部分会保存在客户 端的网页中或硬盘上。 普通应用程序的原代码经过编译, 用户修改原代码的难度较大, 而web应用软件的原代码以文本字符直接暴露给用户,即使是页面上经过编译的java 小程序,也很容易被反编译为原代码。普通应用程序的客户界面会控制程序流程,而web应用软件以一系列的页面请求作为执行流程,其执行顺序很容易被打乱。因此web应用软件的内部实体也可以视为共享资源。很多程序员在设计代码时,容易忽略这种 共享特性,而总是假设程序所访问的内外部资源保持在起初所设定的状态,没有进行29 华 中 科 技 大 学 博 士 学 位 论 文必要的校验并进行错误处理,导致程序无法适应恶意用户制造的环境错误或状态错 误,出现安全问题。 错误注入方法用于安全性测试的本质是把web应用软件的安全性测试转化为容错 系统测试,当程序能容忍错误的出现而不产生安全问题时,可认为它是安全的;当运 行环境或内部状态发生错误,程序不能适应而产生安全问题时,则认为其存在安全漏 洞。因此,要测试web应用软件的安全漏洞,可以根据引发漏洞的不同错误类型的特 性,人为地构造相关错误并注入到软件中,触发潜在的漏洞。为此定义基于环境与状 态的错误注入测试模型如下。 定义3.1 EAS错误注入测试模型定义为一个三元组{L,C,F},用于测试web应用软 件 f : I ? E ? 2T ∪ D 的安全性。 ?→ 其中L为错误注入点集合, 错误注入点指通过分析源 代码而确定的软件中应注入错误的位置; C 为注入的状态错误和环境错误集合,C ? E f ∪ I f ; F 为 向 web 应 用 软 件 f 注 入 错 误 并 运 行 后 的 输 出 集 , F = { f (ai ) | ai ∈ C , i = 1,2,3.....# C} 。根据上述定义,错误注入测试的过程可描述为:对于任一给定的注入点 Li ,注入 错误 ai 后,生成输出 f (ai ) ,如果 f (ai ) ∈ VE ,则该注入点处存在环境错误漏洞;如 果 f (ai ) ∈ VI ,则该注入点处存在状态错误漏洞;如果 f (ai ) ? VI ∪ VE ,则不存在漏 洞,继续测试下一注入点。EAS错误注入测试模型包含了环境错误注入和状态错误注入两类方法。环境错误注入的途径如图3.1所示,环境错误由外部实体传导进入web应用软件内部。测试 人员将外部实体设置为非正常状态,被应用程序读取或操作后产生错误,从而引发 漏洞。需要注入的环境错误主要有三类,即用户界面输入错误、网络输入错误和文 件系统输入错误。常见的用户输入错误有SQL注入、命令注入、跨站点脚本(XSS) 、Xpath注入、LDAP注入、URL编码、SSI注入、暴力猜测认证信息、缓冲区溢出错误等。文件系统输入错误的注入主要是针对WEB应用软件在包含、读取资源文件或者 创建、修改、执行外部文件时,对文件在名称、路径、权限或内容等属性上设置错30 华 中 科 技 大 学 博 士 学 位 论 文误。网络输入错误的注入主要是在软件创建网络连接,或分析网络协议信息时,修 改协议信息,或修改各类服务器的反馈信息,看软件能否正确处理。页面 1 内部实体 程 序 执 行 页面 3 内部实体 页面 2外部实体 测 外部实体 试 人 员 外部实体…………… Web 应用程序 运行环境图3.1 环境错误注入途径状态错误注入的途径如图3.2所示,状态错误由测试人员直接注入程序,不需要通 过外部实体的传导。状态错误注入web应用软件的主要途径有三种,一是测试人员直 接修改程序的内部变量如隐藏表单变量、cookies、会话ID标识符、URL参数等等;二 是测试人员直接修改程序在客户端的运行代码,使程序的运行状态发生改变;三是测 试人员故意打乱程序的执行顺序。页面 1 内部实体 程 序 执 行 页面 3 页面 2修改状态测 试修改代码 修改顺序人 员…………… Web 应用程序 运行环境图3.2 状态错误注入途径31 华 中 科 技 大 学 博 士 学 位 论 文3.23.2.1基于 EAS 错误注入测试模型的安全漏洞测试技术错误注入测试的特点使用EAS错误注入测试模型进行web应用软件安全漏洞测试时,其关键技术是确 定软件中的错误注入点,并针对该注入点生成相应的错误注入测试用例。下面分别讨 论环境错误注入和状态错误注入方法在判断注入点和生成测试用例方面的特点。 环境错误注入:当web应用软件从环境获取输入或直接操纵某个环境实体时, 该环境实体即成为环境错误的注入点。例如,当web应用软件需要接受用户的 输入来进行认证或查询时,或者web应用软件直接包含、执行某个文件时,该 用户输入或文件就成为环境错误的注入点。关于错误注入的测试用例,一种 简便的方法是随机注入错误[70,71],但这样会导致测试用例的数量过于庞大, 影 响测试效率。通过对web应用软件安全漏洞的分析,可以发现容易导致安全问 题的环境错误具有一定的模式和规律,该模式可以根据环境实体在程序内部 的用途不同来确定。例如,当用户的输入用于动态构造一个SQL查询时,输入 数据中的SQL注入错误就容易导致安全问题; 当用户输入的数据被包含在输出 页面中时,跨站点脚本错误就容易导致安全问题。 状态错误注入:对应于状态错误的三种类型, 状态错误的注入点有三种情况, 一是当web应用软件将程序运行状态信息在客户端和服务器端进行传输时, 该 运行状态信息成为注入点; 二是当web应用客户端代码用于检验或限制用户输 入数据时,或者包含了用于认证的算法或密码时,该原代码成为注入点;三 是当web应用软件通过一系列有顺序的步骤来执行与用户交互的任务时, 该任 务的执行顺序成为注入点。与环境错误一样,不同类型的状态错误注入点也 对应着特定模式的状态错误。 从以上讨论可知,对于EAS模型{L,C,F},需要研究生成错误注入点集合L和错误集 合C的方法。同时还需确定它们之间的对应关系,即对于任一元素 li ∈ L ,需要确定对 应的集合 C ' ? C , 然后生成错误注入点 li 的测试结果集{ f (ai ) | ai ∈ C ' , i = 1,2,3....# C ' }。32 华 中 科 技 大 学 博 士 学 位 论 文通过第2章对漏洞的分类讨论, 可以归纳得出错误注入点判定规则库, 从而确定集合L。 同时,还需研究错误构造算子,以生成合适的错误注入测试用例。 3.2.2 错误注入点判定规则库通过前面对web应用软件运行特点和各类web应用软件漏洞的分析,可以总结出web应用软件中各种可能存在安全问题的编码模式,从而归纳出错误注入点判定规则,形成判定规则库。下面具体描述各判定规则。 (1)判定规则:U-SQL 类别:用户输入错误注入点 描述:当web应用软件读取用户输入,并且在后面用该用户输入作为软件生成的SQL查询语句的一部分时,该读取输入语句成为错误注入点。(2)判定规则:U-COM 类别:用户输入错误注入点 描述:当web应用软件读取用户输入,在后面代码中调用系统外部命令,且将该 用户输入作为参数传递给被调用的外部命令时,该读取输入语句成为错误注入点。 (3)判定规则:U-XSS 类别:用户输入错误注入点 描述: web应用软件读取用户输入, 当 并且将该用户输入作为软件动态生成的html 页面的一部分,输出到客户端时,该读取输入语句成为错误注入点。 (4)判定规则:U-FIL 类别:用户输入错误注入点 描述:当web应用软件读取用户输入,并且利用该用户输入来构建文件名,随后 在系统中操作该文件时,该读取输入语句成为错误注入点。 (5)判定规则:U-XPA 类别:用户输入错误注入点 描述:当web应用软件读取用户输入,并且将该用户输入作为软件动态生成的Xpath查询语句的一部分,进行xpath查询时,该读取输入语句成为错误注入点。33 华 中 科 技 大 学 博 士 学 位 论 文(6)判定规则:U-LDA 类别:用户输入错误注入点 描述:当web应用软件读取用户输入,并且将该用户输入插入到软件动态生成的LDAP查询语句中,进行LDAP查询时,该读取输入语句成为错误注入点。(7)判定规则:U-SSI 类别:用户输入错误注入点 描述:当web应用软件支持SSI功能,读取用户输入,并且将该用户输入作为SSI 命令的参数时,该读取输入语句成为错误注入点。 (8)判定规则:U-PAS 类别:用户输入错误注入点 描述:当web应用软件读取用户输入,并且将该用户输入的信息用于对用户身份 认证时,该读取输入语句成为错误注入点。 (9)判定规则:U-CON 类别:用户输入错误注入点 描述:当web应用软件读取用户输入,并且将该用户输入的信息存入用户的配置 文件中时,该读取输入语句成为错误注入点。 (10)判定规则:F-INC 类别:文件系统输入错误注入点 描述:当web应用软件包含外部文件时,该包含语句成为错误注入点。 (11)判定规则:F-MAN 类别:文件系统输入错误注入点 描述:当web应用软件执行文件操作语句,进行文件的读取、创建、修改或执行 操作时,该操作语句成为错误注入点。 (12)判定规则:N-NET 类别:网络系统输入错误注入点 描述:当web应用软件创建网络连接与其他应用程序通信时,该网络操作语句成 为错误注入点。34 华 中 科 技 大 学 博 士 学 位 论 文(13)判定规则:N-HTT 类别:网络系统输入错误注入点 描述:当web应用软件读取http请求报文头,并利用请求报文头中的参数生成http 应答报文头时,该请求报文头参数读取语句成为错误注入点。 (14)判定规则:I-HID 类别:状态信息错误注入点 描述:当web应用软件读取表单中隐含控件内的信息时,该读取语句成为错误注 入点。 (15)判定规则:I-REF 类别:状态信息错误注入点 描述:当web应用软件读取保留在URL参数中的状态信息时,该读取语句成为错 误注入点。 (16)判定规则:I-COK 类别:状态信息错误注入点 描述:当web应用软件读取保留在cookies中的状态信息时,该读取语句成为错误 注入点。(17)判定规则:C-HTM类别:源代码错误注入点 描述:当web应用软件输出html代码,且该代码用于列举数据供用户选择输入时, 该html代码成为错误注入点。(18)判定规则:C-SCR类别:源代码错误注入点 描述:当web应用软件输出vbscript、javascript等页面脚本代码,且该代码用于用 于检验用户数据的输入范围或有效性时,该脚本代码成为错误注入点。(19)判定规则:C-APP类别:源代码错误注入点 描述:当web应用软件输出用于在客户端执行的移动代码(例如Applet),且该代码35 华 中 科 技 大 学 博 士 学 位 论 文用于数据验证、加解密和身份认证时,该移动代码成为错误注入点。(20)判定规则:S-SEQ类别:执行顺序错误注入点 描述:当web应用软件执行某个由一系列页面请求组成的任务,且该任务对执行 顺序有严格要求时,这一系列的页面请求成为错误注入点。 通过应用上述20个判定规则进行判断,可基本覆盖绝大部分类型的错误注入点。 在确定注入点后,必须根据注入点的类型来生成该点需要注入的错误集,其中每一个 需要注入的错误就是一个错误注入测试用例。接下来定义一些错误构造算子,用于生 成错误注入测试用例。 3.2.3 错误构造算子 错误构造算子 ? 是指生成环境与状态错误注入测试用例的规则。对于定义3.2任一错误注入点 L i ,可以适当选用某个错误构造算子 ? i ,生成该点需要注入的错 误集合,即测试用例集{ a 1 ,a 2 ,a 3 ...a n1 |a n1 ∈ I f 定义3.3∪ E f }。错误构造算子可以进行复合运算,记为 ? 。构造算子 ? 1 与 ? 2 复合运算后生成新算子 ? 1 ? ? 2 ,表示用算子 ? 1 处理由算子 ? 2 生成的测试用例,从而生 成新的测试用例。 设计错误构造算子的关键在于根据错误注入点的特性来构造最有效的测试用 例,使其能够尽可能地引发web应用软件的安全漏洞。由错误构造算子生成的测试用 例主要是非正常的数据,但也可能包含一些非正常的操作,例如当测试执行顺序漏 洞时,就需要采用一系列非正常操作。通过对各种web应用软件漏洞的分析,以及对 攻击者利用漏洞入侵系统的各种手段的研究,可以归纳出有效的错误构造算子,并 利用算子的复合运算来表示一些复杂的测试用例生成规则。错误构造算子见表3.1。 随着对web技术的进一步发展,对于新出现的漏洞类型,可以设计新的算子加入到该 表中。36 华 中 科 技 大 学 博 士 学 位 论 文表3.1 错误构造算子 算子 生成规则 在数据中加入SQL语句 在数据中加入系统命令 超长数据串 在数据中加入脚本语言 在数据中加入文件路径 在数据中加入http链接 在数据中加入Xpath查询 在数据中加入Ldap查询 在数据中加入SSI命令 在数据中加入http报文头 暴力猜测 在数据中加入分隔符 修改文件属性 修改网络属性 修改html代码 修改脚本代码 修改applet 打乱执行顺序 对敏感字符进行重编码 例子描述 &name' OR 'a'='a&、&hacker'); DELETE FROM --&等 &;rm -rf /&、“Story. ls”等 构造长字符串“BBBB……(256个、 512个、 1024 个等等)” &SCRIPT&alert(/attack!/)&/SCRIPT&等等 “../../../cmd.exe?/c+dir+c:\”、 ”c:\windows\ system \addusr.exe”等 “http://www.romote.com/evil.asp” “blah' or 1=1 or 'a'='a” “jonys) (| (password = * ) )” “& !--#exec cmd=&cd C:\admin\dir&&” “&john\r\nHTTP/1.1 200 OK\r\n...” 构造数据字典进行账号、用户猜测。 “|john|account|password|”,还可以用“;”、“:”等 分隔符 修改程序操作的文件的属性,包括文件名、路 径、权限等等。 对IP地址、域名或DNS回复报文等的长度和格 式进行修改。 如增加非正常选项:&option value=-3&count&/option&等 删除页面脚本代码中对用户输入进行限制的 部分。 反编译或修改applet,搜索敏感信息,去掉对 用户输入的限制。 对于软件中规定的任务 ( p1 , p2 , p3 ...., pn ) ,执 行 ( p1 , p 3 , p 2 ...., p n ) 或 ( p1 , p 2 ...., p n ) 等 “..%c0%af..%c0%af../winnt/system32/cmd.exe?/ c+dir”? sql ? com? lon ? scr? fil ? url ? xpa ? lda? ssi ? htt? rep ? con ? mod ? net? htm ? scr? app ? seq ? cod37 华 中 科 技 大 学 博 士 学 位 论 文运用表3.1中的错误构造算子,可以针对不同的注入点来构造错误注入测试用例 集。通常对一个错误注入点要根据其特性综合运用不同的错误构造算子来生成测试 用例集,以保障测试的充分性。表3.1中的错误构造算子 ? cod 的主要作用是与其他算 子复合生成新的算子,以测试软件是否对敏感字符的重编码进行了检测。错误注入 点与错误构造算子的对应关系见表3.2,表3.2还给出了对一个错误注入点进行测试 时,对其结果进行分析以判定是否存在安全漏洞的准则。表3.2 为不同错误注入点生成测试用例 错误注入点类型 U-SQL U-COM U-XSS U-FIL U-XPA U-LDA U-SSI 错误构造算子 漏洞判定准则 如果软件执行用户在数据中嵌入的sql语 句,则存在漏洞 如果软件执行用户在数据中嵌入的系统 命令,则存在漏洞 如果软件输出用户输入的恶意页面脚 本,则存在漏洞 如果软件操作了用户指定的恶意文件, 则存在漏洞 如果软件执行用户在数据中嵌入的 xpath语句,则存在漏洞 如果软件执行用户在数据中嵌入的 xpath语句,则存在漏洞 如果软件执行用户在数据中嵌入的SSI 命令,则存在漏洞 如果软件接受用户的大量错误输入,未 进行限制或对错误做出反馈而泄露重要 信息,则存在漏洞 如果软件接受用户输入的恶意分隔符, 改变了配置文件结构,则存在漏洞 如果软件出现异常、崩溃或者包含了不 正确的文件,则存在漏洞 如果软件出现异常、崩溃,或者执行、 修改了不正确的文件,则存在漏洞 如果软件出现异常或建立了不正确的网 络连接,则存在漏洞。 如果软件输出用户构造的恶意应答报文 头,则存在漏洞。? sql 、 ? cod ? ? sql ? com 、? cod ? ? com 、? lon? scr 、 ? cod ? ? scr? fil 、 ? cod ? ? fil ? xpa 、 ? cod ? ? xpa? lda 、 ? cod ? ? lda? ssi 、 ? cod ? ? ssi ? repU-PASU-CON F-INC F-MAN N-NET N-HTT? con 、 ? cod ? ? con? mod ? mod? net? htt38 华 中 科 技 大 学 博 士 学 位 论 文表3.2 为不同错误注入点生成测试用例(续表) 错误注入点类型 错误构造算子 漏洞判定准则 如果软件未对表单隐含控件中数据的 恶意字符、语句或者命令进行过滤,则 存在漏洞。 如果软件未对URL参数中的恶意字符、 语句或者命令进行过滤,则存在漏洞。 如果软件未对cookies值中的恶意字符、 语句或者命令进行过滤,则存在漏洞。 如果软件接受了被修改的html选项,则 存在漏洞。 如果软件因页面脚本被修改而接受了 超出限制范围的数据,则存在漏洞。 如果软件在客户端的applet中包含了账 号等敏感信息,或因applet被修改而接 受限制数据,则存在漏洞。 如果软件不能识别错误的页面请求顺 序,则存在漏洞。I-HID? sql 、 ? scr 、 ? lon 、 ? con ? com 、 ? scr 、 ? fil 、 ? url? sql 、 ? con 、 ? httI-REF I-COK C-HTM C-SCR? htm ? scr? appC-APPS-SEQ? seq3.2.4测试效果的评价Web应用软件安全性测试的目的是尽可能多地找出软件中存在的安全漏洞,提高软件的安全性。显然,聘用的测试人员越有经验,投入测试的人力和时间越多,测试 的质量越高,软件的安全性越有保证。然而,考虑到成本因素,必须确定何时应终止 测试[72]。在传统的错误注入方法中,对测试充分性的评价是通过注入错误总数和覆 盖的错误注入点数量来衡量的。本文在此基础上,定义容错率和注入率两个指标来进 行综合评价。 定义3.4 设 n 为注入错误的总数, nt 为注入后软件未产生安全问题的错误数,nt 与 n 之比称为容错率,记作 ω , ω = nt / n 。定义3.5 设 m 为被测试软件中错误注入点的总数, m j 为已经注入错误的注入点 的数量, m j 与 m 之比称为注入率,记作 υ , υ = m j / m 。 那么当容错率的数值越大时,可以认为软件越安全;当注入率越大时,测试结39 华 中 科 技 大 学 博 士 学 位 论 文果越可靠。综合这两个指标,在注入率满足对测试可靠性要求的前提下,容错率越 高,软件越安全。例如,在制定测试计划时可以设定,当注入率达到95%时,停止测 试,此时可以计算容错率,以评价该软件的安全性。 3.2.5 EAS 错误注入测试技术在使用EAS模型进行安全性测试时,

我要回帖

更多关于 密码修改 的文章

 

随机推荐