第1章 什麼是 web應用的安全隱患 1
1-1 安全隱患即“能用於作惡的bug” 2
1-2 為什麼存在安全隱患會有問題 3
經濟損失 3
法律要求 3
對用戶造成不可逆的傷害 4
欺騙用戶 4
被用於構建僵屍網絡 4
1-3 産生安全隱患的原因 6
1-4 安全性 bug與安全性功能 7
1-5 本書的結構 8
第2章 搭建試驗環境 9
2-1試驗環境概要 10
2-2 安裝 vmware player 11
什麼是 vmware player 11
下載 vmware player 11
安裝 vmware player 12
2-3 安裝虛擬機及運行確認 14
虛擬機啓動確認 14
虛擬機的使用方法 15
編輯 hosts文件 16
使用 ping確認連接 16
apache 與php的運行確認 17
設置並確認郵箱賬號 17
2-4 安裝 fiddler 18
什麼是 fiddler 18
安裝 fiddler 18
fiddler 的運行確認及簡單用法 18
參考:虛擬機的數據一覽 19
參考:如果無法連接試驗環境的pop3服務器 20
第3章 web 安全基礎:http、會話管理、同源策略 21
3-1 http 與會話管理 22
為什麼要學習 http 22
最簡單的 http 22
使用 fiddler觀察http消息 23
請求消息 24
響應消息 24
狀態行 25
響應頭信息 25
如果將 http比喻為對話 25
輸入-確認-注冊模式 26
post 方法 28
消息體 28
百分號編碼 29
referer 29
get 和post的使用區彆 29
hidden 參數能夠被更改 30
將 hidden參數的更改比作對話 32
hidden 參數的優點 32
無狀態的 http認證 33
體驗 basic認證 33
專欄 認證與授權 36
cookie 與會話管理 36
使用 cookie的會話管理 39
會話管理的擬人化解說 39
會話 id泄漏的原因 42
cookie 的屬性 42
專欄 cookie monster bug 44
總結 45
3-2 被動攻擊與同源策略 46
主動攻擊與被動攻擊 46
主動攻擊 46
被動攻擊 46
惡意利用正規網站進行的被動攻擊 47
跨站被動攻擊 48
瀏覽器如何防禦被動攻擊 48
沙盒 49
同源策略 49
應用程序安全隱患與被動攻擊 52
專欄 第三方 javascript 53
javascript 以外的跨域訪問 54
frame 元素與iframe元素 54
專欄 x-frame-options 54
img 元素 54
script 元素 54
css 55
form 元素的action屬性 55
總結 56
第4章 web應用的各種安全隱患 57
4-1 web 應用的功能與安全隱患的對應關係 58
安全隱患産生於何處 58
注入型隱患 59
總結 60
4-2 輸入處理與安全性 61
什麼是 web應用的輸入處理 61
檢驗字符編碼 62
轉換字符編碼 62
檢驗並轉換字符編碼的實例 62
專欄 字符編碼的自動轉換與安全性 64
輸入校驗 64
輸入校驗的目的 64
輸入校驗與安全性 65
二進製安全與空字節攻擊 65
僅校驗輸入值並不是安全性策略 66
輸入校驗的依據是應用程序的規格 67
哪些參數需要校驗 67
php 的正則錶達式庫 67
使用正則錶達式檢驗輸入值的實例(1) 1~5 個字符的字母數字 68
使用正則錶達式檢驗輸入值的實例(2) 住址欄 70
專欄 請注意 mb_ereg中的d與w 70
範例 70
專欄 輸入校驗與框架 71
總結 72
參考:錶示“非控製字符的字符”的正則錶達式 73
4-3 頁麵顯示的相關問題 75
4.3.1 跨站腳本(基礎篇) 75
概要 75
攻擊手段與影響 76
xss 竊取cookie值 76
通過 javascript攻擊 79
篡改網頁 80
反射型 xss與存儲型xss 82
安全隱患的産生原因 84
html 轉義的概要 84
元素內容的 xss 85
沒有用引號括起來的屬性值的 xss 85
用引號括起來的屬性值的 xss 85
對策 86
xss 對策的基礎 86
指定響應的字符編碼 87
xss 的輔助性對策 88
對策總結 89
參考:使用perl的對策示例 89
使用 perl進行html轉義的方法 89
指定響應的字符編碼 89
4.3.2 跨站腳本(進階篇) 90
href 屬性與src屬性的xss 91
生成 url時的對策. 92
校驗鏈接網址 92
javascript 的動態生成 92
事件綁定函數的 xss 92
script 元素的xss 94
javascript 字符串字麵量動態生成的對策 95
dom based xss 97
允許 html標簽或css時的對策 99
參考:perl中轉義unicode的函數 99
4.3.3 錯誤消息導緻的信息泄漏 100
總結 100
繼續深入學習 100
4-4 sql 調用相關的安全隱患 101
4.4.1 sql 注入 101
概要 101
攻擊手段與影響 102
示例腳本解說 102
錯誤消息導緻的信息泄漏 103
union select 緻使的信息泄漏 104
使用 sql注入繞過認證 104
通過 sql注入攻擊篡改數據 106
其他攻擊 107
專欄 數據庫中錶名與列名的調查方法 108
安全隱患的産生原因 109
字符串字麵量的問題 109
針對數值的 sql注入攻擊 110
對策 110
使用占位符拼接 sql語句 111
專欄 采用 mdb2的原因 111
為什麼使用占位符會安全 111
參考:like語句與通配符 113
使用占位符的各種處理 114
sql 注入的輔助性對策 116
總結 117
繼續深入學習 117
參考:無法使用占位符時的對策 117
參考:perl+mysql的安全連接方法 118
參考:php+pdo+mysql的安全連接方法 118
參考:java+mysql的安全連接方法 118
4-5 關鍵處理中引入的安全隱患 120
4.5.1 跨站請求僞造(csrf) 120
概要 120
攻擊手段與影響 121
輸入-執行”模式的 csrf攻擊 121
csrf 攻擊與xss攻擊 124
存在確認頁麵時的 csrf攻擊 125
專欄 針對內部網絡的 csrf攻擊 127
安全隱患的産生原因 128
對策 129
篩選齣需要防範 csrf攻擊的頁麵 129
確認是正規用戶自願發送的請求 130
專欄 令牌與一次性令牌 131
csrf 的輔助性對策 133
對策總結 133
4-6 不完善的會話管理 134
4.6.1 會話劫持的原因及影響 134
預測會話 id 134
竊取會話 id 134
挾持會話 id 135
會話劫持的方法總結 135
會話劫持的影響 135
4.6.2 會話 id可預測 136
概要 136
攻擊手段與影響 136
常見的會話 id生成方法 136
使用推測齣的會話 id嘗試僞裝 137
僞裝造成的影響 137
安全隱患的産生原因 137
對策 138
改善 php的會話id的隨機性的方法 138
參考:自製會話管理機製産生的其他隱患 139
4.6.3 會話 id嵌入url 139
概要 139
攻擊手段與影響 140
會話 id嵌入url所需的條件 140
範例腳本解說 141
通過 referer泄漏會話id所需的條件 142
攻擊流程 142
事故性的會話 id泄漏 143
影響 144
安全隱患的産生原因 144
對策 144
php 144
java servlet(j2ee) 145
asp.net 145
4.6.4 固定會話 id 145
概要 145
攻擊手段與影響 146
示例腳本介紹 146
會話固定攻擊解說 148
登錄前的會話固定攻擊 148
會話采納 151
僅在 cookie中保存會話id的網站固定會話id 151
會話固定攻擊的影響 151
安全隱患的産生原因 152
對策 152
無法更改會話 id時采用令牌 153
登錄前的會話固定攻擊的對策 154
總結 154
4-7 重定嚮相關的安全隱患 155
4.7.1 自由重定嚮漏洞 155
概要 155
攻擊手段與影響 156
安全隱患的産生原因 159
允許自由重定嚮的情況 159
對策 160
固定重定嚮的目標 url 160
使用編號指定重定嚮的目標 url 160
校驗重定嚮的目標域名 160
專欄 警告頁麵 162
4.7.2 http 消息頭注入 162
概要 162
攻擊手段與影響 163
重定嚮至外部域名 165
專欄 http 響應截斷攻擊 166
生成任意 cookie 166
顯示僞造頁麵 168
安全隱患的産生原因 170
專欄 http 消息頭與換行 171
對策 171
對策 1:不將外界參數作為http響應消息頭輸齣 171
對策 2:執行以下兩項內容 171
專欄 php 的header函數中進行的換行符校驗 173
4.7.3 重定嚮相關的安全隱患總結 173
4-8 cookie 輸齣相關的安全隱患 174
4.8.1 cookie 的用途不當 174
不該保存在 cookie中的數據 174
參考:最好不要在cookie中保存數據的原因 174
專欄 padding oracle 攻擊與ms10-070 176
4.8.2 cookie 的安全屬性設置不完善 176
概要 176
攻擊手段與影響 177
關於抓包方法的注意點 180
安全隱患的産生原因 181
什麼樣的應用程序不能在 cookie中設置安全屬性 181
對策 181
給保存會話 id的cookie設置安全屬性的方法 182
使用令牌的對策 182
使用令牌能確保安全性的原因 184
除安全屬性外其他屬性值需要注意的地方 184
domain 屬性 184
path 屬性 185
expires 屬性 185
httponly 屬性 185
總結 185
4-9 發送郵件的問題 186
4.9.1 發送郵件的問題概要 186
郵件頭注入漏洞 186
使用 hidden參數保存收件人信息 186
參考:郵件服務器的開放轉發 187
4.9.2 郵件頭注入漏洞 187
概要 187
攻擊手段與影響 188
攻擊方式 1:添加收件人 190
攻擊方式 2:篡改正文 191
通過郵件頭注入攻擊添加附件 192
安全隱患的産生原因 193
對策 194
使用專門的程序庫來發送郵件 194
不將外界傳入的參數包含在郵件頭中 194
發送郵件時確保外界傳入的參數中不包含換行符 195
郵件頭注入的輔助性對策 195
總結 196
繼續深入學習 196
10-4 文件處理相關的問題 197
4.10.1 目錄遍曆漏洞 197
概要 197
攻擊手段與影響 198
專欄 從腳本源碼開始的一連串的信息泄漏 200
安全隱患的産生原因 200
對策 201
避免由外界指定文件名 201
文件名中不允許包含目錄名 201
專欄 basename 函數與空字節 202
限定文件名中僅包含字母和數字 202
總結 203
4.10.2 內部文件被公開 203
概要 203
攻擊手段與影響 203
安全隱患的産生原因 204
對策 205
參考:apache中隱藏特定文件的方法 205
11-4 調用 os命令引起的安全隱患 206
4.11.1 os 命令注入 206
概要 206
攻擊手段與影響 207
調用 sendmail命令發送郵件 207
os 命令注入攻擊與影響 209
安全隱患的産生原因 210
在 shell中執行多條命令 210
使用瞭內部調用 shell的函數 211
安全隱患的産生原因總結 212
對策 212
在設計階段決定對策方針 213
選擇不調用 os命令的實現方法 213
避免使用內部調用 shell的函數 213
不將外界輸入的字符串傳遞給命令行參數 216
使用安全的函數對傳遞給 os命令的參數進行轉義 216
os 命令注入攻擊的輔助性對策 217
參考:內部調用shell的函數 218
12-4 文件上傳相關的問題 219
4.12.1 文件上傳問題的概要 219
針對上傳功能的 dos攻擊 219
專欄 內存使用量與 cpu使用時間等其他需要關注的資源 220
使上傳的文件在服務器上作為腳本執行 220
誘使用戶下載惡意文件 221
越權下載文件 222
4.12.2 通過上傳文件使服務器執行腳本 222
概要 222
攻擊手段與影響 223
示例腳本解說 223
專欄 警惕文件名中的 xss 224
php 腳本的上傳與執行 224
安全隱患的産生原因 225
對策 225
專欄 校驗擴展名時的注意點 228
4.12.3 文件下載引起的跨站腳本 228
概要 228
攻擊手段與影響 229
圖像文件引起的 xss 229
pdf 下載引起的xss 231
安全隱患的産生原因 234
內容為圖像時 234
內容不為圖像時 235
對策 236
文件上傳時的對策 236
專欄 bmp 格式的注意點與ms07-057 238
文件下載時的對策 238
其他對策 239
專欄 將圖像托管在其他域名 240
參考:用戶pc中沒有安裝對應的應用程序時 240
總結 241
13-4 include 相關的問題 242
4.13.1 文件包含攻擊 242
概要 242
攻擊手段與影響 243
文件包含引發的信息泄漏 244
執行腳本 1:遠程文件包含攻擊(rfi) 244
專欄 rfi 攻擊的變種 245
執行腳本 2:惡意使用保存會話信息的文件 246
安全隱患的産生原因 248
對策 248
總結 248
14-4 eval 相關的問題 249
4.14.1 eval 注入 249
概要 249
攻擊手段與影響 250
存在漏洞的應用 250
攻擊手段 252
安全隱患的産生原因 253
對策 253
不使用 eval 253
避免 eval的參數中包含外界傳入的參數 254
限製外界傳入 eval的參數中隻包含字母和數字 254
參考:perl的eval代碼塊形式 254
總結 255
繼續深入學習 255
15-4 共享資源相關的問題 256
4.15.1 競態條件漏洞 256
概要 256
攻擊手段與影響 257
安全隱患的産生原因 258
對策 259
避免使用共享資源 259
使用互斥鎖 259
總結 260
參考:java servlet的其他注意點 260
第5章 典型安全功能 261
5-1 認證 262
5.1.1 登錄功能 262
針對登錄功能的攻擊 262
通過 sql注入攻擊來跳過登錄功能 262
通過 sql注入攻擊獲取用戶密碼 263
在登錄頁麵進行暴力破解 263
通過社會化攻擊得到用戶密碼 263
通過釣魚方法獲取密碼 264
登錄功能被破解後的影響 264
如何防止非法登錄 264
確保係統中不存在 sql注入等安全性bug 264
設置難以猜測的密碼 265
密碼的字符種類和長度要求 265
密碼的使用現狀 266
應用程序設計中關於密碼的需求 266
嚴格的密碼檢查原則 267
5.1.2 針對暴力破解攻擊的對策 268
初步認識賬號鎖定 268
暴力破解攻擊的檢測和對策 268
字典攻擊 269
joe 賬號檢索 269
逆嚮暴力破解 269
針對變種暴力破解的對策 269
5.1.3 密碼保存方法 271
保護密碼的必要性 271
利用加密方式進行密碼保護及其注意事項 271
專欄 數據庫加密和密碼保護 272
利用信息摘要來進行密碼保護及其注意事項 272
什麼是信息摘要 272
專欄 密碼學級彆的散列函數需要滿足的要求 273
利用信息摘要保護密碼 273
威脅 1: 離綫暴力破解 274
威脅 2:彩虹破解(rainbow crack) 275
威脅 3:在用戶數據庫裏創建密碼字典 276
如何防止散列值被破解 277
對策 1: salt(加鹽) 277
對策 2:stretching(延展計算) 278
實現示例 278
專欄 密碼泄露途徑 280
5.1.4 自動登錄 280
危險的實現方式示例 281
安全的自動登錄實現方式 281
延長會話有效期 282
使用令牌實現自動登錄 283
基於認證票的自動登錄方式 286
三種方法的比較 286
如何降低自動登錄帶來的風險 286
5.1.5 登錄錶單 286
專欄 密碼確實需要掩碼顯示嗎 287
5.1.6 如何顯示錯誤消息 288
5.1.7 退齣登錄功能 289
5.1.8 認證功能總結 290
參考:彩虹錶原理 290
5-2賬號管理 293
5.2.1 用戶注冊 293
郵箱地址確認 293
防止用戶 id重復 295
例子 1:id相同密碼不同可以注冊的網站 295
例子 2:用戶id沒有添加唯一性約束的網站 295
應對自動用戶注冊 296
利用 captcha防止自動注冊 296
5.2.2 修改密碼 297
確認當前密碼 297
修改密碼後嚮用戶發送郵件通知 298
密碼修改功能容易發生的漏洞 298
5.2.3 修改郵箱地址 298
修改郵箱地址功能要考慮的安全對策 299
5.2.4 密碼找迴 299
麵嚮管理員的密碼找迴功能 300
麵嚮用戶的密碼找迴功能 300
對用戶進行身份確認 301
如何發送密碼通知 301
5.2.5 賬號凍結 302
5.2.6 賬號刪除 303
5.2.7 賬號管理總結 303
5 3 授權 304
5.3.1 什麼是授權 304
5.3.2 典型的授權漏洞 304
更改資源 id後可以查看沒有權限查看的信息 304
隻控製菜單的顯示或不顯示 305
使用 hidden參數或者cookie保存權限信息 306
授權漏洞總結 307
專欄 將私密信息嵌入 url進行授權處理 307
5.3.3 授權管理的需求設計 307
專欄 什麼是角色 308
5.3.4 如何正確實現授權管理 308
5.3.5 總結 309
5 4 日誌輸齣 310
5.4.1 日誌輸齣的目的 310
5.4.2 日誌種類 310
錯誤日誌 311
訪問日誌 311
調試日誌 311
5.4.3 有關日誌輸齣的需求 311
需要記錄到日誌裏的所有事件 312
日誌裏應包括的信息和格式 312
日誌文件保護 312
日誌文件保存位置 313
日誌文件保存期限 313
服務器的時間調整 313
5.4.4 實現日誌輸齣 313
5.4.5 總結 314
第6章 字符編碼和安全 315
6-1 字符編碼和安全概要 316
6-2 字符集 317
什麼是字符集 317
ascii 和iso-8859-1 317
jis 規定的字符集 318
微軟標準字符集 318
unicode 319
gb2312 319
gbk 319
gb18030 320
不同字符相同編碼的問題 320
字符集的處理引起的漏洞 320
6-3 字符編碼方式 321
什麼是編碼方式 321
shift_jis 321
euc-jp 325
iso-2022-jp 326
utf-16 326
utf-8 327
gb2312 329
gbk 330
gb18030 331
6-4 由字符編碼引起的漏洞總結 332
字符編碼方式中非法數據導緻的漏洞 332
對字符編碼方式處理存在紕漏導緻的漏洞 332
在不同字符集間變換導緻的漏洞 332
6-5 如何正確處理字符編碼 333
在應用內統一使用的字符集 333
輸入非法數據時報錯並終止處理 335
處理數據時使用正確的編碼方式 335
專欄 調用 htmlspecialchars函數時必須指定字符編碼方式 336
輸齣時設置正確的字符編碼方式 336
其他對策:盡量避免編碼自動檢測 337
6-6 總結 338
如何提高 web網站的安全性 第7章 339
7-1 針對 web服務器的攻擊途徑和防範措施 341
7.1.1 利用基礎軟件漏洞進行攻擊 341
7.1.2 非法登錄 341
7.1.3 對策 341
停止運行不需要的軟件 342
定期實施漏洞防範措施 342
選定軟件時確認軟件的升級狀況 342
確定打補丁方式 343
關注各種漏洞相關信息 344
確認漏洞後調查補丁狀況以及防範對策、並製定對應計劃 344
執行漏洞對應計劃 345
對不需要對外公開的端口或服務加以訪問限製 346
通過端口掃描確認各端口服務狀態 347
提高認證強度 348
7-2 防範僞裝攻擊的對策 349
7.2.1 網絡僞裝的手段 349
針對 dns服務器的攻擊 349
專欄 visa 域名問題 350
arp 欺騙攻擊 350
7.2.2 釣魚攻擊 350
7.2.3 web 網站的僞裝攻擊對策 351
網絡層的對策 351
同一網段內不放置可能存在漏洞的服務器 351
強化 dns運維 351
引入 ssl/tls 352
專欄 免費的數字證書 354
使用便於記憶的域名 354
7-3 防範網絡監聽、篡改的對策 355
7.3.1 網絡監聽、篡改的途徑 355
通過無綫網進行監聽、篡改 355
利用交換機端口鏡像 355
利用代理服務器 355
僞裝成 dhcp服務器 355
使用 arp欺騙攻擊和dns緩存汙染攻擊(dns cache poisoning) 355
7.3.2 中間人攻擊 356
使用 fiddler模擬中間人攻擊 356
專欄 請不要手動安裝證書 358
7.3.3 對策 359
使用 ssl時的注意事項 359
專欄 ssl 認證標簽 360
7-4 防範惡意軟件的對策 361
7.4.1 什麼是 web網站的惡意軟件對策 361
7.4.2 惡意軟件的感染途徑 361
7.4.3 web 網站惡意軟件防範對策概要 362
7.4.4 如何確保服務器不被惡意軟件感染 363
探討是否需要製定針對惡意軟件的防範措施 363
製定病毒防範政策並嚮用戶公開 363
使用防病毒軟件 364
專欄 web 網站的防病毒對策和gumblar的關係 365
7-5 總結 366
開發安全的 web應用所需要的管理 第8章 367
8-1 開發管理中的安全對策概要 368
8-2 開發體製 369
開發標準的製定 369
教育培訓 369
8-3 開發過程 371
8.3.1 規劃階段的注意事項 371
8.3.2 招標時的注意事項 371
專欄 誰應該對安全漏洞負責 372
8.3.3 需求分析時的注意事項 372
8.3.4 概要設計的推進方法 373
8.3.5 詳細設計和編碼階段的注意事項 374
8.3.6 安全性測試的重要性及其方法 374
8.3.7 web 健康診斷基準 374
8.3.8 承包方測試 376
8.3.9 發包方測試(驗收) 376
8.3.10 運維階段的注意事項 377
8-4 總結 378
· · · · · · (
收起)