
1. 先從一件小事說起為什么你總覺得黑客離你很遠又很近做安全攻防這些年被問最多的一句話既不是某個新漏洞的技術(shù)細節(jié)也不是某個安全產(chǎn)品的配置方法而是特別樸素的一句黑客到底是怎么打進來的每次聽到這個問題我都覺得一兩句話很難講清因為攻擊往往不是單一的一招而是一條完整的鏈路。但反過來想只要我們把這些最常見的手法逐個拆開就會發(fā)現(xiàn)那些聽起來唬人的名詞底層邏輯一點都不復雜。這篇文章里的7種攻擊——SQL注入、XSS、CSRF、文件上傳漏洞、目錄遍歷與敏感文件泄露、暴力破解與弱口令、DDoS——幾乎覆蓋了普通人能聽到的大部分攻擊類型。它們分別對應著偷數(shù)據(jù)、偷身份、開后門、翻底牌、猜密碼、搞癱服務這幾件事。不管你是做開發(fā)的、做運維的、做測試的還是單純對黑客技術(shù)感到好奇的網(wǎng)友把這7種攻擊理解透你就拿到了看懂安全圈大部分新聞的地基往后自己排查系統(tǒng)也會更有方向。1.1 一次典型攻擊的真實樣子我先描述一個場景某天一家小公司的客服系統(tǒng)突然登錄不上了。運維登上去一看數(shù)據(jù)庫里的客戶信息被導走了后臺多了一個陌生賬號服務器上還跑著一個奇怪的進程。這一連串事情看著像闖空門但拆開看就是典型的組合拳先用弱口令猜到后臺密碼登錄后找到文件上傳功能放了一個腳本腳本被服務器執(zhí)行后拿到系統(tǒng)權(quán)限最后通過數(shù)據(jù)庫備份功能把資料導走。你會發(fā)現(xiàn)中間每一步用到的都是這篇文章要講的“基礎(chǔ)知識”。攻擊者不是什么神人他只是把幾個常見問題串成了一條路。所以要理解黑客先別急著背漏洞編號、記利用代碼把每種攻擊“為什么能成功”想明白比什么都強。1.2 7種攻擊的共同邏輯這些攻擊方式五花八門但底層都有一個共同邏輯攻擊者總在尋找“信任邊界”被打破的地方。網(wǎng)站信任了不該信任的用戶輸入程序信任了不該信任的上傳文件用戶信任了不該信任的鏈接服務器暴露了不該暴露的信息。攻擊者的工作就是找到這份信任的邊界在哪里然后一腳踩過去。后面的內(nèi)容全都是圍繞“邊界失控”這四個字展開的。2. 7種攻擊一次分清一張表看明白每種攻擊的“壞心思”2.1 攻擊目標決定攻擊方式不管攻擊手法怎么變化目的無非三種偷數(shù)據(jù)、偷身份、搞癱瘓。偷數(shù)據(jù)主要面向數(shù)據(jù)庫、文件、配置信息偷身份面向賬號體系搞癱瘓則是讓你無法對外服務。目的不同攻擊者會用完全不同的手段上手前先把這個前提搞清楚再去理解每種攻擊就會清晰很多。這里要特別強調(diào)一點攻擊者不是一臺機器而是一個有耐心、有目標的人。他會先判斷目標的“價值”在哪里再決定用什么手段。一個只有靜態(tài)頁面的小博客和一家存著大量訂單數(shù)據(jù)的電商平臺在攻擊者眼里完全是兩種東西。所以你會發(fā)現(xiàn)有些攻擊手法“低級”但天天有人用因為它對某些目標特別有效。2.2 7種常見攻擊速查表攻擊類型通俗說法主要目標最后一擊SQL注入讓數(shù)據(jù)庫把用戶輸入當命令執(zhí)行數(shù)據(jù)庫里的數(shù)據(jù)拖庫、刪庫、改數(shù)據(jù)XSS在別人瀏覽器里跑你的腳本網(wǎng)站用戶盜登錄態(tài)、釣魚、鍵盤記錄CSRF借你的身份發(fā)請求已登錄用戶替你轉(zhuǎn)賬、改設(shè)置、發(fā)帖文件上傳漏洞把一個可執(zhí)行文件傳上服務器網(wǎng)站服務器拿到服務器控制權(quán)目錄遍歷與敏感文件泄露看到不該看的文件源碼、配置、備份為下一步攻擊提供彈藥暴力破解與弱口令一次一次試密碼登錄入口接管賬號DDoS用海量請求堵死服務網(wǎng)站可用性服務宕機、業(yè)務停擺這張表建議收藏后面每一類我都會拆開講原理也會聊到現(xiàn)實里最容易被忽視的細節(jié)。因為你光知道“有這種攻擊”沒用得能判斷自己的系統(tǒng)最容易栽在哪一類。2.3 攻擊不是孤立行為攻擊者很少只用一招。通常第一步是收集信息可能是目錄遍歷、信息泄露第二步是尋找入口可能是弱口令、SQL注入第三步是擴大戰(zhàn)果可能是文件上傳、提權(quán)、橫向移動。這篇文章先逐個講清楚后面我會專門把它們串成一條完整攻擊鏈那樣你回頭看這張表會有更立體的感覺。3. SQL注入數(shù)據(jù)庫把用戶輸入當成了命令3.1 用登錄場景拆解SQL注入SQL注入一句話原理本該作為“數(shù)據(jù)”傳進來的內(nèi)容被網(wǎng)站拼進了SQL語句最后被數(shù)據(jù)庫當成“命令”執(zhí)行了。你品一下這句話攻擊的本質(zhì)是數(shù)據(jù)和代碼的邊界被打破。正常情況下用戶輸入只是數(shù)據(jù)數(shù)據(jù)庫只負責把它存進去或者查出來可一旦開發(fā)人員把用戶輸入直接拼進SQL語句用戶輸入就有了“代碼”的資格。舉個最典型的例子。一個登錄框的查詢本來是這樣的SELECT * FROM user WHERE name用戶名 AND password密碼如果開發(fā)人員圖省事直接拿用戶輸入拼SQL那他輸入用戶名時填了admin OR 11拼接之后變成SELECT * FROM user WHERE nameadmin OR 11 AND password隨便填的空注意OR 的優(yōu)先級會讓整個條件永遠成立數(shù)據(jù)庫就會返回第一行用戶記錄。如果第一行剛好是管理員攻擊者甚至不用知道密碼就能直接登錄系統(tǒng)。這一句看起來像玩笑的代碼正是過去十幾年無數(shù)數(shù)據(jù)泄露事故的起點。有人可能會問那攻擊者是怎么知道字段名和表名的這就是信息收集的功勞有些系統(tǒng)報錯直接暴露表結(jié)構(gòu)有些備份文件泄露了建表語句甚至有些接口的注釋里就寫著SQL。所以SQL注入從來不是單純靠“猜”它和信息泄露是緊密配合的。3.2 參數(shù)化查詢?yōu)槭裁茨芫让繱QL注入最有效的辦法不是過濾關(guān)鍵字而是參數(shù)化查詢。在參數(shù)化查詢里用戶輸入永遠不會被拼進SQL語句結(jié)構(gòu)里而是作為參數(shù)傳給數(shù)據(jù)庫。你可以把這條思路類比成點菜你不會讓客人一邊說話一邊由服務員改寫廚房里的菜單而是讓他填一張固定的點餐單后廚按格子取料。數(shù)據(jù)是數(shù)據(jù)命令是命令兩者永遠不會混在一起。實際項目里只要是成熟的數(shù)據(jù)庫訪問組件幾乎都支持參數(shù)化查詢用起來也就多寫一兩行代碼的事。問題是很多老系統(tǒng)、外包系統(tǒng)、臨時腳本根本不給你這個機會這時候就需要在下游補防護比如給數(shù)據(jù)庫賬號做最小權(quán)限讓注入語句即使跑起來也干不了太多壞事。3.3 三個讓SQL注入“死灰復燃”的坑只在登錄框做防護搜索框、排序參數(shù)、導出接口、訂單號全都不設(shè)防。攻擊者最愛挑業(yè)務功能最雜的地方下手因為越復雜的業(yè)務越容易出現(xiàn)“臨時拼SQL”。以為有WAF就萬事大吉。WAF能做規(guī)則攔截但編碼繞過、特殊字符組合、參數(shù)污染都可能讓規(guī)則失效。WAF更像防盜門不是保險箱。黑名單過濾不安全。過濾了單引號攻擊者可以用十六進制編碼、注釋符、大小寫變形繞過去。防注入的正確姿勢是讓參數(shù)無法進入SQL語句結(jié)構(gòu)而不是試圖把所有怪輸入都攔下來。實操心得我評估過一個小程序后臺開發(fā)說登錄、注冊都做了參數(shù)化但我翻訂單查詢接口時發(fā)現(xiàn)一個直接把前端傳的排序字段拼進 ORDER BY 的例子。排序字段用參數(shù)化不好處理就需要用白名單只允許固定的幾個字段名其他一律拒絕。所以安全審計要看的從來不是“你有沒有做防護”而是“每個入口都做防護了沒有”。4. XSS瀏覽器替攻擊者傳話4.1 XSS的三種形態(tài)XSS全稱是跨站腳本攻擊本質(zhì)是攻擊者把一段JavaScript注入到網(wǎng)頁里讓它在其他用戶的瀏覽器里執(zhí)行。網(wǎng)站自己沒被攻破但它成了傳話筒把惡意代碼“唊”給了每一個訪問者。根據(jù)惡意代碼存放的位置不同XSS分成三種形態(tài)存儲型惡意腳本被存在服務器上所有訪問這個頁面的人都會中招最常見也最危險。這種攻擊更像是“投毒”。反射型惡意腳本藏在URL參數(shù)里只有當受害者點擊了特定鏈接時才會觸發(fā)。這種攻擊更像“釣魚”等人咬鉤。DOM型不經(jīng)過服務器腳本在前端DOM處理過程中被執(zhí)行隱蔽性更高而且很多時候WAF根本看不見。判斷一個XSS是哪一種最關(guān)鍵的是看惡意腳本會不會被保存和復用。存儲型之所以危險是因為它不需要誘導每個用戶點擊特定鏈接只要有人訪問那個被污染的頁面就會觸發(fā)。4.2 一條存儲型XSS的攻擊鏈我經(jīng)常用一個比喻論壇的留言板就是黑客的“留言墻”。攻擊者在評論區(qū)提交一條看起來很正常、還帶點藝術(shù)感的帖子里面嵌入了一段獲取Cookie的JavaScript。管理員審核時看到了文字卻忽略了腳本標簽。后續(xù)所有瀏覽這個帖子的用戶瀏覽器都會執(zhí)行這段腳本把各自的登錄態(tài)悄悄發(fā)給攻擊者。拿到Cookie之后攻擊者就能偽裝成用戶發(fā)帖、改資料、私信甚至誘導更多人點釣魚鏈接。如果中招的是管理員攻擊者連后臺都能進。你可能覺得“偷個Cookie而已又不致命”但結(jié)合鍵盤記錄、釣魚頁面XSS能直接變成完整賬號接管如果系統(tǒng)里有轉(zhuǎn)賬功能后果更嚴重。4.3 守住XSS的防線輸出編碼。這是最基礎(chǔ)的一條所有用戶輸入在輸出到HTML時都要做HTML實體編碼讓script變成一串無害的字符瀏覽器不會把它當成代碼執(zhí)行。內(nèi)容安全策略CSP。給頁面設(shè)置安全策略比如禁止加載外部域的腳本、禁止內(nèi)聯(lián)腳本讓注入進來的代碼根本執(zhí)行不了?,F(xiàn)代前端框架默認轉(zhuǎn)義。主流前端框架在默認情況下會對文本內(nèi)容做轉(zhuǎn)義但如果你用了類似v-html、dangerouslySetInnerHTML這類接口直接輸出HTML轉(zhuǎn)義就失效了必須自己確保內(nèi)容干凈。注意事項很多人以為XSS是“前端的事”后端不關(guān)心。其實后端不做輸出編碼光靠前端框架兜底是不保險的尤其是接口被直接調(diào)用、頁面靜態(tài)渲染的場景后端照樣得做編碼。XSS的防護一定是前后端配合不能甩鍋。5. CSRF你不知情時系統(tǒng)以為是你5.1 CSRF的經(jīng)典劇本CSRF跨站請求偽造簡單說就是攻擊者沒法直接登你的賬號但他能讓你在不知情的情況下替它發(fā)一個請求而且服務器會認為這個請求是你本人發(fā)出的。這種攻擊特別像“借刀殺人”全程你都是“被借的那把刀”。設(shè)想一下你已經(jīng)在某個網(wǎng)站登錄過瀏覽器里存著登錄Cookie。這時攻擊者在另一個網(wǎng)頁里放了一個自動提交的表單或者一張帶惡意地址的圖片。你只是打開這個網(wǎng)頁瀏覽器就把請求帶了過去Cookie也會一并帶上。服務器一看這是合法登錄用戶發(fā)來的于是執(zhí)行了修改密碼、轉(zhuǎn)賬、發(fā)帖之類的操作。整個過程你可能毫無感知也許只是在刷一個陌生頁面就在不知不覺中完成了攻擊者想要的操作。5.2 為什么CSRF在現(xiàn)實里依然常見很多人覺得CSRF技術(shù)不高級但現(xiàn)實里中招的依然不少原因有三點一是很多老舊系統(tǒng)只靠Cookie做身份認證沒有額外的校驗措施二是業(yè)務上總有一些“服務端無法校驗來源”的接口比如App、小程序與純Web站點共存時來源校驗不好做三是攻擊者有很多辦法誘導用戶點鏈接不是只有笨拙的彈窗和對話框。這里要區(qū)分一下XSS和CSRFXSS是攻擊者在網(wǎng)頁里執(zhí)行腳本屬于“篡改頁面”CSRF是攻擊者讓瀏覽器替你發(fā)請求屬于“冒用身份”。兩者經(jīng)常被混淆但防護思路完全不同。XSS的核心是控制輸出CSRF的核心是校驗請求來源。5.3 防御CSRF的三板斧CSRF Token。服務器在渲染表單時生成一個隨機Token存在會話里提交請求時必須帶回來并校驗。攻擊者不知道你的Token偽造請求自然失敗。SameSite Cookie。給Cookie加上SameSite屬性限制跨站請求自動攜帶Cookie這是近幾年瀏覽器層面最有效的兜底方案。校驗Origin/Referer。關(guān)鍵操作多一步來源頭校驗拒絕來自陌生域名的請求。實操心得很多開發(fā)覺得自己系統(tǒng)接口都有Token校驗就安全但忘了校驗接口本身是否區(qū)分了“數(shù)據(jù)型請求”和“狀態(tài)變更型請求”。比如一個查詢接口不需要Token一個下單接口需要Token但如果下單接口同時允許多種Content-Type提交就可能被繞過。最好對所有狀態(tài)變更接口統(tǒng)一啟用Token校驗并配合SameSite屬性雙保險。這里沒有捷徑只有把每類接口的校驗規(guī)則想周全。6. 文件上傳漏洞一個頭像圖片帶走了服務器6.1 上傳功能為什么危險文件上傳功能很常見傳頭像、傳附件、傳文檔。如果一個系統(tǒng)允許用戶上傳文件卻沒有嚴格限制文件類型和內(nèi)容攻擊者就可能把一段服務端腳本比如PHP、JSP偽裝成圖片傳上去再從瀏覽器訪問這個文件讓它執(zhí)行。這段腳本在安全圈里有個俗稱叫Webshell你可以把它理解成給服務器裝了一個“遠程遙控器”。攻擊者通過它執(zhí)行命令、查看文件、修改代碼最終拿下整個服務器。你可能覺得“我上傳的明明是圖片怎么會變成腳本”這里的關(guān)鍵是服務器到底把上傳的文件當成什么來解析取決于文件的后綴、存儲位置和服務器配置而不是取決于文件的真實內(nèi)容。這也正是文件上傳漏洞最陰險的地方。6.2 攻擊者繞過后綴檢查的常見套路很多系統(tǒng)會對上傳文件做后綴名檢查但攻擊者的繞過思路從來不只一條改后綴。把shell.php改成shell.php5、shell.phtml如果服務器沒有正確配置對這些后綴的解析規(guī)則就可能被直接執(zhí)行。偽造Content-Type。上傳時把請求里的Content-Type改成image/jpeg只檢查MIME類型的系統(tǒng)就這樣被蒙混過去。圖片馬。把腳本代碼拼到一張正常圖片的尾部。有些服務器存在解析漏洞會把圖片當腳本執(zhí)行。這種方式在CTF里特別經(jīng)典也特別容易讓人產(chǎn)生“圖片怎么可能執(zhí)行”的錯覺。雙寫后綴或大小寫混淆。shell.php.jpg、shell.PhP這類寫法專門用來測試解析邏輯不夠嚴謹?shù)闹虚g件。這不是什么高科技很多就是“猜配置”的過程。攻擊者會反復試探直到找到一個能執(zhí)行腳本的組合。所以當你在本地覺得自己系統(tǒng)已經(jīng)做得很嚴了不妨多問自己一句換個后綴名試試換幾種方式提交試試6.3 安全的文件上傳如何設(shè)計后綴名白名單。只允許指定類型例如jpg、png、pdf而不是靠黑名單。黑名單永遠列不全白名單則把門關(guān)死。重命名文件。上傳后不要使用用戶提供的文件名改成隨機字符串從根源上杜絕攻擊者控制路徑和后綴。隔離存儲與執(zhí)行。上傳目錄放在Web訪問不到的位置或者禁止該目錄執(zhí)行任何腳本。內(nèi)容與類型雙重校驗。不光看Content-Type還讀取文件頭、圖像寬高等信息做校驗。限制上傳大小和數(shù)量減少用來存儲惡意文件的可能。注意事項曾經(jīng)遇到一個項目開發(fā)把所有上傳文件都存到服務器同一目錄服務器軟件還開啟了目錄瀏覽結(jié)果不只文件上傳漏洞危險連所有用戶頭像都被爬了個遍。文件上傳的防護從來不是只看上傳那一刻而是從上傳、存儲、訪問、執(zhí)行整個鏈路都要管好。7. 目錄遍歷與敏感文件泄露當網(wǎng)站把底牌亮給你7.1 最常見的泄露源攻擊者最怕的不是系統(tǒng)難打而是信息不夠。而現(xiàn)實里很多系統(tǒng)會主動把底牌亮出來。我總結(jié)過最常見的信息泄露源網(wǎng)站目錄開啟了目錄列表直接看到文件結(jié)構(gòu)。備份文件被放在Web目錄下比如www.zip、backup.sql。版本控制目錄泄露攻擊者可以直接下載源碼和提交歷史。配置文件、日志文件權(quán)限設(shè)置不當。報錯頁面展示了堆棧、數(shù)據(jù)庫連接信息。調(diào)試接口和處理異常的環(huán)境變量被暴露。這些看似“小信息”組合起來就是攻擊者的作戰(zhàn)地圖。你可能會想一個備份文件而已能有多大危害但備份文件里往往就有完整的數(shù)據(jù)庫密碼、接口密鑰、內(nèi)部網(wǎng)絡拓撲攻擊者拿到這些信息后后面甚至不需要再用什么漏洞直接拿鑰匙開門就行。7.2 路徑穿越是怎么發(fā)生的目錄遍歷里最有名的就是路徑穿越。如果一個下載接口把文件名直接拼在路徑里攻擊者就可以用../往上跳目錄。例如正常請求 /download?filereport.pdf 攻擊請求 /download?file../../etc/passwd如果后端沒有做路徑規(guī)范化校驗文件系統(tǒng)就會乖乖把越界的內(nèi)容讀出來。等你拿到配置文件和密碼字典后面的事情就容易多了。防御上除了對用戶輸入做規(guī)范化處理、禁止文件名包含路徑分隔符更重要的是別把文件讀取邏輯直接暴露給用戶輸入。這里還有一層容易忽略的即使沒有路徑穿越很多系統(tǒng)也存在“功能越權(quán)”式泄露。你猜到一個訂單號、一個用戶ID就能查看別人的詳情這本質(zhì)上和目錄遍歷一樣都是“沒做好訪問控制”。7.3 信息泄露是組合攻擊的催化劑我常說“一次信息泄露往往比一個直接漏洞更可怕”因為在真實攻防里信息泄露給攻擊者提供了精確打擊的坐標。比如拿到源碼后攻擊者能直接審計出SQL注入和數(shù)據(jù)越權(quán)的位置拿到數(shù)據(jù)庫配置能少走很多彎路直接連庫拿到備份文件甚至可能有現(xiàn)成的管理員賬號密碼。防御的核心思路不是“刪除所有日志”而是控制邊界公網(wǎng)不暴露內(nèi)網(wǎng)信息錯誤頁只展示用戶能看的提示日志與源碼不等于任何人可訪問的資源。給目錄加訪問控制、把備份移出Web根目錄、關(guān)閉目錄列表這些動作成本不高效果立竿見影。實操心得我自己檢查一個內(nèi)部系統(tǒng)時隨手在路徑后加了一個/服務器直接把整個目錄列表打了出來連數(shù)據(jù)庫連接配置文件都在里面。那一刻我突然理解很多大事故真的不是高手用多精妙的技巧打出來的而是像這樣一個明晃晃的漏洞擺在那里等用戶發(fā)現(xiàn)。8. 暴力破解與弱口令最樸素卻最有效的敲門磚8.1 暴力破解的進化史暴力破解最容易理解就是個一個試。早期攻擊者拿字典逐個試用戶名和密碼速度快慢取決于網(wǎng)絡和服務器性能?,F(xiàn)在則有更聰明的玩法先用泄露的密碼庫做組合碰撞再配合撞庫、拖庫數(shù)據(jù)威脅面一下子大了很多?,F(xiàn)實中大量賬號失守不是被什么高級漏洞打下來的而是自己用了弱密碼、或者在多個平臺用了同一套密碼。攻擊者根本不需要“破解”只需要拿著已經(jīng)泄露的密碼去碰碰運氣。你可能會想我又不是什么大人物誰會來暴力破解我的賬號但在自動化工具的加持下攻擊者不會逐個手動試而是拿一整個字典批量掃成千上萬個賬號。只要你的密碼足夠簡單被掃中是遲早的事。8.2 攻擊者如何繞過常見防護驗證碼。簡單的四位數(shù)字驗證碼可以直接OCR識別更常見的是驗證碼不失效、可重復使用。很多驗證碼系統(tǒng)實際只防了人沒防住腳本。次數(shù)限制。有的系統(tǒng)只對單個IP做限制攻擊者換一批IP就能繞過。鎖定策略。不加鎖或者鎖定期太短撞庫工具完全可以卡著時間差來打。這里的關(guān)鍵是幾乎所有單點防護都能被繞過真正的防線靠組合。驗證碼要一次性、要隨機IP限制要配合賬號緯度限制鎖定策略要有彈性不能鎖死正常用戶但又不能讓攻擊者鉆空子。8.3 真正有效的防暴力破解組合強制使用高復雜度密碼同時開啟多因素認證這比什么都有效。密碼被泄露了認證器還能兜底。登錄接口限速與鎖定。同一個賬號連續(xù)失敗幾次就鎖定同一IP高頻請求自動拉黑。行為分析。結(jié)合登錄時間、設(shè)備指紋、地理位置判斷異常讓攻擊者即使拿到密碼也要多次驗證。統(tǒng)一賬號體系。減少“一個系統(tǒng)一套密碼”的混亂情況降低被撞庫的風險。個人體會我見過一次內(nèi)網(wǎng)安全演練攻擊者兩個小時就拿到了整個測試環(huán)境的權(quán)限路徑就是從某個外包系統(tǒng)的默認后臺密碼開始的。安全建設(shè)里弱口令問題永遠不是一張表能解決的問題它需要流程和管理制度兜底。運維列一個“強制改密清單”開發(fā)把所有默認密碼全部換掉這一步比裝任何安全設(shè)備都值錢。9. DDoS不偷數(shù)據(jù)但直接讓你停擺9.1 DDoS的本質(zhì)是“堵車”DDoS全稱是分布式拒絕服務本質(zhì)特別像把一條路堵死大量“車輛”同時涌向一個路口真正想通過的人反而進不去。攻擊者不一定需要入侵你的系統(tǒng)只需要讓你無法對外提供正常服務。對今天高度依賴線上業(yè)務的系統(tǒng)來說服務不可用就是實打?qū)嵉膿p失幾小時的宕機可能直接影響收入、用戶信任和品牌聲譽。理解DDoS先要顛覆一個直覺它不像前面那些攻擊一樣‘利用漏洞’它利用的是“系統(tǒng)可用性有限”這個事實。服務器能處理的并發(fā)請求有限帶寬有限內(nèi)存有限。攻擊者不需要找到邏輯漏洞只需要把資源耗盡你就輸了。9.2 三種常見的DDoS類型流量型攻擊。用海量請求把帶寬打滿比如UDP洪水、ICMP洪水。流量一滿正常用戶連網(wǎng)頁都打不開。連接型攻擊。TCP層的SYN Flood不斷發(fā)送握手請求但不完成握手把服務器的連接表占滿讓新連接無法建立。應用層攻擊。HTTP請求洪水、慢速攻擊。請求量不大但每個請求都耗服務器資源對業(yè)務接口形成持續(xù)消耗。這一類最難防御因為從流量上看都是“正常請求”。對普通站點來說最頭疼的是應用層攻擊因為流量看似正常防火墻和Web應用防火墻很難區(qū)分哪個請求是攻擊者的、哪個是用戶的。你總不能把所有帶GET /的請求都攔了吧那用戶也進不來了。9.3 防御DDoS的常識與誤區(qū)防御的目標不是“擋住所有攻擊”而是“讓正常用戶能訪問”。常見手段包括帶寬與容量冗余給系統(tǒng)留一定的緩沖空間。在網(wǎng)絡邊緣做流量清洗識別并丟棄異常流量只把正常流量轉(zhuǎn)發(fā)給源站。使用CDN和高防節(jié)點分散壓力讓攻擊者無法直接打爆源站IP。對應用層做限流、頻控、人機校驗讓腳本請求消耗的成本遠高于正常用戶。誤區(qū)是不少人以為買了高防就萬事大吉結(jié)果攻擊者直接找到源站IP繞過防護照樣打癱。DDoS防御要連源站保護一起做不能只靠單點。源站IP一旦暴露任何高防都等于白買。所以源站防護、IP隱藏、訪問控制這些事都必須納入整體方案。經(jīng)驗我自己參與過的應急響應里應用層攻擊比流量型攻擊難處理得多。流量型可以靠調(diào)度和清洗解決應用層必須從業(yè)務架構(gòu)上多做幾層緩存和限流否則再大的帶寬也經(jīng)不起無限請求。很多時候給查詢接口加緩存、給寫操作加隊列反而比單純堆帶寬管用。10. 把7種攻擊串成一條鏈攻擊者的完整作業(yè)路線10.1 攻擊者的心態(tài)攻擊者不會一上來就放大招。他心里有個優(yōu)先級先找最容易的點再找影響最大的路徑。所以很多攻擊的起點不是什么稀罕的漏洞而是一臺被人忘記的測試機、一個沒有鎖的后臺入口、一份隨處可下的備份文件。攻擊者像一個小偷會先繞著房子轉(zhuǎn)一圈看哪個窗戶沒關(guān)而不是非要撬開保險柜的大門。所以我們防御時不能只盯著最“高級”的漏洞。那些不起眼的點一個開放的目錄、一個弱密碼、一條多余的報錯信息才是攻擊者最喜歡踩的地磚。10.2 一次典型組合攻擊的推演把前面7種攻擊放在同一條時間線上先用目錄遍歷和信息收集找到后臺路徑、源碼版本、數(shù)據(jù)庫配置線索。用弱口令或暴力破解突破一個低權(quán)限賬號進入后臺。發(fā)現(xiàn)后臺有上傳功能用圖片馬或后綴繞過放上Webshell。通過Webshell執(zhí)行命令讀取服務器上的數(shù)據(jù)庫配置連接數(shù)據(jù)庫。用SQL注入手法嘗試拖庫或者直接把數(shù)據(jù)備份下載。如果服務是核心最后補一發(fā)DDoS讓系統(tǒng)徹底停止響應掩蓋痕跡或者制造更大的混亂。你會發(fā)現(xiàn)每一步單獨看都不算“神操作”但組合起來就能造成巨大的破壞。攻擊者最擅長的是把別人的疏忽變成自己的路徑。這也就解釋了為什么攻擊鏈的每一環(huán)都值得防守——你堵住任何一環(huán)他后面就都走不通了。10.3 防御者的分層應對對應的防御思路是縱深防御每層都設(shè)防就算第一層被突破第二層第三層仍在工作。入口要管好弱口令和上傳中間要管好權(quán)限和隔離數(shù)據(jù)庫要管好最小權(quán)限和審計。安全不是加一臺WAF就完成的事而是所有環(huán)節(jié)都盡量降低攻擊者的收益、延長攻擊者的時間。攻擊者的路徑越長、成本越高他放棄的概率就越大??v深防御還有一個現(xiàn)實意義它能讓你有“發(fā)現(xiàn)”的機會。如果只有一層防護攻擊者一次突破你就完全失守如果有多層防護哪怕他踩過第一層日志里也會留下痕跡你就有時間去發(fā)現(xiàn)、阻斷和溯源。11. 最后說點實在話給普通開發(fā)者和運維的幾條經(jīng)驗11.1 從最小成本開始改造如果你不是專職安全人員面對這一大堆攻擊方式可能覺得無從下手。我的建議是從最小成本清單開始把默認后臺地址改掉弱口令全部強制改復雜密碼。給關(guān)鍵接口完全不信任前端參數(shù)用白名單。把備份文件和源碼遷出Web根目錄。關(guān)閉公網(wǎng)目錄列表、報錯頁面。給狀態(tài)變更請求加Token校驗。這幾點加起來不到半天時間能擋住一大半腳本小子級別的攻擊。安全不是說一定要上多貴的設(shè)備而是先把這些零成本、低成本的事做到位。11.2 學會站在攻擊者角度看系統(tǒng)安全評估最有效的方法就是把自己當成第一次看到這個系統(tǒng)的陌生人你能不能找到后臺能不能看到目錄能不能猜到密碼能不能上傳可執(zhí)行文件沿著這個思路走一遍你往往比任何掃描器都更能發(fā)現(xiàn)問題。這個習慣一開始做會有點別扭因為你對自己系統(tǒng)太熟了總覺得“這地方很正常啊”??晒粽咔∏∠喾此裁炊疾恢浪运麜囂矫恳粋€入口。你試著把已知信息全部忘掉只留一個瀏覽器從用戶角度把所有功能和頁面都過一遍很快就能找到“哦這里好像能多傳個東西”“這里報錯信息太多了”的疏漏。11.3 一個很容易被忽略的細節(jié)最后分享一個小細節(jié)平時排查登錄和業(yè)務接口時多留意一下報錯提示。很多系統(tǒng)把“用戶不存在”和“密碼錯誤”分得太清楚等于告訴攻擊者哪個賬號是存在的這會讓弱口令攻擊精準很多。把報錯改成統(tǒng)一提示成本為零效果卻立竿見影。做安全這幾年最大的體會就是攻擊技術(shù)永遠在變但核心邏輯始終是那么幾條——信任邊界模糊、輸入不可控、權(quán)限太大、信息暴露太多。把這幾條理解透再去看任何新的漏洞和攻擊方式你都會覺得似曾相識。與其追著每一條新漏洞新聞跑不如先把這7種最基礎(chǔ)的攻擊吃透因為后面所有高級手法都是在這幾塊地基上蓋起來的。