标题：安全漏洞追踪
安全漏洞追踪
作　者：（美）盖弗（Gallagher,T.），（美）詹弗瑞斯（Jeffries,B.），（美）兰德（Landauer,L.）
译者：钟力，朱敏，何金勇 
出 版 社： 电子工业出版社
出版时间： 2008-11-1
页　数： 532页
开　本： 16开
I S B N ： 9787121073717 
分类： 图书 >> 计算机/网络 >>网络安全 
定价：￥65.00
编辑推荐
软件安全一直在快速地发展，未来我们将面临今天所不知道的危险攻击，本书主要讨论以攻击者的角度、采用攻击者的方法进行安全测试的步骤，以促进大家的测试工作，从而开发出更好的软件。 
本书共20章，前三章介绍了此书的背景信息，第4、5章解释了网络流量是如何被操控的，第8、9章阐述了攻击者是如何通过直接操控内存来执行任意代码的，第18、19章阐述了各种各样的再利用攻击。最后的一系列工具和一份安全测试用例列表中包含了一些适用于初学者的基本测试用例。书中绝大部分章节在开始处都有一个高度概括的概要，在结尾处会总结一些精炼的测试技巧。有些章节也包含了一些走查，你可以在自己的计算机上尝试这些步骤。 
本书适用于软件测试人员、软件开发人员、学生、渗透测试人员。.
作者简介
Tom Gallagher，微软Office安全测试组负责人，擅长渗透测试、编写安全测试工具和安全培训。
宣传语

•一本难得的面向安全测试的好书
•我们必须培养一类新型的测试员——一种能像恶意攻击者那样思考的人——一种基于白盒和黑盒测试基础的通过攻击来追踪安全漏洞的人。——微软主席兼软件体系结构首席执行官 比尔•盖茨
内 容 简 介

这是一本针对安全测试的书籍，同时也是一本十分适合信息安全研究人员的优秀参考书。本书共20章，其中前3章讨论了安全测试的基础，包括如何从攻击者的角度去思考测试方法，以及如何进行威胁建模和入口点查找。第4章至第19章则通过详细的示例与代码，分别深入地阐述了网络流量和内存数据的操控方法，包括缓冲区溢出、格式化字符串、HTML脚本、XML、规范化、权限、拒绝服务、托管代码、SQL注入和ActiveX再利用等安全漏洞追踪方法，以及在二进制代码条件下查找安全漏洞的逆向工程技术。第20章论述了合理报告安全漏洞的程序，并提出了一个负责的安全漏洞公开流程。最后，本书还提供了一个适于初学者的测试用例列表。
推 荐 序

