第1章 什么是SQL注入 1
1.1 概述 1
1.2 理解Web应用的工作原理 2
1.2.1 一种简单的应用架构 3
1.2.2 一种较复杂的架构 4
1.3 理解SQL注入 5
1.4 理解SQL注入的产生过程 10
1.4.1 构造动态字符串 10
1.4.2 不安全的数据库配置 16
1.5 本章小结 18
1.6 快速解决方案 18
1.7 常见问题解答 19
第2章 SQL注入测试 21
2.1 概述 21
2.2 寻找SQL注入 21
2.2.1 借助推理进行测试 22
2.2.2 数据库错误 28
2.2.3 应用程序的响应 39
2.2.4 SQL盲注 42
2.3 确认SQL注入 45
2.3.1 区分数字和字符串 46
2.3.2 内联SQL注入 46
2.3.3 终止式SOL注入 52
2.3.4 时间延迟 59
2.4 自动寻找SQL注入 60
2.5 本章小结 68
2.6 快速解决方案 68
2.7 常见问题解答 69
第3章 复查代码中的SQL注入 71
3.1 概述 71
3.2 复查源代码中的SQL注入 71
3.2.1 危险的编码行为 73
3.2.2 危险的函数 78
3.2.3 跟踪数据 81
3.2.4 复查Android应用程序代码 88
3.2.5 复查PL/SQL和T-SQL代码 93
3.3 自动复查源代码 99
3.3.1 Graudit 100
3.3.2 YASCA 101
3.3.3 Pixy 101
3.3.4 AppCodeScan 102
3.3.5 OWASP LAPSE+项目 102
3.3.6 Microsoft SQL注入源代码分析器 103
3.3.7 CAT.NET 103
3.3.8 RIPS——PHP脚本漏洞的静态源代码分析器 103
3.3.9 CodePro AnalytiX 104
3.3.1 0 Teachable Static Analysis Workbench 104
3.3.1 1商业源代码复查工具 104
3.3.1 2 Fortify源代码分析器 105
3.3.1 3 Rational AppScan Source Edition 106
3.3.1 4 CodeSecure 106
3.3.1 5 Klocwork Solo 106
3.4 本章小结 107
3.5 快速解决方案 107
3.6 常见问题解答 108
第4章 利用SQL注入 111
4.1 概述 111
4.2 理解常见的漏洞利用技术 112
4.2.1 使用堆叠查询 113
4.2.2 在Web应用程序中利用Oracle漏洞 114
4.3 识别数据库 114
4.3.1 非盲跟踪 115
4.3.2 盲跟踪 119
4.4 使用UINON语句提取数据 120
4.4.1 匹配列 121
4.4.2 匹配数据类型 122
4.5 使用条件语句 126
4.5.1 方法1:基于时间 126
4.5.2 方法2:基于错误 130
4.5.3 方法3:基于内容 131
4.5.4 处理字符串 131
4.5.5 扩展攻击 133
4.5.6 利用SQL注入错误 134
4.5.7 Oracle中的错误消息 135
4.6 枚举数据库模式 139
4.6.1 SQL Server 139
4.6.2 MySQL 143
4.6.3 PostgreSQL 146
4.6.4 Oracle 147
4.7 在INSERT查询中实施注入攻击 150
4.7.1 第一种情形:插入用户规定的数据 150
4.7.2 第二种情形:生成INSERT错误 153
4.7.3 其他情形 155
4.8 提升权限 155
4.8.1 SQL Server 155
4.8.2 在未打补丁的服务器上提升权限 160
4.8.3 SYS.DBMS CDC PUBLISH 162
4.9 窃取哈希口令 164
4.9.1 SQL Server 164
4.9.2 MySQL 165
4.9.3 PostgreSQL 166
4.9.4 Oracle 166
4.10 带外通信 169
4.10.1 e-mail 169
4.10.2 HTTP/DNS 172
4.10.3 文件系统 173
4.11 自动利用SQL注入 179
4.11.1 Sqlmap 180
4.11.2 Bobcat 181
4.11.3 BSQL 181
4.11.4 其他工具 183
4.12 本章小结 183
4.13 快速解决方案 184
4.14 常见问题解答 185
第5章 SQL盲注利用 187
5.1 概述 187
5.2 寻找并确认SQL盲注 188
5.2.1 强制产生通用错误 188
5.2.2 注入带副作用的查询 188
5.2.3 拆分与平衡 189
5.2.4 常见的SQL盲注场景 191
5.2.5 SQL盲注技术 191
5.3 使用基于时间的技术 200
5.3.1 延迟数据库查询 200
5.3.2 基于时间的推断应考虑的问题 207
5.4 使用基于响应的技术 207
5.4.1 MySQL响应技术 208
5.4.2 PostgreSQL响应技术 209
5.4.3 SQL Server响应技术 210
5.4.4 Oracle响应技术 211
5.4.5 返回多位信息 213
5.5 使用非主流通道 214
5.5.1 数据库连接 214
5.5.2 DNS渗漏 216
5.5.3 e-mail渗漏 219
5.5.4 HTTP渗漏 220
5.5.5 ICMP渗漏 222
5.6 自动SQL盲注利用 222
5.6.1 Absinthe 222
5.6.2 BSQL Hacker 223
5.6.3 SQLBrute 225
5.6.4 Sqlmap 226
5.6.5 Sqlninja 227
5.6.6 Squeeza 228
5.7 本章小结 229
5.8 快速解决方案 229
5.9 常见问题解答 231
第6章 利用操作系统 233
6.1 概述 233
6.2 访问文件系统 234
6.2.1 读文件 234
6.2.2 写文件 248
6.3 执行操作系统命令 257
6.4 巩固访问 269
6.5 本章小结 271
6.6 快速解决方案 271
6.7 常见问题解答 272
第7章 高级话题 273
7.1 概述 273
7.2 避开输入过滤器 273
7.2.1 使用大小写变种 274
7.2.2 使用SQL注释 274
7.2.3 使用编码 275
7.2.4 使用动态查询执行 276
7.2.5 使用空字节 278
7.2.6 嵌套剥离后的表达式 278
7.2.7 利用截断 278
7.2.8 避开自定义过滤器 280
7.2.9 使用非标准入口点 280
7.3 利用二阶SQL注入 282
7.4 客户端SQL注入漏洞 285
7.4.1 访问本地数据库 286
7.4.2 攻击客户端数据库 286
7.5 使用混合攻击 288
7.5.1 利用捕获的数据 288
7.5.2 创建跨站脚本 288
7.5.3 在Oracle上运行操作系统命令 289
7.5.4 利用验证过的漏洞 289
7.6 本章小结 290
7.7 快速解决方案 291
7.8 常见问题解答 292
第8章 代码层防御 293
8.1 概述 293
8.2 领域驱动的安全 293
8.3 使用参数化语句 297
8.3.1 Java中的参数化语句 298
8.3.2 .NET(C#)中的参数化语句 299
8.3.3 PHP中的参数化语句 300
8.3.4 PL/SQL中的参数化语句 301
8.4 移动应用中的参数化语句 302
8.4.1 iOS应用程序中的参数化语句 302
8.4.2 Android应用程序中的参数化语句 302
8.4.3 HTML5浏览器存储中的参数化语句 303
8.5 输入验证 303
8.5.1 白名单 303
8.5.2 黑名单 306
8.5.3 Java中的输入验证 307
8.5.4 .NET中的输入验证 308
8.5.5 PHP中的输入验证 309
8.5.6 在移动应用程序中检验输入 309
8.5.7 在HTML5中检验输入 309
8.6 编码输出 310
8.7 规范化 316
8.8 通过设计来避免SQL注入的危险 319
8.8.1 使用存储过程 319
8.8.2 使用抽象层 320
8.8.3 处理敏感数据 321
8.8.4 避免明显的对象名 322
8.8.5 创建honeypot 322
8.8.6 附加的安全开发资源 323
8.9 本章小结 324
8.10 快速解决方案 324
8.11 常见问题解答 325
第9章 平台层防御 327
9.1 概述 327
9.2 使用运行时保护 327
9.2.1 Web应用防火墙 328
9.2.2 截断过滤器 333
9.2.3 不可编辑与可编辑的输入保护 336
9.2.4 URL策略与页面层策略 337
9.2.5 面向方面编程 338
9.2.6 应用程序入侵检测系统 338
9.2.7 数据库防火墙 339
9.3 确保数据库安全 339
9.3.1 锁定应用程序数据 339
9.3.2 锁定数据库服务器 343
9.4 额外的部署考虑 345
9.4.1 最小化不必要信息的泄露 345
9.4.2 提高Web服务器日志的详细程度 349
9.4.3 将Web服务器和数据库服务器分别部署在独立主机上 349
9.4.4 配置网络访问控制 349
9.5 本章小结 349
9.6 快速解决方案 350
9.7 常见问题解答 350
第10章 确认并从SQL注入攻击中恢复 353
10.1 简介 353
10.2 调查可疑的SQL注入攻击 353
10.2.1 取证的合理实践 354
10.2.2 分析数字化证据 355
10.3 如果你是受害者,该怎么办? 376
10.3.1 遏制安全事件 376
10.3.2 评估涉及的数据 377
10.3.3 通知相应人员 377
10.3.4 确定攻击者在系统上执行了哪些操作? 378
10.3.5 从SQL注入攻击中恢复 378
10.4 小结 382
10.5 快速解决方案 383
10.6 常见问题解答 384
第11章 参考资料 387
11.1 概述 387
11.2 SQL入门 387
11.3 SQL注入快速参考 393
11.3.1 识别SQL注入漏洞 393
11.3.2 识别数据库平台 395
11.3.3 Microsoft SQL Server备忘单 398
11.3.4 MySQL备忘单 406
11.3.5 Oracle备忘单 408
11.3.6 PostgreSQL备忘单 413
11.4 避开输入验证过滤器 415
11.4.1 引号过滤器 415
11.4.2 HTTP编码 416
11.5 排查SQL注入攻击 417
11.6 其他平台上的SQL注入 419
11.6.1 DB2备忘单 420
11.6.2 Informix备忘单 420
11.6.3 Ingres备忘单 422
11.6.4 Sybase备忘单 423
11.6.5 Microsoft Access 424
11.7 资源 424
11.7.1 SQL注入白皮书 424
11.7.2 SQL注入备忘单 424
11.7.3 SQL注入利用工具 425
11.7.4 口令破解工具 425
11.8 快速解决方案 425