- 探索困擾當(dāng)今Web應(yīng)用的常見漏洞。
- 學(xué)習(xí)攻擊者進(jìn)行漏洞利用攻擊所用的基本的黑客技術(shù)。
- 構(gòu)圖和記錄你無法直接訪問的Web應(yīng)用。
- 開發(fā)并部署可以繞過常規(guī)防御機(jī)制的、定制的漏洞利用程序。
- 制訂并部署緩解措施,保護(hù)你的應(yīng)用程序免受黑客攻擊。
- 將安全編碼的實(shí)踐融入到你的開發(fā)生命周期中。
- 獲取實(shí)用的技巧,幫助你提高Web應(yīng)用程序的整體安全性。
雖然有很多網(wǎng)絡(luò)和IT安全方面的資源,但是直到現(xiàn)在,依然缺乏詳細(xì)的現(xiàn)代Web應(yīng)用程序安全相關(guān)的知識(shí)。這本實(shí)用的指南提供了攻防兼?zhèn)涞陌踩^念,軟件工程師可以輕松學(xué)習(xí)和應(yīng)用。
Salesforce的高級(jí)安全工程師Andrew Hoffman介紹了Web應(yīng)用安全的三大支柱:偵察、攻擊和防御。你將學(xué)習(xí)有效研究和分析現(xiàn)代Web應(yīng)用程序的方法,包括那些你無法直接訪問的應(yīng)用程序。你還將學(xué)習(xí)如何使用的黑客技術(shù)來入侵Web應(yīng)用。后,你將學(xué)到如何在自己的Web應(yīng)用程序開發(fā)中采取緩解措施,以防止黑客攻擊。
前言
歡迎閱讀本書。在前言中,我們將討論閱讀和理解本書內(nèi)容所需的基礎(chǔ)知識(shí)。我們還將討論學(xué)習(xí)目標(biāo),并嘗試建立典型的讀者畫像,以便了解你是否將從這本書中受益。
如果不知道這本書是否適合你,或不確定通過你已有的專業(yè)知識(shí)背景能否掌握后續(xù)章節(jié)的內(nèi)容,請(qǐng)?jiān)诶^續(xù)閱讀第1 章之前仔細(xì)閱讀前言中的內(nèi)容。
的知識(shí)和學(xué)習(xí)目標(biāo)
這本書不僅可以幫助你學(xué)習(xí)如何保護(hù)Web 應(yīng)用程序免受黑客攻擊,還可以引導(dǎo)你逐步了解黑客偵察和侵入Web 應(yīng)用程序而采取的步驟。
在本書中,我們將討論黑客如今所使用的許多技術(shù),這些技術(shù)可用于入侵由公司、政府, 甚至業(yè)余愛好者托管的Web 應(yīng)用程序。
在對(duì)前面提到的技術(shù)進(jìn)行了充分的研究之后,我們開始討論如何保護(hù)Web 應(yīng)用程序,免受這些黑客的攻擊。
在此過程中,你會(huì)發(fā)現(xiàn)全新的應(yīng)用架構(gòu)設(shè)計(jì)思維方式,還將學(xué)習(xí)到如何將安全實(shí)踐整合到工程組織中。后,我們將對(duì)當(dāng)前常見、危險(xiǎn)的Web應(yīng)用攻擊類型和相關(guān)技術(shù)進(jìn)行評(píng)估。
讀完本書后,你所擁有的知識(shí),可以對(duì)你沒有代碼級(jí)訪問權(quán)限的應(yīng)用程序進(jìn)行安全偵察。
你還將能夠識(shí)別Web 應(yīng)用程序中的缺陷和漏洞,以及精心設(shè)計(jì)的、旨在破壞應(yīng)用程序數(shù)據(jù)、中斷執(zhí)行流程或干擾Web 應(yīng)用程序正常功能的網(wǎng)絡(luò)行為。
掌握了這些技能,以及關(guān)于保護(hù)Web 應(yīng)用程序的后一節(jié)中獲得的知識(shí),你將能夠識(shí)別Web 應(yīng)用程序代碼庫中的危險(xiǎn)區(qū)域,并了解如何編寫代碼來防御可能產(chǎn)生的應(yīng)用程序攻擊,以使你的應(yīng)用系統(tǒng)和用戶遠(yuǎn)離風(fēng)險(xiǎn)。
本書的內(nèi)容是循序漸進(jìn)的,所以如果你選擇跳過前面的內(nèi)容,就會(huì)發(fā)現(xiàn)自己缺少必要的先決條件和信息,只需回溯幾章的內(nèi)容即可。
未經(jīng)事先說明,不應(yīng)在本書中出現(xiàn)本章內(nèi)容中未定義為前提的任何主題。
建議的背景知識(shí)
本書面向的潛在讀者范圍很廣,但是本書的編寫風(fēng)格以及書中示例的組織形式,使其成為具有軟件工程中級(jí)背景知識(shí)人員的理想選擇。
你可能會(huì)問,軟件工程中級(jí)背景意味著什么?這個(gè)問題的答案因人而異。對(duì)技術(shù)高手而言,這本書實(shí)際上可能只需要軟件工程的入門級(jí)背景。換句話說,之前具有Web 開發(fā)和/ 或腳本編寫經(jīng)驗(yàn)(如果足夠的話)的系統(tǒng)管理員,可以流暢地閱讀本書并理解所有示例。話雖如此,這本書中所含的代碼編寫示例既包括客戶端,也包括服務(wù)器,僅僅了解其中一部分不足以深入理解這些示例。
本書還包括有關(guān)基于HTTP 的基本客戶端/ 服務(wù)器聯(lián)網(wǎng)的討論。此外,在以后的章節(jié)中,我們會(huì)探討有關(guān)軟件體系結(jié)構(gòu)的內(nèi)容,我們將探究在降低安全風(fēng)險(xiǎn)的同時(shí),將內(nèi)部軟件與第三方軟件集成的方法。
由于本書涵蓋了如此多的主題,因此我首先界定了所需的技能水平來成功完成本書的學(xué)習(xí),即中級(jí)還是入門級(jí),因?yàn)檫@本書不適合那些沒有任何編寫應(yīng)用于生產(chǎn)環(huán)境的應(yīng)用程序經(jīng)驗(yàn)或知識(shí)的人。
技能要求
在這本書中,軟件工程中級(jí)背景意味著:
你可以使用至少一種編程語言編寫基本的 CRUD(Create、Read、Update、Delete,即創(chuàng)建、讀取、更新、刪除,俗稱增刪查改)程序。
你可以編寫運(yùn)行在服務(wù)器上的代碼(例如后端代碼)。
你至少可以編寫一些在瀏覽器中運(yùn)行的代碼(前端代碼,通常為JavaScript)。
你知道什么是 HTTP,并且能讀懂,甚至編寫通過 HTTP 進(jìn)行 GET/POST調(diào)用的相關(guān)代碼。
你可以編寫,或至少能閱讀并理解使用服務(wù)器端和客戶端代碼的應(yīng)用程序,該應(yīng)用程序通過HTTP 進(jìn)行通信。
你至少熟悉一種流行的數(shù)據(jù)庫(MySQL,MongoDB 等)。
這些技能是后續(xù)順利閱讀本書示例的標(biāo)準(zhǔn)。在這些要點(diǎn)之外的任何經(jīng)驗(yàn)都會(huì)有幫助,這將使你更容易使用和從中獲得學(xué)習(xí)價(jià)值。
為簡(jiǎn)便起見,本書中的大多數(shù)代碼示例都是使用JavaScript 編寫的(以便客戶端和服務(wù)器代碼使用相同的語言),但是大多數(shù)代碼都可以毫不費(fèi)力地應(yīng)用于其他語言中。
我盡力合理組織本書中的主題,以使它們以易接受的進(jìn)度來逐步增加難度。我也嘗試在解釋中盡可能地細(xì)致明了。這意味著,每當(dāng)涉及一項(xiàng)新技術(shù)時(shí),我都會(huì)先簡(jiǎn)要介紹一下該技術(shù)的簡(jiǎn)要背景,并概述其工作原理。
誰能從閱讀本書中受益?
除了技能,我認(rèn)為弄清誰將從本書中受益是很重要的,所以我想解釋一下我的目標(biāo)受眾是誰。為此,根據(jù)學(xué)習(xí)目標(biāo)和專業(yè)興趣來組織本節(jié)。即使你不屬于以下類別,仍然可以從本書中學(xué)習(xí)許多有價(jià)值,或至少感興趣的概念。
這本書是為了經(jīng)得起時(shí)間的考驗(yàn)而寫的,因此,如果你以后打算從事下述目標(biāo)讀者群中的某項(xiàng)職業(yè),那么本書中所有的專業(yè)知識(shí)都非常實(shí)用。
軟件工程師和Web 應(yīng)用程序開發(fā)人員
客觀地說,這本書的主要讀者是職業(yè)生涯處于初期到中期的軟件工程師或Web 應(yīng)用程序開發(fā)人員。理想情況下,該讀者對(duì)深入了解黑客使用的攻擊技術(shù),或安全工程師用來對(duì)抗黑客的防御技術(shù)感興趣。
一般來說,在本書的語境中,Web 應(yīng)用程序開發(fā)人員和軟件工程師這兩個(gè)提法是可以互換的,考慮接下來的章節(jié)中這兩個(gè)名稱都會(huì)用到,為避免引起誤解,故而首先澄清一下。
略
Andrew Hoffman是Salesforce.com的高級(jí)安全工程師,負(fù)責(zé)多個(gè)JavaScript、Node.js和OSS團(tuán)隊(duì)的安全工作。他的專長是DOM和JavaScript安全漏洞深入研究。他曾與各大瀏覽器廠商,包括TC39和WHATWG(Web Hypertext Application Technology Working Group,負(fù)責(zé)設(shè)計(jì)即將推出的JavaScript和瀏覽器DOM版本的組織)合作過。
目錄
前言 .1
第1 章 軟件安全歷程 .21
1.1 黑客的起源 . 21
1.2 Enigma 密碼機(jī),約1930 年 22
1.3 自動(dòng)Enigma 密碼破解,約1940 年 26
1.4 電話Phreaking,約1950 年 . 29
1.5 防Phreaking 技術(shù),約1960 年 31
1.6 計(jì)算機(jī)黑客的起源,約1980 年 32
1.7 互聯(lián)網(wǎng)的興起,約2000 年 . 34
1.8 現(xiàn)時(shí)代的黑客,約2015 年之后 36
1.9 小結(jié) 40
部分 偵察
第2 章 Web 應(yīng)用偵察簡(jiǎn)介 43
2.1 信息收集 43
2.2 Web 應(yīng)用程序構(gòu)圖 46
2.3 小結(jié) 48
第3 章 現(xiàn)代Web 應(yīng)用程序的結(jié)構(gòu) 49
3.1 現(xiàn)代的與傳統(tǒng)的Web 應(yīng)用程序 49
3.2 REST API 52
3.3 JS 對(duì)象標(biāo)記 55
3.4 JavaScript. 57
3.4.1 變量和作用域 58
3.4.2 函數(shù) 61
3.4.3 上下文 . 62
3.4.4 原型繼承. 63
3.4.5 異步模型. 66
3.4.6 瀏覽器DOM . 69
3.5 SPA 框架 71
3.6 認(rèn)證和授權(quán)系統(tǒng) 72
3.6.1 認(rèn)證 73
3.6.2 授權(quán) 74
3.7 Web 服務(wù)器 . 74
3.8 服務(wù)器端數(shù)據(jù)庫 76
3.9 客戶端數(shù)據(jù)存儲(chǔ) 77
3.10 小結(jié) . 78
第4 章 尋找子域 79
4.1 單域多應(yīng)用程序 79
4.2 瀏覽器內(nèi)置的網(wǎng)絡(luò)分析工具 80
4.3 公開信息利用 83
4.3.1 搜索引擎緩存 84
4.3.2 存檔信息利用 86
4.3.3 社交媒體快照 88
4.4 域傳送攻擊 . 92
4.5 暴力破解子域 94
4.6 字典攻擊 101
4.7 小結(jié) . 103
第5 章 API 分析 105
5.1 端點(diǎn)探索 105
5.2 認(rèn)證機(jī)制 109
5.3 端點(diǎn)的模型 111
5.3.1 常見模型 111
5.3.2 特定于應(yīng)用的模型 112
5.4 小結(jié) . 114
第6 章 識(shí)別第三方依賴 . 115
6.1 探測(cè)客戶端框架 115
6.1.1 探測(cè)SPA 框架 116
6.1.2 探測(cè)JavaScript 庫 118
6.1.3 探測(cè)CSS 庫 120
6.2 探測(cè)服務(wù)器端框架 121
6.2.1 標(biāo)頭探測(cè) 121
6.2.2 默認(rèn)錯(cuò)誤信息和404 頁面 122
6.2.3 探測(cè)數(shù)據(jù)庫 . 125
6.3 小結(jié) . 127
第7 章 定位應(yīng)用架構(gòu)中的薄弱點(diǎn) 128
7.1 安全架構(gòu)與不安全架構(gòu)的標(biāo)志 129
7.2 多層安全機(jī)制 . 134
7.3 采納和重構(gòu) 135
7.4 小結(jié) . 137
第8 章 部分總結(jié) 139
第二部分 攻擊
第9 章 Web 應(yīng)用入侵簡(jiǎn)介 143
9.1 黑客的心態(tài) 143
9.2 運(yùn)用偵察 145
第10 章 XSS 攻擊 147
10.1 XSS 的發(fā)現(xiàn)和利用 148
10.2 儲(chǔ)存型XSS 152
10.3 反射型XSS 154
10.4 DOM 型XSS 157
10.5 突變型XSS 160
10.6 小結(jié) 162
第11 章 CSRF 攻擊 . 163
11.1 查詢參數(shù)篡改 164
11.2 替換GET 的有效載荷 169
11.3 針對(duì)POST 端點(diǎn)的CSRF 170
11.4 小結(jié) 172
第12 章 XXE 攻擊 173
12.1 直接型XXE 174
12.2 間接型XXE 177
12.3 小結(jié) 179
第13 章 注入攻擊 . 181
13.1 SQL 注入攻擊 181
13.2 代碼注入 . 186
13.3 命令注入 . 191
13.4 小結(jié) 195
第14 章 DoS 攻擊 196
14.1 ReDoS(Regex DoS)攻擊 197
14.2 邏輯DoS 攻擊 . 200
14.3 DDoS(分布式DoS)攻擊 204
14.4 小結(jié) 205
第15 章 第三方依賴漏洞利用 206
15.1 集成的方法 208
15.1.1 分支和復(fù)制 209
15.1.2 自托管的應(yīng)用程序集成 . 210
15.1.3 源代碼集成 211
15.2 軟件包管理器 212
15.2.1 JavaScript 包管理器 . 212
15.2 2 Java 包管理器 . 214
15.2.3 其他語言的包管理器 215
15.3 CVE(公共漏洞和披露)數(shù)據(jù)庫 216
15.4 小結(jié) 217
第16 章 第二部分總結(jié) 219
第三部分 防御
第17 章 現(xiàn)代Web 應(yīng)用加固 223
17.1 防御性軟件架構(gòu) 224
17.2 全面的代碼審查 225
17.3 漏洞發(fā)現(xiàn) . 225
17.4 漏洞分析 . 226
17.5 漏洞管理 . 227
17.6 回歸測(cè)試 . 228
17.7 緩解策略 . 228
17.8 應(yīng)用偵察和攻擊技術(shù) 229
第18 章 安全的應(yīng)用架構(gòu) 230
18.1 分析功能需求 231
18.2 認(rèn)證和授權(quán) 232
18.2.1 SSL 和TLS 232
18.2.2 安全的憑證 234
18.2.3 散列憑證信息 . 235
18.2.4 2FA 認(rèn)證 238
18.3 PII 和財(cái)務(wù)數(shù)據(jù) 239
18.4 搜索 240
18.5 小結(jié) 240
第19 章 代碼安全審查 243
19.1 如何開始代碼審查 . 244
19.2 原型漏洞與自定義邏輯漏洞 . 245
19.3 代碼安全審查起步 . 247
19.4 安全編碼的反面模式 249
19.4.1 黑名單 250
19.4.2 模板代碼 251
19.4.3 默認(rèn)信任反模式 252
19.4.4 客戶端/ 服務(wù)器分離 252
19.5 小結(jié) 253
第20 章 漏洞發(fā)現(xiàn) . 255
20.1 安全自動(dòng)化 255
20.1.1 靜態(tài)分析 256
20.1.2 動(dòng)態(tài)分析 258
20.1.3 漏洞回歸測(cè)試 . 259
20.2 責(zé)任披露計(jì)劃 262
20.3 漏洞賞金計(jì)劃 263
20.4 第三方滲透測(cè)試 264
20.5 小結(jié) 265
第21 章 漏洞管理 . 266
21.1 漏洞重現(xiàn) . 266
21.2 漏洞嚴(yán)重等級(jí) 267
21.3 通用漏洞評(píng)分系統(tǒng) . 268
21.3.1 CVSS:基礎(chǔ)評(píng)分 . 269
21.3.2 CVSS:時(shí)間評(píng)分 . 271
21.3.3 CVSS:環(huán)境評(píng)分 . 272
21.4 高級(jí)漏洞評(píng)分 273
21.5 分揀、評(píng)分之后 274
21.6 小結(jié) 275
第22 章 防御XSS 攻擊 . 276
22.1 防御XSS 編碼實(shí)踐 . 276
22.2 凈化用戶輸入 279
22.2.1 DOM 解析接收器 . 280
22.2.2 SVG 接收器 . 281
22.2.3 Blob 接收器 . 281
22.2.4 超鏈接凈化 282
22.2.5 HTML 實(shí)體編碼 283
22.3 CSS 284
22.4 阻止XSS 的CSP 285
22.4.1 腳本源 285
22.4.2 Unsafe Eval 和Unsafe Inline 選項(xiàng) 287
22.4.3 實(shí)現(xiàn)CSP 288
22.5 小結(jié) 288
第23 章 防御CSRF 攻擊 290
23.1 標(biāo)頭驗(yàn)證 . 290
23.2 CSRF 令牌 . 292
23.3 防CRSF 編碼實(shí)踐 294
23.3.1 無狀態(tài)GET 請(qǐng)求 294
23.3.2 應(yīng)用級(jí)CSRF 緩解 296
23.4 小結(jié) 297
第24 章 防御XXE 攻擊 . 299
24.1 評(píng)估其他數(shù)據(jù)格式 . 300
24.2 高級(jí)XXE 風(fēng)險(xiǎn) 301
24.3 小結(jié) 302
第25 章 防御注入攻擊 303
25.1 緩解SQL 注入攻擊 303
25.1.1 SQL 注入檢測(cè) . 304
25.1.2 預(yù)編譯語句 306
25.1.3 特定于數(shù)據(jù)庫的防御 308
25.2 通用注入防御 308
25.2.1 潛在的注入目標(biāo) 309
25.2.2 小權(quán)限原則 . 310
25.2.3 命令白名單化 . 311
25.3 小結(jié) 312
第26 章 防御DoS 攻擊 . 314
26.1 防范Regex DoS 攻擊 315
26.2 防范邏輯DoS 攻擊 315
26.3 防范DDoS 攻擊 . 316
26.4 緩解DDoS 攻擊 . 317
26.5 小結(jié) 318
第27 章 加固第三方依賴 320
27.1 評(píng)估依賴關(guān)系樹 320
27.1.1 依賴關(guān)系樹建模 321
27.1.2 依賴關(guān)系樹實(shí)例 322
27.1.3 自動(dòng)評(píng)估 322
27.2 安全集成技術(shù) 323
27.2.1 關(guān)注點(diǎn)分離 323
27.2.2 安全包管理 324
27.3 小結(jié) 325
第28 章 第三部分小結(jié) 327
28.1 軟件安全的歷史 327
28.2 Web 應(yīng)用偵察 329
28.3 攻擊 331
28.4 防御 332
第29 章 總結(jié) . 336
作者介紹 339
封面介紹 339