当Jesse James——美国西部著名的歹徒被问到他为什么抢劫银行时，他回答道：“钱在那！”同样地，任何一个可能雇佣你作为安全测试员的现代公司，在它的内部网络上都有着非常重要的资产，同时心怀恶意的人将会试图进入内部网络并窃取那些资产。无论你测试的是哪种软件——内部使用的、外部网站的或现成的商业软件——总会有人有目的地攻击你的产品。改善应用程序的安全涉及设计人员、开发人员和测试人员，而且，安全测试人员的角色是不能被低估的。
有那么多关于软件安全的书，为什么要读这本书呢？我认识很多在微软公司和比较大的安全协会中能查找安全缺陷的人，但Tom Gallagher和Lawrence Landauer的工作我非常了解，他们是最优秀的和表达最清楚的人中的两位。在微软Office可信计算小组（The Microsoft Office Trustworthy Computing team）中，有一些在行业中最好的安全测试人员。Tom、Lawrence和他们的朋友及合著者Bryan Jeffries都极富经验，并且知识渊博。在本书中他们提供的信息将会使你更深层次地认识安全测试。
来看看到目前为止已经在其他书中探讨过的主题，比如《黑客大曝光（Hacking Exposed）》和《Assessing Network Security》。这些书很好地揭示了网络黑客和从事网络安全评估的人所使用的技术。如果你的工作是开发更安全的软件，那么它们会是很有用的信息，能帮助你看到那些很容易受到黑客攻击的缺陷。但是，虽然掌握这种知识是好事，但它们并不能帮助你快速、有效、系统地查找安全问题。而这就是本书将要讨论的主题。
有些人的工作就是在其他人的产品中查找安全缺陷，其中一个最有创造性的人就是Greg Hoglund。他的书《Exploiting Software》（2004年，与Gary McGraw合著，Addison-Wesley公司出版）对在此行业中对最优秀的、最具有创造性的人是如何查找漏洞的给予了一些很好的阐述。但Greg没有源代码，也没有询问开发人员，所以他采用了一个不同的方法。正如Tom简短的解释：安全行业的超级明星每年仅能发现和公布非常少的问题。当我在互联网安全系统的X-Force组（Internet Security System’s X-Force）管理漏洞搜寻人员时，该组中最优秀的人每个月做得好的话能够发现一个或两个严重的安全问题。一个专业的软件测试人员不会奢侈到花费这么长时间来查找如此少的漏洞，同时，大多数阅读本书的人还要负责功能特性的测试，这会进一步地限制了他们的时间。你可以把本书作为一种资源来帮助你理顺和加强安全测试进程。
也许你更关心那些受公司防火墙保护的内部运行的软件。如果公司的网络相当大，那么最安全的设想就是将内部网络当作一个半公开、半敌对的网络来对待。大多数的公司已经犯下了雇佣错误，同时内部安全的不足会允许心怀不满或恶意的雇员做许多坏事。尽管由内部人员发起的内部攻击比来自外部网络的攻击要少得多，但是他们攻击成功的可能性要大得多，并且能造成更严重的伤害。我也曾看到过一些内部的、在线交易应用程序的例子，它使大公司的网络变得不安全。如果攻击者找到了系统所在，那将会有很多问题。大网络之外具有一定熟练程度的攻击者想达到这个目的是极度困难且代价不菲的。
你为什么需要学习安全呢？由安全漏洞导致的损失已经非常严重。如果你正在为微软公司或者另外一家大的软件厂商工作，你就会看到安全问题对你的客户和公司的影响。对你和你的客户来说，花费时间修补已经售出的软件比在软件发行前发现漏洞的代价要昂贵得多。在经历了系统崩溃和其他一些损失后，如果厂商不在产品发行前找到并修补安全缺陷的话，客户几乎不可能从他们那再购买软件。
更糟的是，这种形势正变得更加具有挑战性。攻击者可利用的工具正变得更加完善且更容易使用。在90年代中期，需要非常专业的开发人员编写把缓冲区溢出变成可利用程序的汇编代码。近几年来，许多优秀的安全审计小组都有一个或多个人在渗透测试期间编写漏洞利用程序来攻击定制的软件。现在，一个点选式（point-and-click）的网站能产生针对多种操作系统的漏洞利用代码，克服了许多用户输入方面的限制，通常会很容易地把开发人员的错误变成可利用的条件。
在攻击者可得到的资源变得更加全面的时候，攻击者也变得越来越全面。很多年以前，闯入计算机的人一般不会破坏任何东西或他们可能仅仅恶作剧一下。因为互联网上并没有多少计算机，而且被侵入的计算机也没有什么有趣的东西，所以在攻击者中产生了一套道德规范。人们会写一些带有政治口号或者只会引起一点点小麻烦的病毒。真正有破坏性的病毒是非常罕见的。
现今，有人控制了大量的计算机形成“僵尸”大军。为了获取金钱，有人编写复杂的间谍软件而不是病毒。如今攻击者的目标通常是金钱，社会上甚至存在着从商业网站偷取信用卡的市场需求。位于日本东京的一家安全公司——Little Earth Corporation——最近对一百多个商业网站进行了评估，发现具有严重安全问题的网站比安全网站要多得多。尽管开发操作系统和Web服务器的开发人员做了大量工作，但如果建立在那些安全平台上的软件是不安全的，那么客户的数据和公司的声誉就会存在风险。
为了充分保护你的客户，请阅读本书吧！
David LeBlanc
2006年4月
译 者 序

