戰(zhàn):從漏洞原理到服務(wù)器加固)
我先說(shuō)一個(gè)很多人問(wèn)過(guò)我的問(wèn)題到底什么是Web安全是不是裝個(gè)防火墻、上個(gè)HTTPS就完事了如果你也這么想那這篇文章就是寫給你的。我從2015年開始做滲透測(cè)試中間帶過(guò)團(tuán)隊(duì)、打過(guò)CTF、幫企業(yè)做過(guò)應(yīng)急響應(yīng)到今天我可以明確告訴你Web安全不是一套工具也不是某個(gè)產(chǎn)品而是一整套“在攻防對(duì)抗中識(shí)別風(fēng)險(xiǎn)、控制風(fēng)險(xiǎn)、修復(fù)風(fēng)險(xiǎn)”的思維方式和方法論。只要你的業(yè)務(wù)跑在HTTP協(xié)議上只要有一個(gè)按鈕、一個(gè)表單、一個(gè)接口暴露在互聯(lián)網(wǎng)上你就已經(jīng)在Web安全的射程范圍之內(nèi)了。這篇文章適合三類人剛?cè)腴T安全、想轉(zhuǎn)行做安全工程師的開發(fā)者或運(yùn)維負(fù)責(zé)公司線上業(yè)務(wù)、想知道該從哪兒下手做防護(hù)的技術(shù)負(fù)責(zé)人還有純粹對(duì)黑客技術(shù)好奇、想搞明白“網(wǎng)站到底是怎么被攻破的”的愛好者。我會(huì)把Web安全的底層邏輯、高頻攻擊類型、服務(wù)器加固實(shí)操、學(xué)習(xí)路線和避坑經(jīng)驗(yàn)都過(guò)一遍內(nèi)容偏實(shí)戰(zhàn)盡量讓你看完就能上手檢查自己的項(xiàng)目。1. 先搞清楚Web安全到底在防什么很多人一上來(lái)就背OWASP Top 10把SQL注入、XSS、CSRF背得滾瓜爛熟但問(wèn)他“這些漏洞到底為什么會(huì)存在”他答不上來(lái)。這是學(xué)習(xí)Web安全最大的誤區(qū)只記現(xiàn)象不究本質(zhì)。這一節(jié)我們把底層邏輯講透。1.1 Web安全的本質(zhì)信任邊界的博弈Web應(yīng)用的架構(gòu)其實(shí)不復(fù)雜瀏覽器發(fā)送HTTP請(qǐng)求服務(wù)器接收請(qǐng)求、處理業(yè)務(wù)邏輯、讀寫數(shù)據(jù)庫(kù)、然后把響應(yīng)返回給瀏覽器。整個(gè)過(guò)程看起來(lái)是一個(gè)簡(jiǎn)單的“請(qǐng)求-響應(yīng)”循環(huán)但漏洞恰恰就藏在這個(gè)循環(huán)的每一個(gè)信任假設(shè)里。SQL注入之所以存在是因?yàn)殚_發(fā)者默認(rèn)“用戶輸入的數(shù)據(jù)只是數(shù)據(jù)不可能是代碼”XSS之所以存在是因?yàn)殚_發(fā)者默認(rèn)“用戶提交的內(nèi)容是安全的可以渲染到頁(yè)面上”越權(quán)漏洞之所以存在是因?yàn)殚_發(fā)者默認(rèn)“用戶不會(huì)去改URL里的id參數(shù)”。你發(fā)現(xiàn)沒有所有漏洞的本質(zhì)都是開發(fā)者在代碼里埋下了一個(gè)“信任假設(shè)”而攻擊者做的事情就是打破這個(gè)假設(shè)。我在做代碼審計(jì)時(shí)經(jīng)常跟開發(fā)說(shuō)一句話永遠(yuǎn)不要信任用戶的任何輸入。這個(gè)“輸入”不只是表單字段還包括請(qǐng)求頭、Cookie、URL路徑、文件上傳的文件名甚至包括User-Agent這種看起來(lái)人畜無(wú)害的字段。Web安全的本質(zhì)就是在“必要的信任”和“必要的校驗(yàn)”之間找到平衡把所有不該被信任的輸入都當(dāng)成攻擊面來(lái)處理。1.2 攻擊面比你想的大得多很多新手理解Web安全時(shí)只盯著“網(wǎng)站頁(yè)面”本身這是遠(yuǎn)遠(yuǎn)不夠的。一個(gè)典型的Web系統(tǒng)攻擊面至少包括下面這幾個(gè)層次客戶端層瀏覽器里的DOM、Cookie、LocalStorage、第三方JS腳本對(duì)應(yīng)XSS、CSRF、點(diǎn)擊劫持等攻擊。傳輸層HTTP明文傳輸、TLS配置不當(dāng)對(duì)應(yīng)中間人攻擊、數(shù)據(jù)竊聽。服務(wù)端層Web容器Nginx、Apache、IIS、應(yīng)用框架Spring、Django、ThinkPHP、業(yè)務(wù)代碼對(duì)應(yīng)注入類、邏輯類漏洞。數(shù)據(jù)層數(shù)據(jù)庫(kù)、緩存、文件存儲(chǔ)對(duì)應(yīng)脫庫(kù)、拖庫(kù)、越權(quán)讀取。第三方組件日志組件、消息隊(duì)列、OSS對(duì)象存儲(chǔ)、短信服務(wù)對(duì)應(yīng)供應(yīng)鏈攻擊和組件漏洞利用。每一層都有自己的信任邊界和防護(hù)重點(diǎn)。我見過(guò)太多企業(yè)只給Web應(yīng)用買了WAFWeb應(yīng)用防火墻結(jié)果攻擊者直接掃到一個(gè)沒打補(bǔ)丁的中間件漏洞繞過(guò)WAF直搗黃龍也見過(guò)不少開發(fā)者在代碼層做得固若金湯卻因?yàn)榉?wù)器SSH端口暴露在公網(wǎng)、用的是弱密碼被暴力破解直接拿下服務(wù)器。所以“什么是Web安全”沒有一個(gè)簡(jiǎn)單的定義它是一套縱深防御體系。如果非要用一句話概括Web安全 識(shí)別所有可被攻擊者利用的輸入點(diǎn) 在每個(gè)輸入點(diǎn)實(shí)施有效的校驗(yàn)與防護(hù) 在攻擊發(fā)生時(shí)能夠發(fā)現(xiàn)、響應(yīng)、溯源。這三件事少了任何一件安全建設(shè)都是瘸腿的。2. 最常見的Web攻擊類型不只是背OWASP Top 10OWASP開源Web應(yīng)用安全項(xiàng)目每隔幾年會(huì)發(fā)布一次Top 10漏洞排名這是Web安全領(lǐng)域最權(quán)威的參考之一。但我見過(guò)太多人把這份榜單背得滾瓜爛熟真遇到攻擊卻完全認(rèn)不出來(lái)。這里我結(jié)合實(shí)戰(zhàn)中真正高頻的攻擊方式逐類拆解原理和防御思路。2.1 SQL注入老牌殺手為何還活著SQL注入誕生了二十多年至今仍在OWASP Top 10里名列前茅。原理一句話就能講清楚應(yīng)用把用戶輸入直接拼接進(jìn)SQL語(yǔ)句導(dǎo)致用戶輸入被數(shù)據(jù)庫(kù)當(dāng)作代碼執(zhí)行。舉一個(gè)最經(jīng)典的例子。一個(gè)登錄接口的SQL可能是這樣寫的SELECT * FROM users WHERE username $username AND password $password如果用戶名為admin --拼出來(lái)的SQL就變成了SELECT * FROM users WHERE username admin -- AND password xxx--是SQL的注釋符后面的密碼校驗(yàn)條件被注釋掉了。此時(shí)攻擊者不需要知道密碼就能以admin身份直接登錄。實(shí)戰(zhàn)中我遇到過(guò)的SQL注入有數(shù)字型、字符型、報(bào)錯(cuò)注入、布爾盲注、時(shí)間盲注、堆疊注入等形式五花八門。但防御手段其實(shí)高度統(tǒng)一核心就兩條使用參數(shù)化查詢PreparedStatement讓SQL語(yǔ)句結(jié)構(gòu)和數(shù)據(jù)分離數(shù)據(jù)庫(kù)不再把數(shù)據(jù)當(dāng)作代碼解析。對(duì)輸入做嚴(yán)格的類型校驗(yàn)和長(zhǎng)度限制從業(yè)務(wù)層面減少惡意輸入的構(gòu)造空間。注意千萬(wàn)不要自己拼接一個(gè)“過(guò)濾函數(shù)”去黑名單攔截、、select這些關(guān)鍵字。攻擊者的繞過(guò)姿勢(shì)遠(yuǎn)比你想的多——大小寫變體、URL編碼、雙寫、注釋符切割、十六進(jìn)制編碼每一種都能輕松繞過(guò)簡(jiǎn)單的關(guān)鍵字黑名單。參數(shù)化查詢才是正解過(guò)濾只能作為輔助手段。2.2 XSS跨站腳本前端防線為什么容易被突破XSS跨站腳本攻擊的核心是用戶輸入的內(nèi)容被當(dāng)成了前端代碼執(zhí)行。攻擊者往頁(yè)面里注入一段JavaScript腳本當(dāng)其他用戶訪問(wèn)該頁(yè)面時(shí)腳本就在他們的瀏覽器里自動(dòng)運(yùn)行。XSS有三種主要形態(tài)。反射型XSS惡意腳本通過(guò)URL參數(shù)傳入服務(wù)端直接拼進(jìn)響應(yīng)頁(yè)面返回用戶點(diǎn)擊惡意鏈接才觸發(fā)存儲(chǔ)型XSS惡意腳本被持久化保存在服務(wù)器端比如評(píng)論區(qū)、留言板所有瀏覽該頁(yè)面的用戶都會(huì)被攻擊危害最大DOM型XSS純前端問(wèn)題惡意腳本通過(guò)修改DOM節(jié)點(diǎn)觸發(fā)服務(wù)端可能完全無(wú)感知。千萬(wàn)別低估XSS的危害。很多人覺得“不就是彈個(gè)框嗎”實(shí)戰(zhàn)中XSS能做太多事竊取Cookie冒充用戶登錄、模擬用戶執(zhí)行操作改密碼、轉(zhuǎn)賬、鍵盤記錄、內(nèi)網(wǎng)端口掃描、釣魚頁(yè)面。我在授權(quán)滲透測(cè)試中用存儲(chǔ)型XSS拿下過(guò)管理員的Cookie直接登錄后臺(tái)并上傳Webshell整個(gè)站就此淪陷。防御XSS的核心是輸出編碼原則是“數(shù)據(jù)與代碼分離”在HTML標(biāo)簽內(nèi)輸出時(shí)做HTML實(shí)體編碼在JS字符串里輸出時(shí)做JS編碼在URL屬性里輸出時(shí)做URL編碼。另外設(shè)置合理的CSP內(nèi)容安全策略響應(yīng)頭可以限制瀏覽器只加載白名單內(nèi)的腳本即使XSS打進(jìn)來(lái)也無(wú)法執(zhí)行外部惡意代碼。2.3 CSRF、SSRF、文件上傳三個(gè)容易混淆的高危點(diǎn)CSRF跨站請(qǐng)求偽造和XSS經(jīng)常被混為一談但它倆完全不同。XSS借助的是用戶對(duì)站點(diǎn)的信任在用戶瀏覽器里執(zhí)行惡意腳本CSRF借助的是站點(diǎn)對(duì)用戶的信任利用用戶已經(jīng)登錄的身份在用戶不知情的情況下替用戶發(fā)起請(qǐng)求。舉一個(gè)經(jīng)典場(chǎng)景用戶登錄銀行網(wǎng)站后沒有退出然后訪問(wèn)了一個(gè)惡意站點(diǎn)惡意站點(diǎn)里的圖片帶了一個(gè)請(qǐng)求img srchttps://bank.com/transfer?tohackeramount10000 /瀏覽器會(huì)自動(dòng)帶上用戶的Cookie銀行網(wǎng)站收到請(qǐng)求后校驗(yàn)Session通過(guò)錢就被轉(zhuǎn)走了。防御方案是加CSRF Token服務(wù)端在表單里生成隨機(jī)Token提交時(shí)校驗(yàn)另外設(shè)置SameSite Cookie屬性也能有效緩解。SSRF服務(wù)端請(qǐng)求偽造是近幾年熱度很高的漏洞核心是服務(wù)端根據(jù)用戶的輸入去請(qǐng)求某個(gè)內(nèi)部資源但沒有做嚴(yán)格校驗(yàn)。攻擊者通過(guò)篡改URL參數(shù)讓服務(wù)端去請(qǐng)求內(nèi)網(wǎng)地址、云元數(shù)據(jù)地址、Redis等實(shí)現(xiàn)內(nèi)網(wǎng)探測(cè)、端口掃描、敏感信息讀取。比如一個(gè)“圖片裁剪”功能如果URL參數(shù)沒有限制協(xié)議和網(wǎng)段攻擊者可以把地址改成http://169.254.169.254/latest/meta-data/去獲取云服務(wù)器的臨時(shí)憑證。防御SSRF的關(guān)鍵是白名單校驗(yàn)?zāi)繕?biāo)URL、禁止重定向跟隨、限制協(xié)議僅為HTTP/HTTPS、禁止訪問(wèn)內(nèi)網(wǎng)IP段。文件上傳漏洞也很典型攻擊者通過(guò)上傳一個(gè)包含惡意代碼的文件最常見的PHP一句話木馬然后通過(guò)URL直接訪問(wèn)它就在服務(wù)器上實(shí)現(xiàn)了任意代碼執(zhí)行。我看到很多開發(fā)者只在后端校驗(yàn)了Content-TypeMIME類型而Content-Type是客戶端可以偽造的形同虛設(shè)。正確做法包括白名單校驗(yàn)文件擴(kuò)展名、使用隨機(jī)文件名防止用戶猜到上傳路徑、檢測(cè)文件內(nèi)容頭Magic Bytes、把上傳文件存儲(chǔ)到獨(dú)立域名或獨(dú)立目錄并禁止腳本執(zhí)行權(quán)限。3. Web服務(wù)器安全別讓配置坑了你這里我要專門把“Web服務(wù)器安全”拎出來(lái)講因?yàn)檫@是被很多人忽視的一層。業(yè)務(wù)代碼寫得再安全服務(wù)器本身如果裸奔照樣會(huì)被攻破。這一節(jié)講實(shí)戰(zhàn)中我拿到一臺(tái)服務(wù)器后必做的幾件事。3.1 服務(wù)器基線加固的幾個(gè)關(guān)鍵項(xiàng)我在做等保測(cè)評(píng)和滲透測(cè)試時(shí)第一步不是掃Web漏洞而是先看服務(wù)器本身有沒有“裸奔”。所謂基線加固就是把服務(wù)器最基礎(chǔ)、最容易被利用的薄弱點(diǎn)都補(bǔ)上。下面幾個(gè)關(guān)鍵項(xiàng)是我每臺(tái)機(jī)器必查的首先是SSH安全。檢查項(xiàng)目常見的問(wèn)題是SSH端口暴露在公網(wǎng)但用的還是默認(rèn)22端口、允許root直接登錄、密碼策略過(guò)于寬松。建議修改SSH端口、禁用root直接登錄用普通用戶 su提權(quán)、配置密鑰登錄并關(guān)閉密碼登錄有條件再加Fail2ban做暴力破解的自動(dòng)封禁。其次是系統(tǒng)及組件補(bǔ)丁。Log4j2漏洞爆發(fā)的時(shí)候我?guī)秃芏嗫蛻襞挪檫^(guò)發(fā)現(xiàn)大量服務(wù)器用的還是存在漏洞的版本導(dǎo)致被挖礦病毒入侵。安全補(bǔ)丁這件事沒有捷徑必須建立資產(chǎn)清單跟蹤依賴組件的版本尤其是開源框架和中間件的安全公告。我自己的習(xí)慣是訂閱CVE情報(bào)源用自動(dòng)化腳本定期拉取并比對(duì)線上版本。再就是端口和服務(wù)的最小化。在服務(wù)器執(zhí)行ss -tlnp看一眼監(jiān)聽端口你會(huì)發(fā)現(xiàn)很多機(jī)器跑著完全不需要對(duì)外暴露的服務(wù)比如Redis的6379、MongoDB的27017、Docker的2375這些服務(wù)如果直接暴露在公網(wǎng)被入侵幾乎是分分鐘的事。沒用的服務(wù)直接停掉必須開放的服務(wù)用防火墻做來(lái)源IP白名單限制。最后是文件權(quán)限和敏感信息。檢查是否存在權(quán)限過(guò)大的文件夾、是否在代碼倉(cāng)庫(kù)里硬編碼了數(shù)據(jù)庫(kù)密碼、云廠商的AccessKey是否意外泄露這些都屬于“看起來(lái)不起眼、一旦出事就是災(zāi)難”的問(wèn)題。我建議在CI/CD流水線中加入密鑰掃描工具把AK、密碼、私鑰這類信息的提交直接卡在上線之前。3.2 HTTPS與安全響應(yīng)頭的配置實(shí)操HTTPS不是銀彈但它是Web安全的地基。沒有HTTPS所有請(qǐng)求和響應(yīng)都在互聯(lián)網(wǎng)上明文傳輸用戶的Cookie、密碼、表單數(shù)據(jù)對(duì)中間人來(lái)說(shuō)就是透明的。配置HTTPS本身很簡(jiǎn)單申請(qǐng)免費(fèi)證書Let‘s Encrypt或各云廠商免費(fèi)證書后在Nginx里加幾行配置就行。重點(diǎn)在于證書鏈要配完整、要啟用TLS 1.2以上、禁用舊的不安全加密套件。下面是一份我常用的Nginx TLS安全配置片段可以直接參考server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; add_header Strict-Transport-Security max-age63072000 always; add_header X-Frame-Options SAMEORIGIN always; add_header X-Content-Type-Options nosniff always; add_header Referrer-Policy strict-origin-when-cross-origin always; add_header Content-Security-Policy default-src self; script-src self; style-src self unsafe-inline always; }這段配置里Strict-Transport-SecurityHSTS強(qiáng)制瀏覽器只能通過(guò)HTTPS訪問(wèn)能有效防止SSL剝離攻擊X-Frame-Options防止你的頁(yè)面被惡意站點(diǎn)用iframe嵌入降低點(diǎn)擊劫持風(fēng)險(xiǎn)X-Content-Type-Options: nosniff防止瀏覽器對(duì)響應(yīng)內(nèi)容做MIME類型嗅探Content-Security-Policy是XSS的重要緩解手段白名單放行來(lái)源。提示CSP的配置要謹(jǐn)慎別一上來(lái)就抄一個(gè)特別嚴(yán)格的策略否則你會(huì)被自己的頁(yè)面報(bào)錯(cuò)淹死。建議先在Content-Security-Policy-Report-Only模式下觀察一段時(shí)間確認(rèn)沒有誤傷業(yè)務(wù)功能后再切換為強(qiáng)制模式。4. 學(xué)習(xí)路線與實(shí)戰(zhàn)練習(xí)從理論到實(shí)戰(zhàn)該怎么走聊完了原理和防護(hù)這一部分專門講“怎么學(xué)”。Web安全是個(gè)實(shí)踐性極強(qiáng)的領(lǐng)域只看書不動(dòng)手永遠(yuǎn)只能是個(gè)理論家。這一節(jié)結(jié)合很多新人都在問(wèn)的學(xué)習(xí)路徑問(wèn)題給出我自己的建議。4.1 從看書到動(dòng)手經(jīng)典資料該怎么用很多剛?cè)腴T的人會(huì)搜“白帽子講Web安全pdf下載”這類的資料這說(shuō)明他們知道要看經(jīng)典書。但我想認(rèn)真說(shuō)一句這本書一定要看有條件請(qǐng)支持正版。它誕生于Web安全的黃金年代把XSS、SQL注入、CSRF這些核心攻擊講得極其透徹很多安全工程師的入門都得益于它。但它成書較早部分技術(shù)細(xì)節(jié)與現(xiàn)在的主流框架和攻防環(huán)境已有差距。我的建議是把它作為“底層原理書”精讀同時(shí)配合現(xiàn)在的新書和官方文檔補(bǔ)充現(xiàn)代Web框架的最佳實(shí)踐。除了這本我還推薦《Web安全開發(fā)指南》作為開發(fā)側(cè)的防護(hù)視角參考以及OWASP官方發(fā)布的測(cè)試指南和代碼審查指南免費(fèi)在線閱讀這些資料講的是最新的攻擊面和方法論時(shí)效性更好。資料在精不在多把一本書吃透遠(yuǎn)勝于下載十個(gè)G的電子版囤在網(wǎng)盤里吃灰。4.2 CTF刷題CTFshow等平臺(tái)具體怎么用光看書不實(shí)踐永遠(yuǎn)不知道自己是不是真懂了。CTFCapture The Flag奪旗賽是Web安全最好的實(shí)戰(zhàn)練習(xí)場(chǎng)之一而CTFshow這個(gè)平臺(tái)尤其適合新手。我為什么推薦它因?yàn)樗念}目難度分級(jí)清晰從入門到進(jìn)階都有而且每個(gè)方向都覆蓋了Web方向更是從最基礎(chǔ)的“查看源碼”一直延伸到各種冷門繞過(guò)技巧。在CTFshow上刷題我不建議像無(wú)頭蒼蠅一樣從第一題刷到最后一題。我自己帶新人時(shí)的建議路徑是這樣的第一階段先做Web入門題目標(biāo)是熟悉常見漏洞的利用方式比如SQL注入經(jīng)典繞過(guò)、XSS彈窗測(cè)試、文件包含讀取源碼。每做一道題都要在本地搭環(huán)境復(fù)現(xiàn)一遍搞清楚“為什么能利用”而不是只滿足于“拿到Flag”。第二階段開始看別人的Writeup但看Writeup不是抄答案。我的習(xí)慣是先自己獨(dú)立思考24小時(shí)實(shí)在做不出來(lái)再看而且看完之后要自己重做一遍不看Writeup能獨(dú)立打穿才算真正掌握。第三階段把CTF里學(xué)到的技巧“翻譯”成實(shí)戰(zhàn)能力。比如CTF里的命令注入題對(duì)應(yīng)到真實(shí)業(yè)務(wù)里就是各種命令執(zhí)行漏洞CTF里的SQL注入繞過(guò)對(duì)應(yīng)到實(shí)戰(zhàn)里就是各種過(guò)濾不嚴(yán)的接口。多思考這種“翻譯”過(guò)程你的實(shí)戰(zhàn)能力會(huì)漲得很快。注意CTF平臺(tái)要在授權(quán)環(huán)境下練習(xí)拿到真實(shí)系統(tǒng)做測(cè)試必須擁有授權(quán)。沒有授權(quán)的測(cè)試屬于違法行為這是安全從業(yè)者不可逾越的底線。5. 常見問(wèn)題排查與避坑經(jīng)驗(yàn)最后這部分我從大量一線實(shí)操中挑出幾個(gè)高頻問(wèn)題和坑以速查的形式分享出來(lái)。這些都是常規(guī)文檔里不會(huì)明說(shuō)、但在真刀真槍的工作中一定會(huì)遇到的。5.1 新手學(xué)Web安全最容易踩的坑第一個(gè)坑上來(lái)就啃工具手冊(cè)。很多新人先把Burp Suite、sqlmap、Nmap的每一個(gè)選項(xiàng)都背下來(lái)結(jié)果遇到一個(gè)真實(shí)系統(tǒng)還是不知道怎么測(cè)。工具永遠(yuǎn)只是輔助真正的核心是HTTP協(xié)議的理解和漏洞原理的掌握。我個(gè)人建議先花時(shí)間把HTTP請(qǐng)求報(bào)文的每一行、Cookie的屬性和生命周期、同源策略這些基礎(chǔ)概念吃透工具自然用得明白。第二個(gè)坑只看攻擊不看防御。攻防是一體的只學(xué)攻擊不學(xué)防御漏洞原理理解不深只學(xué)防御不學(xué)攻擊永遠(yuǎn)不知道對(duì)手會(huì)從哪里進(jìn)來(lái)。我見過(guò)太多只刷CTF的攻擊型選手讓他寫代碼修復(fù)一個(gè)SQL注入他改來(lái)改去還是把用戶輸入直接拼接進(jìn)SQL也見過(guò)不少防御型的開發(fā)者遇到安全事件完全不知道該怎么排查。兩條腿走路才能在安全這條路上走得遠(yuǎn)。第三個(gè)坑忽視業(yè)務(wù)邏輯漏洞。很多人做滲透測(cè)試只關(guān)注XSS、SQL注入這類“經(jīng)典漏洞”卻對(duì)越權(quán)、驗(yàn)證碼邏輯繞過(guò)、支付金額篡改這類業(yè)務(wù)邏輯漏洞視而不見。但實(shí)戰(zhàn)中業(yè)務(wù)邏輯漏洞恰恰是高危漏洞的重災(zāi)區(qū)因?yàn)樗鼈兺耆蕾嚇I(yè)務(wù)場(chǎng)景工具掃不出來(lái)只能靠人肉分析。我在授權(quán)測(cè)試中拿到的“高危”“嚴(yán)重”級(jí)別漏洞至少有三分之一是業(yè)務(wù)邏輯類的。5.2 真實(shí)場(chǎng)景中的排查思路從告警到溯源先講一個(gè)真實(shí)案例。一次應(yīng)急響應(yīng)中客戶說(shuō)“網(wǎng)站響應(yīng)慢CPU一直100%”初步懷疑是遭到攻擊。我沒有直接看流量日志而是先跑到服務(wù)器上執(zhí)行了兩條命令top查CPU占用、ss -tlnp查網(wǎng)絡(luò)連接。結(jié)果發(fā)現(xiàn)一個(gè)可疑進(jìn)程占滿了CPU連接著一個(gè)陌生的外部IP。然后我找到對(duì)應(yīng)PID看了一下啟動(dòng)路徑和啟動(dòng)命令確認(rèn)是一個(gè)挖礦木馬。接下來(lái)按/proc/PID/exe定位了落地文件在crontab -l里找到了持久化任務(wù)又順手翻了一下.bash_history和auth.log還原出攻擊者是通過(guò)Redis未授權(quán)訪問(wèn)漏洞寫入定時(shí)任務(wù)完成入侵的。整個(gè)排查過(guò)程不到半小時(shí)但接后續(xù)要做的事還很多封禁攻擊源IP、清理惡意文件和計(jì)劃任務(wù)、修復(fù)Redis未授權(quán)訪問(wèn)漏洞、修改所有相關(guān)密碼、排查內(nèi)網(wǎng)橫向移動(dòng)痕跡。這個(gè)案例給我們的排查思路模板是這樣的先看主機(jī)層CPU異常、網(wǎng)絡(luò)連接異常、新增可疑進(jìn)程和文件這是發(fā)現(xiàn)入侵最快的方式。再看Web層Nginx訪問(wèn)日志里是否有掃描器特征、大量404、POST請(qǐng)求異常、可疑的User-Agent。三看賬號(hào)層是否有新增用戶、SSH登錄失敗次數(shù)是否異常、是否有陌生IP成功登錄。下面這張表是我個(gè)人常用的排查命令速查整理出來(lái)供你直接參考排查目標(biāo)常用命令重點(diǎn)關(guān)注可疑進(jìn)程top/ps aux --sort-%cpuCPU、內(nèi)存占用異常的進(jìn)程網(wǎng)絡(luò)連接ss -tlnp/netstat -antp異常外聯(lián)IP、可疑監(jiān)聽端口計(jì)劃任務(wù)crontab -l/cat /etc/crontab不認(rèn)識(shí)的反彈Shell或下載命令登錄日志last/cat /var/log/auth.log/cat /var/log/secure陌生IP、非業(yè)務(wù)時(shí)段的登錄成功記錄新增文件find /tmp -type f -mtime -7/tmp、/var/tmp下近期的可疑文件Web日志tail -f /var/log/nginx/access.logSQL注入函數(shù)、掃描器特征、高頻4045.3 一個(gè)務(wù)必養(yǎng)成的習(xí)慣記錄與復(fù)盤我做安全工作這些年最大的感悟就是安全不是靠天賦而是靠持續(xù)積累。每發(fā)現(xiàn)一個(gè)漏洞、每處理一次應(yīng)急響應(yīng)我都會(huì)把整個(gè)過(guò)程寫成文檔包含漏洞原理、利用方式、修復(fù)方案、檢測(cè)方法四個(gè)部分。久而久之這份文檔就是你自己最寶貴的武器庫(kù)。以后遇到相似的問(wèn)題查閱自己的筆記遠(yuǎn)比重新翻文檔、重新搜索來(lái)得快。給新人一個(gè)具體的建議準(zhǔn)備一個(gè)自己的漏洞筆記不需要用多復(fù)雜的工具M(jìn)arkdown文件或者本地Wiki都行。記錄的時(shí)候用我上面說(shuō)的“原理-利用-修復(fù)-檢測(cè)”四段式強(qiáng)制自己把來(lái)龍去脈想清楚。寫筆記的過(guò)程就是你從“會(huì)用”走向“理解”的過(guò)程。我個(gè)人在實(shí)際項(xiàng)目里的體會(huì)是Web安全這個(gè)領(lǐng)域入門不難但想做好做深需要的不是三天打魚兩天曬網(wǎng)的熱情而是持續(xù)對(duì)抗“已知與未知”的耐心。你今天多掌握一個(gè)繞過(guò)姿勢(shì)明天修復(fù)一個(gè)被忽視的配置隱患積累下來(lái)你就是團(tuán)隊(duì)里那個(gè)“遇到事情能搞定”的人。希望這篇文章能幫你在Web安全的路上少踩幾個(gè)坑少走幾段彎路。