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