本书是一本难得的面向安全测试的好书，凝聚了作者在该领域渊博的知识和丰富的经验。前三章是本书讨论内容的基础，第1章提出了安全测试的基本思路和方法，认为从攻击者的角度去思考如何进行安全测试，是目前最有效的方法；第2章讨论了威胁模型在安全测试中的关键作用，指出理解软件工作机制和数据流程图，列举数据的入口点和退出点，分析潜在的威胁和数据处理点，是威胁建模的重要内容；第3章则介绍了常见的入口点及其查找方法。第4章至第19章分别针对不同的主题进行深入的阐述，内容涉及如何对网络流量和内存等数据进行操控，缓冲区溢出、格式化字符串、HTML脚本、XML、规范化、权限、拒绝服务、托管代码、SQL注入和ActiveX再利用中的安全漏洞及其测试方法，以及怎样在二进制代码条件下进行逆向工程来查找安全漏洞。第20章讨论了合理报告安全漏洞的程序，并提出了一个负责的漏洞公开流程。最后，附录A和附录B给出了本书引用的相关工具列表和适于初学者的测试用例列表。
本书最大的特点就是“广”和“实”。它探讨了几乎所有的软件存在安全漏洞的地方，覆盖面非常宽；而且，对每一个主题都进行了深入的分析，给出明确的指导和具体的实例。该书不但能够很好地直接用于安全测试，同时对于从事信息安全研究的技术人员来说，也不失为一本优秀的参考书。
我们成立了一个10人组成的团队来翻译这本书。除前言和第3章由大家共同翻译之外，王中锋翻译了第4、5、6章，朱敏翻译了第7、8章，唐云翻译了第9、12章，何金勇翻译了第10、11章，阮强翻译了第12、13、14章，李蒙翻译了第15章，张金祥翻译了第16、17章，张志鹏翻译了第18、19章，韦朋辉翻译了附录A和附录B，我翻译了第1、2、20章，并对本书进行了全文校对。在这里，我十分感谢大家的辛勤劳动，正是由于每个人的努力付出，本书的翻译工作才得以顺利完成。在翻译过程中，我尽量兼顾每位成员所擅长的研究方向和工作经验，但由于本书非常全面，有些领域我们涉猎不深，再加上时间紧迫，水平有限，所以翻译难免有误，敬请读者谅解。另外，在本书的翻译过程中，得到了出版社的大力支持，在此表示衷心的感谢。
钟 力 
2008年8月8日
前 言

你可能想知道微软为什么要出版这样一本关于安全测试的书，因为加强软件安全是一件非常困难的事情。当然，微软已经遇到过相当多的软件安全问题，因而有大量的经验供测试人员参考。在2002年可信计算计划被提出之前，我们就已经在微软工作了。自微软实施该计划以来，我们已经看到微软在处理安全问题方面的重大改变。现在，安全问题已经不仅仅是安全专家的职责，已经成为了我们每一个人的责任。这本具有创见性的关于软件安全测试的书，源于我们在微软的工作经验以及为开发出用户购买后能持续安全可靠运行的软件而做出的努力。
应用软件的安全并不仅仅局限于使用安全技术的功能特征，以及像加密和账户管理这样的功能特征。我们必须认真考虑一个产品的每个功能特征的安全。鉴于此，在微软工作的每个项目管理人员、开发人员、测试人员和相关技术人员都有责任保证软件尽可能安全。本书认为安全是每个人的责任，并且重点向测试人员提供用来发现软件功能安全漏洞的信息，这些安全漏洞都可能是难以发现的。
本书没有阐述这些漏洞应该如何修补。其他的一些书，如Michael Howard和David LeBlanc所写的《Writing Secure Code》（微软出版社，2002年）是一本从编写代码的角度阐述如何修补和防止安全漏洞的优秀参考书。
微软因为发布了含有安全缺陷的软件而经历了一些惨痛的教训，后来微软不得不通过安全更新来修补这些缺陷。本书描述了现在许多软件中存在的安全问题，并包含了一些已经带来损失的漏洞信息，以及我们在产品发布前自己发现的一些漏洞信息。我们希望你能从我们的经验中学到知识，从而在发布自己的软件时防止产生类似的安全漏洞。
在本书中，我们把能够被另外一名用户控制的数据称为“攻击者已控数据（Attacker Controlled Data）”。我们这么做，是要让你不仅意识到应用程序所操作的数据有可能来自攻击者，还应该树立攻击者的意识，认识到你也能控制这些数据。我们鼓励你不但要像攻击者那样带有恶意的想法去思考，而且在测试软件时还要扮演攻击者，攻击你自己的系统，以此来帮助公司发现软件的安全漏洞。
本书的目的就是为了促进你的测试工作，能够开发出更好的软件，而不是让你攻击其他人的软件，或者利用攻击者的恶意想法或技术去分析不属于你测试范围的软件。本书是一本为白帽黑客而写的书。
软件安全一直在快速地发展。未来我们将面临今天所不知道的危险攻击。但是无论如何，本书讨论的以攻击者的角度、采用攻击者的方法进行安全测试的步骤，并不会发生太大的改变。
本书的读者对象
软件测试人员是此书的主要读者。下面列出的这些读者朋友因其工作性质，都能从本书中受益：
 软件测试人员：测试人员有责任全面了解他们所测试的功能特征工作原理的技术细节。软件测试时会用到这些技术细节。我们为测试人员展示了如何利用功能特性的测试知识来完成安全测试。我们在微软的测试机构工作过，曾经花费了几年的时间与软件测试人员在一起，帮助他们更好地理解如何在已进行功能特性测试的地方进行安全测试。在撰写本书的过程中，我们已向功能特性测试人员和安全专家寻求了反馈意见。
 软件开发人员：尽管此书并没有介绍如何构建和编写安全代码的知识，但它的确介绍了如何攻击软件。软件开发人员应该对这方面比较感兴趣，因为准确地理解攻击是如何进行的，开发人员就能更好地保护他们的应用软件。软件开发人员也能学到特定测试领域的知识，然后要求安全测试人员开发适用于这些测试领域的代码。
 学生：现在许多学校是不会讲授如何进行安全测试的相关知识。如果学生毕业以后，从事软件和信息技术领域的工作，可能会因为没有接受过安全测试的教育而感到手足无措。阅读此书的学生能够在设计、写作和配置安全软件等方面获取更多的技能。这些技能有助于他们找到工作并胜任工作。
 渗透测试人员：专业的渗透测试人员（也被称为安全测试专家）对于此书所要讨论的许多主题也许已经十分了解。很可能，书中一大段文章可以引起渗透测试人员探寻未知领域的兴趣。这本书包含了客户端和服务器应用程序。我们从该领域专家那里获知了信息和建议，这些专家可以是我们所讨论的某些技术的提出者，也可以是专注于安全测试技术的专家。
