內容簡介
在網際網路時代,數據安全與個人隱私受到了前所未有的挑戰,各種新奇的攻擊技術層出不窮。如何才能更好地保護我們的數據?本書將帶你走進Web安全的世界,讓你了解Web安全的方方面面。黑客不再變得神秘,攻擊技術原來我也可以會,小網站主自己也能找到正確的安全道路。大公司是怎么做安全的,為什麼要選擇這樣的方案呢?你能在本書中找到答案。詳細的剖析,讓你不僅能“知其然”,更能“知其所以然”。
本書是根據作者若干年實際工作中積累下來的豐富經驗而寫成的,在解決方案上具有極強的可操作性,深入分析了各種錯誤的解決方案與誤區,對安全工作者有很好的參考價值。安全開發流程與運營的介紹,對同行業的工作具有指導意義。
序言
2012年農曆春節,我回到了浙西的老家,外面白雪皚皚。在這與網路隔離的小鄉村里,在這可以夜不閉戶的小鄉村里,過著與網路無關、與安全無關的生活,而我終於可以有時間安安靜靜拜讀吳翰清先生的這本大作了。
認識吳翰清先生源於網路、源於安全,並從網路走向生活,成為朋友。他對於安全技術孜孜不倦的研究,使得他年紀輕輕便成為系統、網路、Web等多方面安全的專家;他對於安全技術的分享,創建了“幻影旅團”組織,培養了一批安全方面的技術人才,並帶動了整個行業的交流氛圍;他和同事在大型網際網路公司對安全方面的不斷實踐,全面保護著阿里巴巴集團的安全;他對於安全的反思和總結並發布在他的部落格上,使得我們能夠更為深入地理解安全的意義,處理安全問題的方法論。而今天,很幸運,我們能系統的地看到吳翰清先生多年在大型網際網路公司工作實踐、總結反思所積累的安全觀和Web安全技術。
中國人自己編寫的安全專著不多,而在這為數不多的書中,絕大部分也都是“黑客攻擊”速成手冊。這些書除了在技術上僅立足於零碎的技術點、工具使用手冊、攻擊過程演示,不系統之外,更為關鍵的是,它們不是以建設者的角度去解決安全問題。吳翰清先生是我非常佩服的“白帽子”,他和一群志同道合的朋友,一直以建設更安全的網際網路為己任,系統地研究安全,積極分享知識,為中國的網際網路安全添磚加瓦。而這本書也正是站在白帽子的視角,講述Web安全的方方面面,它剖析攻擊原理,目的是讓網際網路開發者、技術人員了解原理,並通過自身的實踐,告訴大家分析這些問題的方法論、思想以及對應的防範方案。
最讓我共鳴的是“安全運營”的思路,我相信這也是吳翰清先生這么多年在網際網路公司工作的最大收穫之一,因為運營是網際網路公司的最大特色和法寶。安全是一個動態的過程,因為敵方攻擊手段在變,攻擊方法在變,漏洞不斷出現;我方業務在變,軟體在變,人員在變,妄圖通過一個系統、一個方案解決所有的問題是不現實的,也是不可能的,安全需要不斷地運營、持續地最佳化。
瑞雪兆豐年,一直在下的雪預示著今年的豐收。我想在經歷了2011年中國網際網路最大安全危機之後,如白雪一樣純潔的《白帽子講Web安全》應該會給廣大的從事網際網路技術人員帶來更多的幫助,保障中國網際網路的安全,迎來網際網路的又一個春天。
季昕華 Benjurry
前言
在2010年年中的時候,博文視點的張春雨先生找到我,希望我可以寫一本關於雲計算安全的書。當時雲計算的概念正如日中天,但市面上關於雲計算安全應該怎么做卻缺乏足夠的資料。我由於工作的關係接觸這方面比較多,但考慮到雲計算的未來尚未清晰,以及其他的種種原因,婉拒了張春雨先生的要求,轉而決定寫一本關於Web安全的書。
我的安全之路
我對安全的興趣起源於中學時期。當時在盜版市場買到了一本沒有書號的黑客手冊,其中coolfire 的黑客教程令我印象深刻。此後在有限的能接觸到網際網路的機會裡,我總會想方設法地尋找一些黑客教程,並以實踐其中記載的方法為樂。
在2000年的時候,我進入了西安交通大學學習。在大學期間,最大的收穫,是學校的計算機實驗室平時會對學生開放。當時上網的資費仍然較貴,父母給我的生活費里,除了留下必要的生活所需費用之外,幾乎全部投入在這裡。也是在學校的計算機實驗室里,讓我迅速在這個領域中成長起來。
大學期間,在父母的資助下,我擁有了自己的第一台個人電腦,這加快了我成長的步伐。與此同時,我和一些網際網路上志同道合的朋友,一起建立了一個技術型的安全組織,名字來源於我當時最喜愛的一部動漫:“幻影旅團”。歷經十餘載,“幻影”由於種種原因未能得以延續,但它卻曾以論壇的形式培養出了當今安全行業中非常多的頂尖人才。這也是我在這短短二十餘載人生中的最大成就與自豪。
得益於網際網路的開放性,以及我親手締造的良好技術交流氛圍,我幾乎見證了全部網際網路安全技術的發展過程。在前5年,我投入了大量精力研究滲透測試技術、緩衝區溢出技術、網路攻擊技術等;而在後5年,出於工作需要,我把主要精力放在了對Web安全的研究上。
加入阿里巴巴
發生這種專業方向的轉變,是因為在2005年,我在一位摯友的推薦下,加入了阿里巴巴。加入的過程頗具傳奇色彩,在面試的過程中主管要求我展示自己的能力,於是我遠程關閉了阿里巴巴區域網路上游運營商的一台路由設備,導致阿里巴巴內部網路中斷。事後主管立即要求與運營商重新簽訂可用性協定。
大學時期的興趣愛好,居然可以變成一份正經的職業(當時很多大學都尚未開設網路安全的課程與專業),這使得我的父母很震驚,同時也更堅定了我自己以此作為事業的想法。
在阿里巴巴我很快就嶄露頭角,曾經在區域網路中通過網路嗅探捕獲到了開發總監的信箱密碼;也曾經在壓力測試中一瞬間癱瘓了公司的網路;還有好幾次,成功獲取到了域控伺服器的許可權,從而可以以管理員的身份進入任何一位員工的電腦。
但這些工作成果,都遠遠比不上那厚厚的一摞網站安全評估報告讓我更有成就感,因為我知道,網站上的每一個漏洞,都在影響著成千上萬的用戶。能夠為百萬、千萬的網際網路用戶服務,讓我倍感自豪。當時,Web正在逐漸成為網際網路的核心,Web安全技術也正在興起,於是我義無返顧地投入到對Web安全的研究中。
我於2007年以23歲之齡成為了阿里巴巴集團最年輕的技術專家。雖未有官方統計,但可能也是全集團里最年輕的高級技術專家,我於2010年獲此殊榮。在阿里巴巴,我有幸見證了安全部門從無到有的建設過程。同時由於淘寶、支付寶草創,尚未建立自己的安全團隊,因此我有幸參與了淘寶、支付寶的安全建設,為他們奠定了安全開發框架、安全開發流程的基礎。
對網際網路安全的思考
當時,我隱隱地感覺到了網際網路公司安全,與傳統的網路安全、信息安全技術的區別。就如同開發者會遇到的挑戰一樣,有很多問題,不放到一個海量用戶的環境下,是難以暴露出來的。由於量變引起質變,所以管理10台伺服器,和管理1萬台伺服器的方法肯定會有所區別;同樣的,評估10名工程師的代碼安全,和評估1000名工程師的代碼安全,方法肯定也要有所不同。
網際網路公司安全還有一些鮮明的特色,比如注重用戶體驗、注重性能、注重產品發布時間,因此傳統的安全方案在這樣的環境下可能完全行不通。這對安全工作提出了更高的要求和更大的挑戰。
這些問題,使我感覺到,網際網路公司安全可能會成為一門新的學科,或者說應該把安全技術變得更加工業化。可是我在書店中,卻發現安全類目的書,要么是極為學術化的(一般人看不懂)教科書,要么就是極為娛樂化的(比如一些“黑客工具說明書”類型的書)說明書。極少數能夠深入剖析安全技術原理的書,以我的經驗看來,在工業化的環境中也會存在各種各樣的問題。
這些問題,也就促使我萌發了一種寫一本自己的書,分享多年來工作心得的想法。它將是一本闡述安全技術在企業級套用中實踐的書,是一本大型網際網路公司的工程師能夠真正用得上的安全參考書。因此張春雨先生一提到邀請我寫書的想法時,我沒有做過多的思考,就答應了。
Web是網際網路的核心,是未來雲計算和移動網際網路的最佳載體,因此Web安全也是網際網路公司安全業務中最重要的組成部分。我近年來的研究重心也在於此,因此將選題範圍定在了Web安全。但其實本書的很多思路並不局限於Web安全,而是可以放寬到整個網際網路安全的方方面面之中。
掌握了以正確的思路去看待安全問題,在解決它們時,都將無往而不利。我在2007年的時候,意識到了掌握這種正確思維方式的重要性,因此我告知好友:安全工程師的核心競爭力不在於他能擁有多少個0day,掌握多少種安全技術,而是在於他對安全理解的深度,以及由此引申的看待安全問題的角度和高度。我是如此想的,也是如此做的。
因此在本書中,我認為最可貴的不是那一個個工業化的解決方案,而是在解決這些問題時,背後的思考過程。我們不是要做一個能夠解決問題的方案,而是要做一個能夠“漂亮地”解決問題的方案。這是每一名優秀的安全工程師所應有的追求。
安全啟蒙運動
然而在當今的網際網路行業中,對安全的重視程度普遍不高。有統計顯示,網際網路公司對安全的投入不足收入的百分之一。
在2011年歲末之際,中國網際網路突然捲入了一場有史以來最大的安全危機。12月21日,國內最大的開發者社區CSDN被黑客在網際網路上公布了600萬註冊用戶的數據。更糟糕的是,CSDN在資料庫中明文保存了用戶的密碼。接下來如同一場盛大的交響樂,黑客隨後陸續公布了網易、人人、天涯、貓撲、多玩等多家大型網站的資料庫,一時間風聲鶴唳,草木皆兵。
這些數據其實在黑客的地下世界中已經輾轉流傳了多年,牽扯到了一條巨大的黑色產業鏈。這次的偶然事件使之浮出水面,公之於眾,也讓用戶清醒地認識到中國網際網路的安全現狀有多么糟糕。
以往類似的事件我都會在部落格上說點什麼,但這次我保持了沉默。因為一來知道此種狀況已經多年,網站只是在為以前的不作為而買單;二來要解決“拖庫”的問題,其實是要解決整個網際網路公司的安全問題,遠非保證一個資料庫的安全這么簡單。這不是通過一段文字、一篇文章就能夠講清楚的。但我想最好的答案,可以在本書中找到。
經歷這場危機之後,希望整箇中國網際網路,在安全問題的認識上,能夠有一個新的高度。那這場危機也就物有所值,或許還能藉此契機成就中國網際網路的一場安全啟蒙運動。
這是我的第一本書,也是我堅持自己一個人寫完的書,因此可以在書中盡情地闡述自己的安全世界觀,且對書中的任何錯漏之處以及不成熟的觀點都沒有可以推卸責任的藉口。
由於工作繁忙,寫此書只能利用業餘時間,交稿時間多次推遲,深感寫書的不易。但最終能成書,則有賴於各位親朋的支持,以及編輯的鼓勵,在此深表感謝。本書中很多地方未能寫得更為深入細緻,實乃精力有限所致,尚請多多包涵。
關於白帽子
在安全圈子裡,素有“白帽”、“黑帽”一說。
黑帽子是指那些造成破壞的黑客,而白帽子則是研究安全,但不造成破壞的黑客。白帽子均以建設更安全的網際網路為己任。
我於2008年開始在國內網際網路行業中倡導白帽子的理念,並聯合了一些主要網際網路公司的安全工程師,建立了白帽子社區,旨在交流工作中遇到的各種問題,以及經驗心得。
本書名為《白帽子講Web安全》,即是站在白帽子的視角,講述Web安全的方方面面。雖然也剖析攻擊原理,但更重要的是如何防範這些問題。同時也希望“白帽子”這一理念,能夠更加的廣為人知,為中國網際網路所接受。
本書結構
全書分為4大篇共18章,讀者可以通過瀏覽目錄以進一步了解各篇章的內容。在有的章節末尾,還附上了筆者曾經寫過的一些部落格文章,可以作為延伸閱讀以及本書正文的補充。
第一篇 我的安全世界觀是全書的綱領。在此篇中先回顧了安全的歷史,然後闡述了筆者對安全的看法與態度,並提出了一些思考問題的方式以及做事的方法。理解了本篇,就能明白全書中所涉及的解決方案在抉擇時的取捨。
第二篇 客戶端腳本安全就當前比較流行的客戶端腳本攻擊進行了深入闡述。當網站的安全做到一定程度後,黑客可能難以再找到類似注入攻擊、腳本執行等高風險的漏洞,從而可能將注意力轉移到客戶端腳本攻擊上。
客戶端腳本安全與瀏覽器的特性息息相關,因此對瀏覽器的深入理解將有助於做好客戶端腳本安全的解決方案。
如果讀者所要解決的問題比較嚴峻,比如網站的安全是從零開始,則建議跳過此篇,先閱讀下一篇“伺服器端套用安全”,解決優先權更高的安全問題。
第三篇 伺服器端套用安全就常見的伺服器端套用安全問題進行了闡述。這些問題往往能引起非常嚴重的後果,在網站的安全建設之初需要優先解決這些問題,避免留下任何隱患。
第四篇 網際網路公司安全運營提出了一個大安全運營的思想。安全是一個持續的過程,最終仍然要由安全工程師來保證結果。
在本篇中,首先就網際網路業務安全問題進行了一些討論,這些問題對於網際網路公司來說有時候會比漏洞更為重要。
在接下來的兩章中,首先闡述了安全開發流程的實施過程,以及筆者積累的一些經驗。然後談到了公司安全團隊的職責,以及如何建立一個健康完善的安全體系。
本書也可以當做一本安全參考書,讀者在遇到問題時,可以挑選任何所需要的章節進行閱讀。
致謝
感謝我的妻子,她的支持是對我最大的鼓勵。本書最後的成書時日,是陪伴在她的病床邊完成的,我將銘記一生。
感謝我的父母,是他們養育了我,並一直在背後默默地支持我的事業,使我最終能有機會在這裡寫下這些話。
感謝我的公司阿里巴巴集團,它營造了良好的技術與實踐氛圍,使我能夠有今天的積累。同時也感謝在工作中一直給予我幫助和鼓勵的同事、上司,他們包括但不限於:魏興國、湯城、劉志生、侯欣傑、林松英、聶萬全、謝雄欽、徐敏、劉坤、李澤洋、肖力、葉怡愷。
感謝季昕華先生為本書作序,他一直是所有安全工作者的楷模與學習的對象。
也感謝博文視點的張春雨先生以及他的團隊,是他們的努力使本書最終能與廣大讀者見面。他們的專業意見給了我很多的幫助。
最後特別感謝我的同事周拓,他對本書提出了很多有建設性的意見。
吳翰清
2012年1月於杭州
作者簡介
吳翰清,畢業於西安交通大學少年班,從2000年開始研究網路攻防技術。在大學期間創立了在中國安全圈內極具影響力的組織“幻影”。
目錄
《白帽子講web安全》
第一篇 世界觀安全
第1章 我的安全世界觀 2
1.1 web安全簡史 2
1.1.1 中國黑客簡史 2
1.1.2 黑客技術的發展歷程 3
1.1.3 web安全的興起 5
1.2 黑帽子,白帽子 6
1.3 返璞歸真,揭秘安全的本質 7
1.4 破除迷信,沒有銀彈 9
1.5 安全三要素 10
1.6 如何實施安全評估 11
1.6.1 資產等級劃分 12
1.6.2 威脅分析 13
1.6.3 風險分析 14
1.6.4 設計安全方案 15
1.7 白帽子兵法 16
1.7.1 secure by default原則 16
1.7.2 縱深防禦原則 18
1.7.3 數據與代碼分離原則 19
.1.7.4 不可預測性原則 21
1.8 小結 22
(附)誰來為漏洞買單? 23
第二篇 客戶端腳本安全
第2章 瀏覽器安全 26
2.1 同源策略 26
2.2 瀏覽器沙箱 30
2.3 惡意網址攔截 33
2.4 高速發展的瀏覽器安全 36
2.5 小結 39
第3章 跨站腳本攻擊(xss) 40
3.1 xss簡介 40
3.2 xss攻擊進階 43
3.2.1 初探xss payload 43
3.2.2 強大的xss payload 46
3.2.3 xss 攻擊平台 62
3.2.4 終極武器:xss worm 64
3.2.5 調試javascript 73
3.2.6 xss構造技巧 76
3.2.7 變廢為寶:mission impossible 82
3.2.8 容易被忽視的角落:flash xss 85
3.2.9 真的高枕無憂嗎:javascript開發框架 87
3.3 xss的防禦 89
3.3.1 四兩撥千斤:httponly 89
3.3.2 輸入檢查 93
3.3.3 輸出檢查 95
3.3.4 正確地防禦xss 99
3.3.5 處理富文本 102
3.3.6 防禦dom based xss 103
3.3.7 換個角度看xss的風險 107
3.4 小結 107
第4章 跨站點請求偽造(csrf) 109
4.1 csrf簡介 109
4.2 csrf進階 111
4.2.1 瀏覽器的cookie策略 111
4.2.2 p3p頭的副作用 113
4.2.3 get? post? 116
4.2.4 flash csrf 118
4.2.5 csrf worm 119
4.3 csrf的防禦 120
4.3.1 驗證碼 120
4.3.2 referer check 120
4.3.3 anti csrf token 121
4.4 小結 124
第5章 點擊劫持(clickjacking) 125
5.1 什麼是點擊劫持 125
5.2 flash點擊劫持 127
5.3 圖片覆蓋攻擊 129
5.4 拖拽劫持與數據竊取 131
5.5 clickjacking 3.0:觸屏劫持 134
5.6 防禦clickjacking 136
5.6.1 frame busting 136
5.6.2 x-frame-options 137
5.7 小結 138
第6章 html 5 安全 139
6.1 html 5新標籤 139
6.1.1 新標籤的xss 139
6.1.2 iframe的sandbox 140
6.1.3 link types: noreferrer 141
6.1.4 canvas的妙用 141
6.2 其他安全問題 144
6.2.1 cross-origin resource sharing 144
6.2.2 postmessage——跨視窗傳遞訊息 146
6.2.3 web storage 147
6.3 小結 150
第三篇 伺服器端套用安全
第7章 注入攻擊 152
7.1 sql注入 152
7.1.1 盲注(blind injection) 153
7.1.2 timing attack 155
7.2 資料庫攻擊技巧 157
7.2.1 常見的攻擊技巧 157
7.2.2 命令執行 158
7.2.3 攻擊存儲過程 164
7.2.4 編碼問題 165
7.2.5 sql column truncation 167
7.3 正確地防禦sql注入 170
7.3.1 使用預編譯語句 171
7.3.2 使用存儲過程 172
7.3.3 檢查數據類型 172
7.3.4 使用安全函式 172
7.4 其他注入攻擊 173
7.4.1 xml注入 173
7.4.2 代碼注入 174
7.4.3 crlf注入 176
7.5 小結 179
第8章 檔案上傳漏洞 180
8.1 檔案上傳漏洞概述 180
8.1.1 從fckeditor檔案上傳漏洞談起 181
8.1.2 繞過檔案上傳檢查功能 182
8.2 功能還是漏洞 183
8.2.1 apache檔案解析問題 184
8.2.2 iis檔案解析問題 185
8.2.3 php cgi路徑解析問題 187
8.2.4 利用上傳檔案釣魚 189
8.3 設計安全的檔案上傳功能 190
8.4 小結 191
第9章 認證與會話管理 192
9.1 who am i? 192
9.2 密碼的那些事兒 193
9.3 多因素認證 195
9.4 session與認證 196
9.5 session fixation攻擊 198
9.6 session保持攻擊 199
9.7 單點登錄(sso) 201
9.8 小結 203
第10章 訪問控制 205
10.1 what can i do? 205
10.2 垂直許可權管理 208
10.3 水平許可權管理 211
10.4 oauth簡介 213
10.5 小結 219
第11章 加密算法與隨機數 220
11.1 概述 220
11.2 stream cipher attack 222
11.2.1 reused key attack 222
11.2.2 bit-flipping attack 228
11.2.3 弱隨機iv問題 230
11.3 wep破解 232
11.4 ecb模式的缺陷 236
11.5 padding oracle attack 239
11.6 密鑰管理 251
11.7 偽隨機數問題 253
11.7.1 弱偽隨機數的麻煩 253
11.7.2 時間真的隨機嗎 256
11.7.3 破解偽隨機數算法的種子 257
11.7.4 使用安全的隨機數 265
11.8 小結 265
(附)understanding md5 length extension attack 267
第12章 web框架安全 280
12.1 mvc框架安全 280
12.2 模板引擎與xss防禦 282
12.3 web框架與csrf防禦 285
12.4 http headers管理 287
12.5 數據持久層與sql注入 288
12.6 還能想到什麼 289
12.7 web框架自身安全 289
12.7.1 struts 2命令執行漏洞 290
12.7.2 struts 2的問題補丁 291
12.7.3 spring mvc命令執行漏洞 292
12.7.4 django命令執行漏洞 293
12.8 小結 294
第13章 套用層拒絕服務攻擊 295
13.1 ddos簡介 295
13.2 套用層ddos 297
13.2.1 cc攻擊 297
13.2.2 限制請求頻率 298
13.2.3 道高一尺,魔高一丈 300
13.3 驗證碼的那些事兒 301
13.4 防禦套用層ddos 304
13.5 資源耗盡攻擊 306
13.5.1 slowloris攻擊 306
13.5.2 http post dos 309
13.5.3 server limit dos 310
13.6 一個正則引發的血案:redos 311
13.7 小結 315
第14章 php安全 317
14.1 檔案包含漏洞 317
14.1.1 本地檔案包含 319
14.1.2 遠程檔案包含 323
14.1.3 本地檔案包含的利用技巧 323
14.2 變數覆蓋漏洞 331
14.2.1 全局變數覆蓋 331
14.2.2 extract()變數覆蓋 334
14.2.3 遍歷初始化變數 334
14.2.4 import_request_variables變數覆蓋 335
14.2.5 parse_str()變數覆蓋 335
14.3 代碼執行漏洞 336
14.3.1 “危險函式”執行代碼 336
14.3.2 “檔案寫入”執行代碼 343
14.3.3 其他執行代碼方式 344
14.4 定製安全的php環境 348
14.5 小結 352
第15章 web server配置安全 353
15.1 apache安全 353
15.2 nginx安全 354
15.3 jboss遠程命令執行 356
15.4 tomcat遠程命令執行 360
15.5 http parameter pollution 363
15.6 小結 364
第四篇 網際網路公司安全運營
第16章 網際網路業務安全 366
16.1 產品需要什麼樣的安全 366
16.1.1 網際網路產品對安全的需求 367
16.1.2 什麼是好的安全方案 368
16.2 業務邏輯安全 370
16.2.1 永遠改不掉的密碼 370
16.2.2 誰是大贏家 371
16.2.3 瞞天過海 372
16.2.4 關於密碼取回流程 373
16.3 賬戶是如何被盜的 374
16.3.1 賬戶被盜的途徑 374
16.3.2 分析賬戶被盜的原因 376
16.4 網際網路的垃圾 377
16.4.1 垃圾的危害 377
16.4.2 垃圾處理 379
16.5 關於網路釣魚 380
16.5.1 釣魚網站簡介 381
16.5.2 郵件釣魚 383
16.5.3 釣魚網站的防控 385
16.5.4 網購流程釣魚 388
16.6 用戶隱私保護 393
16.6.1 網際網路的用戶隱私挑戰 393
16.6.2 如何保護用戶隱私 394
16.6.3 do-not-track 396
16.7 小結 397
(附)麻煩的終結者 398
第17章 安全開發流程(sdl) 402
17.1 sdl簡介 402
17.2 敏捷sdl 406
17.3 sdl實戰經驗 407
17.4 需求分析與設計階段 409
17.5 開發階段 415
17.5.1 提供安全的函式 415
17.5.2 代碼安全審計工具 417
17.6 測試階段 418
17.7 小結 420
第18章 安全運營 422
18.1 把安全運營起來 422
18.2 漏洞修補流程 423
18.3 安全監控 424
18.4 入侵檢測 425
18.5 緊急回響流程 428
18.6 小結 430
(附)談談網際網路企業安全的發展方向 431
· · · · · ·