第一部分 基础知识 2
第1章 安全漏洞发现方法学 2
1.1 白盒测试 3
1.1.1 代码评审(Source Code Review) 3
1.1.2 工具与自动化 5
1.1.3 优点和缺点 7
1.2 黑盒测试 8
1.2.1 手工测试 8
1.2.2 自动化测试或模糊测试 10
1.2.3 优点和缺点 11
1.3 灰盒测试 12
1.3.1 二进制审计 12
1.3.2 自动化的二进制审计 15
1.3.3 优点和缺点 15
1.4 小结 16
第2章 什么是模糊测试 17
2.1 模糊测试的定义 17
2.2 模糊测试的历史 18
2.3 模糊测试各阶段 22
2.4 模糊测试的局限性和期望 24
2.4.1 访问控制漏洞 25
2.4.2 糟糕的设计逻辑 25
2.4.3 后门 26
2.4.4 破坏 26
2.4.5 多阶段安全漏洞(MuliStage Vulnerability) 27
2.5 小结 27
第3章 模糊测试方法与模糊测试器类型 28
3.1 模糊测试方法 28
3.1.1 预生成测试用例 29
3.1.2 随机生成输入 29
3.1.3 手工协议变异测试 30
3.1.4 变异或强制性测试 30
3.1.5 自动协议生成测试 31
3.2 模糊测试器类型 31
3.2.1 本地模糊器 31
3.2.2 远程模糊测试器 34
3.2.3 存模糊测试器 37
3.2.4 模糊测试框架 38
3.3 小结 39
第4章 数据表示和分析 40
4.1 什么是协议 40
4.2 协议中的字段 41
4.3 简单文本协议(Plain Text Protocols) 43
4.4 二进制协议 44
4.5 网络协议 47
4.6 文件格式 48
4.7 常用协议元素 51
4.7.1 名字-值对 51
4.7.2 块识别符 51
4.7.3 块大小 52
4.7.4 校验和 52
4.8 小结 52
第5章 有效模糊测试的需求 53
5.1 可重现性与文档 53
5.2 可重用性 54
5.3 过程状态和过程深度 55
5.4 跟踪、代码覆盖和度量 58
5.5 错误检测 58
5.6 资源约束 60
5.7 小结 60
第二部分 目标与自动化 62
第6章 自动化与数据生成 62
6.1 自动化的价值 62
6.2 有用的工具和库 63
6.2.1 ETHEREAL/WIRESHARK 64
6.2.2 LIBDASM和LIBDISASM 64
6.2.3 LIBNET/LIBNETNT 64
6.2.4 LIBPCAP 65
6.2.5 METRO PACKET LIBRARY 65
6.2.6 PTRACE 65
6.2.7 PYTHON扩展 65
6.3 编程语言的选择 66
6.4 数据生成与模糊试探值(Fuzz Heuristics) 66
6.4.1 整数值 68
6.4.2 字符串重复(String Repetitions) 70
6.4.3 字段分隔符 71
6.4.4 格式字符串 73
6.4.5 字符翻译 73
6.4.6 目录遍历 74
6.4.7 命令注入 75
6.5 小结 75
第7章 环境变量与参数模糊测试 76
7.1 本地模糊测试介绍 76
7.1.1 命令行参数 76
7.1.2 环境变量 77
7.2 本地模糊测试原则 78
7.3 寻找测试目标 79
7.3.1 UNIX文件权限释义 81
7.4 本地模糊测试方法 82
7.5 枚举环境变量 83
7.5.1 GNU调试器(GNU Debug,GDB)法 83
7.6 自动化的环境变量模糊测试 84
7.6.1 库预加载(Library Preloading) 85
7.7 检测问题 86
7.8 小结 88
第8章 自动化的环境变量与参数模糊测试 89
8.1 iFUZZ本地模糊测试器的功能 89
8.2 开发iFUZZ工具 91
8.2.1 开发方法 92
8.3 iFUZZ使用的编程语言 95
8.4 案例研究 96
8.5 优点与改进 97
8.6 小结 98
第9章 Web应用与服务器模糊测试 99
9.1 什么是Web应用模糊测试 99
9.2 测试目标 102
9.3 测试方法 104
9.3.1 设置目标环境 104
9.3.2 输入 105
9.4 漏洞 116
9.5 异常检测 119
9.6 小结 120
第10章 Web应用和服务器的自动化模糊测试 121
10.1 Web应用模糊测试器 122
10.2 WebFuzz的特性 124
10.2.1 请求 124
10.2.2 模糊变量 125
10.2.3 响应 126
10.3 必备的背景信息 128
10.3.1 识别请求 128
10.3.2 检测响应 128
10.4 开发WebFuzz 131
10.4.1 思路 131
10.4.2 选择编程语言 131
10.4.3 设计 131
10.5 案例研究 139
10.5.1 目录遍历(Directory Traversal) 139
10.5.2 溢出 140
10.5.3 SQL注入 143
10.5.4 XSS脚本 145
10.6 优点与可能的改进 148
10.7 小结 149
第11章 文件格式模糊测试 150
11.1 测试目标 151
11.2 测试方法 152
11.2.1 强制或基于变异的模糊测试 152
11.2.2 智能强制或基于生成的模糊测试 154
11.3 测试输入 154
11.4 安全漏洞 155
11.4.1 拒绝服务(Daniel ofService,DoS) 155
11.4.2 整数处理问题 156
11.4.3 简单的栈和堆溢出 157
11.4.4 逻辑错误 157
11.4.5 格式字符串 158
11.4.6 竞争条件(Race Condition) 158
11.5 检测错误 158
11.6 小结 159
第12章 UNIX平台上的文件格式自动化模糊测试 161
12.1 notSPIKEfile和SPIKEfile 162
12.1.1 不具有的特性 162
12.2 开发过程 162
12.2.1 异常监测引擎 163
12.2.2 异常报告(异常监测) 163
12.2.3 模糊测试核心引擎 164
12.3 有意义的代码片段 165
12.3.1 UNIX中常见的我们可能感兴趣的信号 167
12.3.2 我们不感兴趣的信号 167
12.4 僵尸进程(Zombie Process) 168
12.5 使用注意事项 170
12.5.1 Adobe Acrobat 171
12.5.2 RealNetworks RealPlayer 171
12.6 案例研究:RealPlayer RealPix格式字符串漏洞 172
12.7 开发语言 174
12.8 小结 174
第13章 Windows平台上的文件格式自动化模糊测试 175
13.1 Windows文件格式漏洞 175
13.2 FileFuzz工具的功能 178
13.2.1 创建文件 179
13.2.2 执行应用 180
13.2.3 异常检测 181
13.2.4 保存的审计(audit) 182
13.3 必需的背景信息 183
13.3.1 识别目标应用 183
13.4 开发FileFuzz工具 186
13.4.1 开发方法 187
13.4.2 选择开发语言 187
13.4.3 设计 187
13.5 案例研究 194
13.6 优势和提升空间 198
13.7 小结 199
第14章 网络协议的模糊测试 200
14.1 什么是网络协议的模糊测试 201
14.2 选择目标应用 203
14.2.1 第二层:数据链接层 204
14.2.2 第三层:网络层 205
14.2.3 第四层:传输层 205
14.2.4 第五层:会话层 206
14.2.5 第六层:表示层 206
14.2.6 第七层:应用层 206
14.3 测试方法 207
14.3.1 强制(基于变异的)模糊测试 207
14.3.2 智能强制(基于生成的)模糊测试 207
14.3.3 通过修改客户端进行变异模糊测试 208
14.4 错误检测 209
14.4.1 手工方式(基于调试器) 209
14.4.2 自动化方式(基于代理) 209
14.4.3 其他来源 210
14.5 小结 210
第15章 UNIX平台上的自动化网络协议模糊测试 211
15.1 使用SPIKE进行模糊测试 212
15.1.1 选择目标 212
15.1.2 协议分析 213
15.2 SPIKE必要知识 215
15.2.1 模糊引擎 216
15.2.2 基于行的通用TCP模糊测试器 216
15.3 基于块的协议模型 217
15.4 其他的SPIKE特性 219
15.4.1 针对协议的模糊测试器 219
15.4.2 针对协议的模糊测试脚本 219
15.4.3 基于脚本的通用模糊测试器 220
15.5 编写SPIKE NMAP模糊测试器脚本 220
15.6 小结 224
第16章 Windows平台上网络协议的模糊测试 225
16.1 特性 226
16.1.1 数据包结构 226
16.1.2 抓取数据 227
16.1.3 解析数据 227
16.1.4 模糊测试变量 228
16.1.5 发送数据 229
16.2 必备的背景知识 229
16.2.1 检测故障 229
16.2.2 协议驱动程序 230
16.3 开发 231
16.3.1 选择编程语言 231
16.3.2 数据包抓取库 231
16.3.3 设计 232
16.4 案例研究 237
16.5 优势与可改进空间 239
16.6 小结 240
第17章 Web浏览器的模糊测试 241
17.1 什么是Web浏览器模糊测试 242
17.2 目标 242
17.3 方法 243
17.3.1 测试方法 243
17.3.2 测试输入 244
17.4 漏洞 253
17.5 检测 254
17.6 小结 255
第18章 Web浏览器的自动化模糊测试 256
18.1 组件对象模型背景 256
18.1.1 COM简史 257
18.1.2 对象与接口 257
18.1.3 ActiveX 258
18.2 开发模糊测试器 260
18.2.1 枚举可被加载的AcriveX控件 261
18.2.2 属性、方法、参数与类型 266
18.2.3 模糊测试与监视 270
18.3 小结 271
第19章 内存模糊测试 272
19.1 为什么需要内存模糊测试?怎么进行? 273
19.2 必要的背景知识 273
19.3 究竟什么是内存模糊测试的简要解释 277
19.4 目标 278
19.5 内存模糊测试方法之变异循环插入(Mutation Loop Insertion) 279
19.6 内存模糊测试方法之快照恢复变异(Snapshot restoration mutation) 280
19.7 测试速度与处理深度 281
19.8 错误检测 281
19.9 小结 282
第20章 自动化内存模糊测试 284
20.1 内存模糊测试工具特性集 284
20.2 选择开发语言 286
20.3 Windows调试API 288
20.4 整合以上的内容 292
20.4.1 如何在目标应用中特定的点放置“钩子” 292
20.4.2 如何生成与恢复进程快照 295
20.4.3 选择在何处放置钩子 299
20.4.4 如何定位和变异目标内存空间 299
20.5 PyDbg,一个新朋友 299
20.6 一个人造的示例 301
20.7 小结 314
第三部分 高级模糊测试技术 318
第21章 模糊测试框架 318
21.1 什么是模糊测试框架 319
21.2 现有的模糊测试框架 321
21.2.1 antiparser 321
21.2.2 Dfuz 323
21.2.3 SPIKE 327
21.2.4 Peach 330
21.2.5 通用目的模糊测试器 333
21.2.6 Autodafé 335
21.3 定制模糊测试器案例研究:Shockwave Flash 338
21.3.1 为SWF文件建模 339
21.3.2 生成有效的数据 350
21.3.3 模糊测试环境 351
21.3.4 测试方法 351
21.4 模糊测试框架Sulley 352
21.4.1 Sulley的目录结构 353
21.4.2 数据表示 354
21.4.3 会话 365
21.4.4 事后分析 370
21.4.5 一个完整的实例 375
21.5 小结 382
第22章 自动化协议分析 383
22.1 模糊测试的痛处 383
2 2.2 启发式技术 385
22.2.1 代理模糊测试 385
22.2.2 改进的代理模糊测试 388
22.2.3 反汇编启发式技术 389
22.3 生物信息学 390
22.4 遗传算法 394
22.5 小结 398
第23章 模糊测试器跟踪 399
23.1 我们跟踪的究竟是什么 399
23.2 可视化和基础块 401
23.2.1 控制流图 402
23.2.2 控制流图示例 402
23.3 构建一个模糊测试器跟踪器 403
23.3.1 分析目标 404
23.3.2 跟踪 405
23.3.3 交叉参考 407
23.4 分析一个代码覆盖工具 410
23.4.1 PStalker布局预览 411
23.4.2 数据源栏 412
23.4.3 数据浏览栏 413
23.4.4 数据抓取栏 414
23.4.5 局限性 414
23.4.6 数据存储 414
23.5 案例研究 417
23.5.1 测试策略 418
23.5.2 实际操作 421
23.6 优势与将来的改进 425
23.6.1 将来的改进 427
23.7 小结 428
第24章 智能错误检测 429
24.1 原始的错误检测技术 429
24.2 我们寻找的是什么 432
24.3 选择模糊测试值的注意事项 437
24.4 自动化的调试器监视 438
24.4.1 一个基础的调试器监视器 439
24.4.2 更高级的调试器监视器 442
24.5 首轮异常与末轮异常 446
24.6 动态二进制插装 447
24.7 小结 449
第四部分 展望 452
第25章 我们学到了什么 452
25.1 软件开发生命周期 452
25.1.1 分析阶段 455
25.1.2 设计阶段 455
25.1.3 编码阶段 456
25.1.4 测试阶段 456
25.1.5 维护阶段 457
25.1.6 在软件开发生命周期中实现模糊测试 457
25.2 开发者 457
25.3 QA研究员 458
25.4 安全研究者 458
25.5 小结 459
第26章 展望 460
26.1 商业工具 460
26.1.1 BeyondSecurity 司的beSTORM 461
26.1.2 BreakingPoint Systems 的BPS-1000 461
26.1.3 Codenomicon 462
26.1.4 GLEG ProtoVer专业版 464
26.1.5 MU Security公司的MU-4000 465
26.1.6 Security Innovation公司的Holodeck 466
26.2 发现漏洞的混合方法 467
26.3 集成的测试平台 468
26.4 小结 468
附录A 本书引用的小布什语录之详细解读 469
索引 480