本书的组织结构
你可以按照章节顺序阅读此书。然而，本书中的许多章节都可以独立成篇。前三章介绍了此书的背景信息，是其他章节的基础。第4章“成为恶意的客户端”和第5章“成为恶意的服务器”解释了网络流量是如何被操控的，我们平时所讨论的许多攻击行为都需要操控网络流量。第8章“缓冲区溢出及堆栈/堆操纵”和第9章“格式化字符串攻击”一并阐述了攻击者是如何通过直接操控内存来执行任意代码的。第18章“ActiveX再利用攻击”和第19章“其他再利用攻击”阐述了各种各样的再利用攻击。在书的最后，你会看到一系列工具（附录 A）和一份安全测试用例列表（附录 B），其中包含了一些适用于初学者的基本测试用例。
书中绝大部分章节在开始处都有一个高度概括的概要，在结尾处会总结一些精炼的测试技巧。有些章节也包含了一些走查，你可以在自己的计算机上尝试这些步骤。
系统需求
你需要配置以下的硬件和软件来编译和运行书中提到的代码实例。
 Microsoft Windows XP with Service Pack 2, Microsoft Windows Server 2003 Service Pack 1或更高补丁版本
 Microsoft Visual Studio 2003标准版或Microsoft Visual Studio 2003专业版或以后版本
 600 MHz 奔腾或兼容处理器（推荐1GHz 奔腾处理器）
 192 MB 内存（推荐256 MB或更高）
 显示器（800 × 600或更高的分辨率）至少采用256色（推荐1024 × 768，16位色）
 微软鼠标或其兼容设备
技术更新
因为书中涉及的相关技术是不断更新的，更新的内容将被放在微软出版社的技术更新网页上，地址如下：
http://www.microsoft.com/mspress/updates/
定期访问该页面可以获取Visual Studio 2005和其他技术方面的更新。
代码实例及附带内容
本书包含了一些预先设计好的代码实例、附带工具和程序。书中讨论的所有代码实例和附带内容能在以下地址下载：
http://www.microsoft.com/mspress/companion/0-7356-2187-X/
本书技术支持
我们已尽最大努力来确保本书及附带内容的正确性。微软出版社通过以下网址为本书及附带内容提供技术支持：
http://www.microsoft.com/learning/support/books
问题与评论
如果你对本书及附带内容有任何评论、问题或建议，或者你的问题在上述网址中没有找到解答，请发E-mail至bn@phei.com.cn。
致谢

我们非常感谢为本书内容提供了想法、技术见解和其他反馈意见的人士。以下人士慷慨地贡献了他们的时间无偿审阅了此书的部分章节，这些人士是：Atin Bansal、Srijan Chakraborty、Shawn Farkas、Stephen Fisher、Greg Foltz、Raul Garcia、Greg Hartrell、Eric Jarvi、Chris Jeuell、Hidetake Jo、Akhil Kaza、Ariel Kirsman、Alex Krawarik、Secure Windows Initiative Team的John Lambert、Web Services Team的John Lambert、Ivan Medvedev、Bala Neerumalla、Maurice Prather、Walter Pullen、Yong Qu、David Ross、Micky Snir、Peter Torr、Ambrose Treacy、Don Willits和Oleh Yuschuk。
以下人士的付出应受到特别的赞誉：微软安全响应中心（Microsoft Security Response Center）的Christopher Edwards认真审阅了本书，并对第20章“报告安全漏洞”提供了反馈，Jason Geffner校对了第17章“观察及逆向工程”并提出了一些合理的建议。Sean Hunt和Mark Iler超出我们预期地审阅了本书的更多章节并提供了反馈意见。Alan Myrvold认真地审阅了本书几乎每一页，他同时也提出了很多评论和建议，提供了一些附加的信息资源。
本书谈到了两个由微软员工编写但未公开的工具，他们慷慨地允许我们把这些工具提供到本书的对应网址上。其中，MITM由Jiri Richter开发、ObjSD由Vikram Subramanian开发。这两个工具都十分有用。再次感谢他们允许我们公开这两个工具。同样感谢Mark Russinovich对Sysinternals工具问题的解答，以及对进程浏览器工具的细致修改。
特别感谢Imran Akhtar、Matt Cohen、 Grant George、David Hansen、 David LeBlanc、Mark Mortimore、Tara Roth和Matt Thomlinson，他们全力支持了我们的测试活动，为本书提出了宝贵建议。David LeBlanc更是帮助我们描述了安全测试的重要性。感谢Ben Ryan(策划编辑)、Kathleen Atkins（项目编辑）、Christina Palaia（文字编辑）、William Teel（美工）和Chris Weber（技术编辑），为了使本书更易懂、语法更准确、技术更精确，他们做了大量的工作。
目 录

第1章 安全测试的一般方法 1
1.1 安全测试人员的不同类型 2
1.2 一种安全测试的方法 3
1.2.1 深入理解测试的内容 4
1.2.2 从攻击者的角度思考如何攻击目标 6
1.2.3 攻击产品 8
1.2.4 时刻关注新的攻击 8
1.3 小结 9
第2章 利用威胁模型进行安全测试 10
2.1 威胁建模 10
2.2 测试人员如何对威胁模型分级 11
2.3 数据流程图 12
2.4 入口点和退出点的安全 13
2.5 识别威胁的技巧及常见威胁 14
2.6 测试人员如何利用一个完整的威胁模型 16
2.7 技术实现难以符合产品规范或威胁模型 19
2.8 小结 20
第3章 查找入口点 21
3.1 查找入口点并划分等级 22
3.2 常见入口点 23
3.2.1 文件 23
3.2.2 套接字（Socket） 27
3.2.3 HTTP请求 29
3.2.4 命名管道 32
3.2.5 可插入协议处理程序 35
3.2.6 恶意服务器响应 37
3.2.7 程序化接口 38
3.2.8 SQL 39
3.2.9 注册表 39
3.2.10 用户接口 41
3.2.11 E-mail 42
3.2.12 命令行参数 44
3.2.13 环境变量 45
3.3 小结 47
第4章 成为恶意的客户端 48
4.1 客户端/服务器交互 48
4.1.1 发现服务器正常接收的请求 49
4.1.2 操纵网络请求 51
4.2 测试HTTP 55
4.2.1 理解无状态协议 56
4.2.2 接收输入的测试方法 56
4.3 快速测试特定的网络请求 66
4.4 测试技巧 68
4.5 小结 69
第5章 成为恶意的服务器 70
5.1 理解客户端接收恶意服务器响应的常见方法 71
5.2 SSL能否阻止恶意服务器的攻击 73
5.3 操纵服务器响应 73
5.4 恶意响应漏洞的例子 74
5.5 错误认识：对攻击者来说创建恶意服务器非常困难 76
5.6 理解降级（Downgrade）MITM攻击 77
5.7 测试技巧 78
5.8 小结 79
第6章 欺骗 80
6.1 掌握欺骗问题的重要性 80
6.2 寻找欺骗问题 82
6.3 常见欺骗案例 82
6.3.1 IP地址欺骗 83
6.3.2 MAC地址欺骗 84
6.3.3 利用网络协议欺骗 85
6.4 用户接口（User Interface，UI）欺骗 88
6.4.1 重构对话框 88
6.4.2 Z-Order欺骗 93
6.4.3 让人误解的URL和文件名 94
6.5 测试技巧 97
6.6 小结 97
第7章 信息泄露 98
7.1 信息泄露问题 98
7.2 定位信息泄露的常见区域 99
7.2.1 文件泄露 99
7.2.2 网络泄露 107
7.3 识别重要的数据 111
7.3.1 数据混淆 112
7.3.2 隐含泄露 113
7.4 小结 113
第8章 缓冲区溢出及堆栈/堆操纵 114
8.1 了解溢出的工作原理 117
8.1.1 堆栈溢出 118
8.1.2 整型溢出 121
8.1.3 堆溢出 128
8.1.4 其他攻击 129
8.2 溢出测试：在哪里寻找（测试）用例 130
8.2.1 网络 130
8.2.2 文档与文件 131
8.2.3 较高权限和较低权限用户之间的共享信息 131
8.2.4 可编程接口 132
8.3 黑盒（功能）测试 133
8.3.1 确定期待的是什么数据 133
8.3.2 使用你能识别的数据 134
8.3.3 了解界限与边界 134
8.3.4 保持全部数据的完整性 137
8.3.5 改造正常数据使其溢出的策略 141
8.3.6 测试首要行为和次要行为 143
8.3.7 要查找什么 144
8.3.8 运行时工具 156
8.3.9 模糊测试 158
8.4 白盒测试 159
8.4.1 要查找的对象 160
8.4.2 溢出的可用性 164
8.4.3 Unicode数据 169
8.4.4 已过滤的数据 170
8.5 其他主题 170
8.5.1 无代码执行的溢出也很严重 170
8.5.2 /GS编译器开关 173
8.6 测试技巧 175
8.7 小结 176
第9章 格式化字符串攻击 177
9.1 什么是格式化字符串 178
9.2 理解为什么格式化字符串存在问题 178
9.2.1 剖析prinf调用 179
9.2.2 堆栈解析错误 180
9.2.3 内存覆盖 182
9.3 格式化字符串安全漏洞测试 183
9.3.1 代码检查 183
9.3.2 黑盒测试 184
9.4 走查（Walkthrough）：经历一个格式化字符串攻击过程 185
9.4.1 寻找格式化字符串漏洞 185
9.4.2 分析可利用性 186
9.4.3 深度挖掘：围绕可利用性问题进行工作 189
9.4.4 构建一个简单的负载 201
9.5 测试技巧 208
9.6 小结 209
第10章 HTML脚本攻击 210
10.1 理解针对服务器的反射跨站脚本攻击 211
10.1.1 例子：一个搜索引擎中的反射XSS 212
10.1.2 理解为什么XSS攻击是安全相关的 214
10.1.3 利用服务端的反射XSS漏洞 216
10.1.4 POST也是可利用的 218
10.2 理解针对服务器的持久性XSS攻击 219
10.2.1 例子：在一个留言簿中的持久性XSS攻击 220
10.2.2 利用针对服务器的持久性XSS攻击 221
10.3 识别用于反射和持久性XSS攻击的数据 221
10.4 程序员阻止攻击的常用方法 224
10.5 理解针对本地文件的反射XSS攻击 227
10.5.1 例子：本地文件中的反射XSS 228
10.5.2 利用本地文件中的反射XSS漏洞 229
10.5.3 理解为何本地XSS漏洞是一个问题 229
10.5.4 利用本地XSS漏洞在受害者的机器上运行二进制文件 232
10.5.5 HTML资源 233
10.5.6 编译后的帮助文件 234
10.5.7 在客户端脚本中查找XSS漏洞 236
10.6 理解本地计算机区域中的脚本注入攻击 237
10.6.1 例子：在Winamp播放列表中的脚本注入 237
10.6.2 把非HTML文件当作HTML来解析 240
10.7 程序员用于防止HTML脚本攻击的方法 243
10.7.1 过滤器 243
10.7.2 深入理解浏览器中的解析器 245
10.7.3 Style中的注释 245
10.7.4 ASP.NET内置的过滤器 247
10.8 理解Internet Explorer如何减轻针对本地文件的XSS攻击 248
10.8.1 从互联网到本地计算机区域的链接被阻止 248
10.8.2 在默认情况下，脚本在本地计算机区域中是禁止运行的 248
10.9 识别HTML脚本的脆弱性 250
10.10 通过检查代码查找HTML脚本漏洞 250
10.10.1 识别所有返回内容给Web浏览器或者文件系统的位置 251
10.10.2 确定输出中是否包含攻击者提供的数据 251
10.10.3 检查攻击者的数据是否进行了适当的验证或者编码 252
10.10.4 ASP.NET自动对数据进行编码 253
10.11 小结 254
第11章 XML问题 255
11.1 测试XML输入文件中的非XML安全问题 255
11.1.1 结构良好的XML 256
11.1.2 有效的XML 257
11.1.3 XML输入中包括非字母数字的数据 257
11.2 测试特定的XML攻击 260
11.2.1 实体（Entity） 260
11.2.2 XML注入（XML Injection） 263
11.2.3 大文件引用（Large File Reference） 266
11.3 简单对象访问协议（Simple Object Access Protocol） 266
11.4 测试技巧 271
11.5 小结 271
第12章 规范化问题 272
12.1 理解规范化问题的重要性 272
12.2 查找规范化问题 273
12.3 基于文件的规范化问题 273
12.3.1 目录遍历 274
12.3.2 使文件扩展名检查失效 274
12.3.3 导致规范化问题的其他常见错误 277
12.4 基于Web的规范化问题 282
12.4.1 编码问题 282
12.4.2 URL问题 287
12.5 测试技巧 290
12.6 小结 291
第13章 查找弱权限 292
13.1 理解权限的重要性 293
13.2 查找权限问题 294
13.3 理解Windows的访问控制机制 295
13.3.1 安全对象 295
13.3.2 安全描述符 296
13.3.3 ACL 296
13.3.4 ACE 297
13.4 查找和分析对象的权限 298
13.4.1 使用Windows安全属性对话框 298
13.4.2 使用AccessEnum 300
13.4.3 使用Process Explorer 300
13.4.4 使用ObjSD 301
13.4.5 使用AppVerifier 302
13.5 识别常见的权限问题 302
13.5.1 弱自主访问控制列表（DACL） 303
13.5.2 NULL DACL 307
13.5.3 不恰当的ACE顺序 308
13.5.4 对象创建者 308
13.5.5 间接访问资源 309
13.5.6 忘记恢复原权限 309
13.5.7 蹲点（Squatting）攻击 310
13.5.8 利用竞争条件 311
13.5.9 文件链接 312
13.6 确定对象的可访问性 315
13.6.1 可远程访问的对象 315
13.6.2 本地可访问对象 317
13.7 其他的权限考虑 318
13.7.1 .NET权限 318
13.7.2 SQL权限 318
13.7.3 基于角色的安全 320
13.8 小结 321
第14章 拒绝服务攻击 322
14.1 掌握DoS攻击的类型 322
14.1.1 查找技术实现缺陷 323
14.1.2 查找资源消耗缺陷 329
14.1.3 寻找解决严重问题的方法 335
14.2 测试技巧 336
14.3 小结 336
第15章 托管代码问题 337
15.1 澄清有关使用托管代码的常见错误认识 338
15.1.1 错误认识1：在托管代码中不存在缓冲区溢出 338
15.1.2 错误认识2：ASP.NET Web控件可防止跨站脚本 339
15.1.3 错误认识3：垃圾回收可以防止内存泄露 339
15.1.4 错误认识4：托管代码可防止SQL注入 340
15.2 理解代码访问安全的基础 340
15.2.1 用户安全和代码安全的比较（User Security vs. Code Security） 341
15.2.2 CAS概况 341
15.2.3 程序（Assembly） 342
15.2.4 物证 343
15.2.5 权限 343
15.2.6 策略 344
15.2.7 全局程序集缓冲区（Global Assembly Cache） 348
15.2.8 堆栈审核（Stack Walk） 348
15.2.9 堆栈审查修改器（Stack Walk Modifier） 350
15.3 使用代码检查方法查找问题 352
15.3.1 调用不安全的代码 353
15.3.2 查找断言导致的问题 355
15.3.3 查找链接查询中的问题 357
15.3.4 了解拙劣的异常处理 360
15.4 理解使用APTCA带来的问题 362
15.5 .NET程序反编译 368
15.6 测试技巧 368
15.7 小结 369
第16章 SQL注入 370
16.1 SQL注入的确切含义 370
16.2 了解SQL注入的重要性 372
16.3 查找SQL注入问题 373
16.3.1 利用黑盒测试方法 374
16.3.2 利用代码检查 385
16.4 避免SQL注入的常见错误 387
16.4.1 转义输入中的单引号 388
16.4.2 删除分号以阻止多重语句 388
16.4.3 只使用存储过程 389
16.4.4 删除不必要的存储过程 390
16.4.5 将运行SQL Server的计算机安置在防火墙之后 390
16.5 理解SQL存储过程的再利用 391
16.5.1 示例：备份文档 392
16.5.2 搜寻存储过程中的再利用问题 393
16.6 识别类似的注入攻击 393
16.7 测试技巧 394
16.8 小结 395
第17章 观察及逆向工程 396
17.1 在没有调试器或反汇编工具时的观测结果 396
17.1.1 输出比较 397
17.1.2 使用监视工具 398
17.2 使用调试器跟踪程序的执行并改变其行为 399
17.2.1 修改执行流程以旁路限制 400
17.2.2 在调试器下读取并修改内存的内容 404
17.3 使用反编译器或反汇编工具对一个程序实施逆向工程 408
17.3.1 理解二进制本地代码与字节码的区别 409
17.3.2 在没有源代码时定位不安全的函数调用 411
17.3.3 对算法实施逆向工程以识别安全缺陷 415
17.4 分析安全更新 417
17.5 测试技巧 418
17.6 法律方面的考虑因素 419
17.7 小结 419
第18章 ActiveX再利用攻击 420
18.1 理解ActiveX控件 421
18.1.1 在Internet Explorer浏览器中创建ActiveX控件 421
18.1.2 ActiveX控件的初始化和脚本解析 423
18.1.3 ActiveX控件再利用 424
18.1.4 理解ActiveX控件安全模型 428
18.1.5 利用ActiveX控件测试方法学 434
18.1.6 其他的测试窍门及技术 441
18.2 走查（Walkthrough）：ActiveX控件测试 450
18.2.1 Clear 451
18.2.2 ClipboardCopy 452
18.2.3 ClipboardPaste 453
18.2.4 InvokeRTFEditor 455
18.2.5 LoadRTF 464
18.2.6 NumChars 465
18.2.7 RTFEditor 属性 466
18.2.8 RTFEditor PARAM 467
18.2.9 RTFEditorOverride 468
18.2.10 挑战 470
18.3 测试技巧 470
18.4 小结 471
第19章 其他再利用攻击 472
19.1 理解请求外部数据的文档格式 472
19.1.1 文档格式请求外部数据的常见的降低风险的方法 473
19.1.2 测试请求外部数据的文档格式 474
19.2 请求外部数据的Web页面 475
19.2.1 通过URL查询字符串进行的CSRF攻击 475
19.2.2 通过POST数据进行的CSRF攻击 476
19.2.3 防止CSRF攻击的常用方法 477
19.2.4 通过SOAP数据进行的CSRF攻击 478
19.2.5 对CSRF攻击进行测试 479
19.3 理解窗口和线程消息的再利用 479
19.4 小结 480
第20章 报告安全漏洞 481
20.1 报告问题 481
20.2 联系开发商 482
20.3 期望联系开发商后得到什么 484
20.4 公开发布 485
20.4.1 确定细节数量 485
20.4.2 公开时间选择 486
20.5 定位产品中的安全漏洞 486
20.5.1 与漏洞发现者联系 487
20.5.2 识别漏洞产生的根本原因 487
20.5.3 寻找相关的漏洞 487
20.5.4 确定受影响的产品及其版本 488
20.5.5 测试补丁 488
20.5.6 确定减轻措施和相关工作 488
20.5.7 为所有受影响的产品及其版本同时发布补丁 489
20.6 小结 489
附录A 相关工具 490
附录B 安全测试用例列表 497