卜宋博 葛小虎
(1.楊陵職業(yè)技術(shù)學(xué)院 陜西省咸陽市 712100 2.貴陽愛立示信息科技有限公司 貴州省貴陽市 550000)
目前,網(wǎng)絡(luò)安全形式日益嚴(yán)峻,網(wǎng)絡(luò)安全威脅不斷增加對(duì)國家政治、經(jīng)濟(jì)、文化、國防安全及公民在網(wǎng)絡(luò)空間中的合法權(quán)益面臨諸多風(fēng)險(xiǎn)與挑戰(zhàn)。而Web 漏洞作為網(wǎng)絡(luò)安全威脅因素中一個(gè)重要來源,更是不能忽視的。因此對(duì)Web 漏洞進(jìn)行分析及其檢測(cè)技術(shù)的研究是具有重大意義的。
Web 漏洞主要指網(wǎng)站程序自身存在致使網(wǎng)絡(luò)信息系統(tǒng)安全策略相沖突的缺陷,使得系統(tǒng)或其應(yīng)用數(shù)據(jù)的保密性、完整性、可用性、訪問控制等面臨威脅。攻擊者基于這些漏洞可能對(duì)網(wǎng)絡(luò)系統(tǒng)構(gòu)成:敏感信息泄露、身份假冒、拒絕服務(wù)、非授權(quán)訪問等威脅。
(1)高危漏洞:可以直接被利用的漏洞,并且利用難度較低。利用之后可能對(duì)網(wǎng)站或服務(wù)器的正常運(yùn)行造成嚴(yán)重影響、對(duì)用戶財(cái)產(chǎn)及個(gè)人信息造成重大損失。
(2)中危漏洞:利用難度極高,或滿足嚴(yán)格條件才能實(shí)現(xiàn)攻擊的漏洞?;蚵┒幢旧頍o法被直接攻擊,但能為進(jìn)一步攻擊起較大幫助作用的漏洞。
(3)低危漏洞:無法直接實(shí)現(xiàn)攻擊,當(dāng)信息泄露可能讓攻擊者更容易找到其他安全漏洞。
本文將著重去介紹、分析常見的 SQL 注入漏洞、跨站腳本、使用含有已知漏洞的組件,不安全的反序列化、XML 外部實(shí)體、文件上傳漏洞這六種常的Web 漏洞。
2.3.1 注入漏洞
是指因字符的過濾規(guī)則不嚴(yán)謹(jǐn)造成的,攻擊者可以將不受用戶信任的數(shù)據(jù)作為命令或者信息發(fā)送到服務(wù)器解析器。攻擊者的惡意數(shù)據(jù)可以誘使服務(wù)器解釋器在沒有相應(yīng)授權(quán)的情況下執(zhí)行惡意命令和非法訪問數(shù)據(jù)。最常見的當(dāng)屬SQL 注入漏洞,根據(jù)注入點(diǎn)的數(shù)據(jù)類型不同,我們主要將其分為兩大類:數(shù)字/整數(shù)型注入和字符型注入。
數(shù)字/整數(shù)型注入:
當(dāng)注入的參數(shù)為整數(shù)時(shí)就是數(shù)字型注入,或者叫整數(shù)型注入。其SQL 語句原型一般為:
SELECT * FROM table WHERE id=1
此處id 參數(shù)為整數(shù),語句兩邊沒有引號(hào)。測(cè)試時(shí)候可以使用1+2 和4-1 這種計(jì)算結(jié)果相同的參數(shù)值去構(gòu)造請(qǐng)示,對(duì)比響應(yīng)結(jié)果是否一致,如果兩者結(jié)果相同就可能存在數(shù)字型注入。
字符型注入:
注入?yún)?shù)為字符串時(shí)就是字符型注入,其 SQL 語句原型類似:
SELECT * FROM table WHERE name='test'
此處的 name 為字符串參數(shù),兩邊包含引號(hào)。這種類型的注入一般很好判斷。
除了這兩種類型,常見的搜索型注入,但我們認(rèn)為其本質(zhì)仍然屬于字符型注入,只是相對(duì)特殊,因?yàn)榇祟愖⑷氤3S?作為關(guān)鍵字去閉合SQL 語句。
實(shí)際場(chǎng)景常見的注入方式包含布爾型盲注、報(bào)錯(cuò)型注入、聯(lián)合查詢注入、多語句堆疊注入、基于時(shí)間延遲盲注、內(nèi)聯(lián)/嵌套查詢注入。通常防御 SQL 注入的方法有白名單、參數(shù)化查詢、WAF、RASP 等方法。如果請(qǐng)求參數(shù)有特定值的約束,比如參數(shù)是固定整數(shù)值,那么就只允許接收整數(shù);還有就是常量值限制,比如特定的字符串、整數(shù)值等。這個(gè)時(shí)候,最好采用白名單的方式。參數(shù)化查詢是預(yù)編譯 SQL 語句的一種處理方式,所以也叫預(yù)編譯查詢,它可以將輸入數(shù)據(jù)插入到 SQL 語句中的“參數(shù)”(即變量)中,防止數(shù)據(jù)被當(dāng)作 SQL 語句執(zhí)行,從而防止 SQL 注入漏洞的產(chǎn)生。WAF(Web 防火墻)能夠抵擋住部分的SQL 注入攻擊。RASP 不用考慮網(wǎng)絡(luò)請(qǐng)求中的各種復(fù)雜的數(shù)據(jù)處理過程,只需要在對(duì)應(yīng)的漏洞觸發(fā)函數(shù)進(jìn)行 Hook 插樁檢測(cè)等操作,同時(shí) RASP 能夠給出漏洞觸發(fā)的程序上下文,幫助開發(fā)人員和安全人員快速定位漏洞代碼,并實(shí)現(xiàn)漏洞的檢測(cè)、告警和阻斷。
2.3.2 跨站腳本(XSS)
在常見的Web 漏洞中,XSS 漏洞無疑是最常多見的。
XSS 漏洞具體是指在網(wǎng)頁中包含不受信任的、未經(jīng)恰當(dāng)驗(yàn)證或轉(zhuǎn)義的數(shù)據(jù)時(shí),或者使用可以創(chuàng)建 HTML 或 JavaScript 的瀏覽器API 更新現(xiàn)有的網(wǎng)頁時(shí),就會(huì)出現(xiàn) XSS 缺陷。XSS 讓攻擊者能夠在受害者的瀏覽器中執(zhí)行腳本,實(shí)現(xiàn)盜號(hào)、釣魚欺詐、篡改頁面、刷廣告流量、網(wǎng)頁掛馬、挖礦、鍵盤監(jiān)聽、竊取用戶隱私等等惡意行為。
反射式XSS:這種類型的XSS 漏會(huì)使應(yīng)用程序或API 包括未經(jīng)過驗(yàn)證的用戶進(jìn)行輸入,作為HTML 輸出的一部分。攻擊者事將先制作好攻擊鏈接,需要欺騙用戶自己去點(diǎn)擊鏈接才能觸發(fā)XSS代碼,。換而言之,用戶將需要與指向攻擊者控制頁面的某些惡意鏈接進(jìn)行交互。常見形態(tài)有廣告或非法內(nèi)容、惡意漏洞網(wǎng)站。
存儲(chǔ)式XSS:應(yīng)用程序或者API 將未過濾的用戶輸入存儲(chǔ)下來了,并在后期在其他用戶或者管理員的頁面展示出來。也就是說,代碼是存儲(chǔ)在服務(wù)器中的,如在個(gè)人信息或發(fā)表文章等地方加入代碼,如果沒有過濾或過濾不嚴(yán),那么這些代碼將儲(chǔ)存到服務(wù)器中,每當(dāng)有用戶訪問該頁面的時(shí)候都會(huì)觸發(fā)代碼執(zhí)行,容易造成蠕蟲,盜竊cookie 等。
基于DOM 的XSS:DOM 是一個(gè)與平臺(tái)、編程語言無關(guān)的接口,它允許程序或者腳本動(dòng)態(tài)的訪問和更新文檔內(nèi)容、結(jié)構(gòu)和樣式,處理后的結(jié)果仍然能夠成為顯示頁面的一部分。如果DOM 中的數(shù)據(jù)沒有經(jīng)過邏輯嚴(yán)密的確認(rèn),就會(huì)產(chǎn)生基于DOM 的XSS 漏洞。這種XSS 漏洞一般存在于頁面的JavaScript 框架、API、單頁面程序中,攻擊者可以動(dòng)態(tài)的將可控腳本加入其中。
XSS 的防御也必須根據(jù)不同位置采取不同的方案,具體有四種防御手段:輸入檢查、輸出檢查、Httponly Cookie、CSP。在測(cè)試XSS 時(shí),經(jīng)常需要輸入一些特殊字符,所以在最開始就直接做好輸入檢查有利于減少被攻擊的可能性;XSS 的出發(fā)關(guān)鍵點(diǎn)在于輸出的位置,所以對(duì)輸出檢查尤為重要,當(dāng)有網(wǎng)站需要支持富文本時(shí),此時(shí)采用白名單的方式,直接限制允許輸入的標(biāo)簽、字符是最佳方案;如果你在 Cookie 中設(shè)置了 HttpOnly 屬性,那 JavaScript 腳本將無法讀取到 Cookie,這樣就能防止通過 XSS 竊取 Cookie,在一定程度上能夠減少 XSS 的攻擊范圍;內(nèi)容安全策略(Content Security Policy,CSP)也是減少 XSS 攻擊的一種方式,是瀏覽器提供一種防御機(jī)制。它采用的是白名單機(jī)制,告訴瀏覽器可以加載和執(zhí)行哪些外部資源,這樣就能防止被一些第三方惡意腳本注入執(zhí)行,我們可以通過HTTP 頭信息的Content-Security-Policy 的字段和網(wǎng)頁的標(biāo)簽設(shè)置去開啟CSP。
2.3.3 使用含有已知漏洞的組件
組件(例如:庫、框架和其他軟件模塊)擁有和應(yīng)用程序相同的權(quán)限。如果應(yīng)用程序中含有已知漏洞的組件被攻擊者利用,可能會(huì)造成嚴(yán)重的數(shù)據(jù)丟失或服務(wù)器接管。使用含有已知漏洞的組件的應(yīng)用程序和API 可能會(huì)破壞應(yīng)用程序防御、造成各種攻擊并產(chǎn)生嚴(yán)重影響。
在軟件開發(fā)或者運(yùn)行維護(hù)就當(dāng)我們要做到:使用公共數(shù)據(jù)庫(如CVE 和CNVD 等漏洞中心),項(xiàng)目郵件列表和安全郵件列表中時(shí)刻關(guān)注這些組件的安全信息并保證它們是最新的;建立組件使用的安全策略,比如需要某些軟件開發(fā)實(shí)踐,通過安全性測(cè)試保障發(fā)全新;在適當(dāng)?shù)那闆r下,考慮增加對(duì)組件的安全封裝,去掉不使用的功能和/或安全薄弱的或者組件易受攻擊的方面。
2.3.4 不安全的反序列化
在Web 應(yīng)用程序中,序列化是把對(duì)象轉(zhuǎn)換成有序字節(jié)流,通常都是一段可閱讀的字符串,以便在網(wǎng)絡(luò)上傳輸或者保存在本地文件中。同樣,如果我們想直接使用某對(duì)象時(shí),就可能通過反序列化前面保存的字符串,快速地重建對(duì)象,也不用重寫一遍代碼,提高工作效率。
不安全的反序列化會(huì)導(dǎo)致遠(yuǎn)程代碼執(zhí)行。即使反序列化缺陷不會(huì)導(dǎo)致遠(yuǎn)程代碼執(zhí)行,攻擊者也可以利用改變應(yīng)用邏輯或者實(shí)現(xiàn)遠(yuǎn)程代碼來執(zhí)行攻擊,我們稱其為數(shù)據(jù)結(jié)構(gòu)攻擊。包括:重播攻擊、注入攻擊和特權(quán)升級(jí)攻擊。
2.3.5 XML 外部實(shí)體
XML 全稱可擴(kuò)展標(biāo)記語言。與HTML一樣,XML 使用標(biāo)簽和數(shù)據(jù)的樹狀結(jié)構(gòu)。XML 外部實(shí)體攻擊是一種針對(duì)解析XML 格式應(yīng)用程序的攻擊類型之一,許多較早的或配置錯(cuò)誤的XML 處理器評(píng)估了XML 文件中的外部實(shí)體引用,攻擊一般發(fā)生在配置不當(dāng)?shù)腦ML 解析器處理指向外部實(shí)體的文檔時(shí)。信息安全人員通過構(gòu)造惡意內(nèi)容,導(dǎo)致讀取任意文件、執(zhí)行系統(tǒng)命令、內(nèi)網(wǎng)探測(cè)與攻擊等危害的一類漏洞。
XML 主要的漏洞是XXE,不同的 XML 解析庫有不同的關(guān)閉方式,比如全面介紹 XXE 防御方案的是 OWASP 發(fā)表的“XML External Entity Prevention Cheat Sheet”,針對(duì)不同的語言、XML 解析庫,給出不同的防御方案,并提供關(guān)閉 XML 實(shí)體引用的代碼示例。
2.3.6 文件上傳漏洞
這是由于在文件上傳功能中,由于對(duì)用戶上傳的文件數(shù)據(jù)未做有效檢測(cè)或過濾不嚴(yán),導(dǎo)致上傳的惡意文件被服務(wù)端解釋器解析執(zhí)行,利用漏洞可獲取系統(tǒng)控制權(quán)。很多網(wǎng)站都有一些文件上傳功能,常見的是圖片、視頻、壓縮文檔上傳,如果網(wǎng)站是 PHP 寫的,那么上傳 PHP 到服務(wù)器就有可能被解析,若服務(wù)器支持其他語言的解析執(zhí)行,比如 ASP、JSP、ASPX 等文件也可達(dá)到同等攻擊效果,達(dá)到惡意代碼執(zhí)行。
針對(duì)這種漏洞,使用WAF 攔截木馬上傳,但這種比較容易被繞過;重編碼文件,比如對(duì)視頻或者圖片做轉(zhuǎn)換處理;嚴(yán)格檢測(cè)上傳文件后綴名、文件頭、Content-type;限制文件大小和上傳的目錄不可解析;隱藏上傳文件路徑相關(guān)信息,比如關(guān)閉錯(cuò)誤回顯;這些都是常見的安全防護(hù)措施。
現(xiàn)在主流的Web 漏洞檢測(cè)方式基本分為以下三種:SAST(靜態(tài)應(yīng)用安全測(cè)試)、DAST(動(dòng)態(tài)應(yīng)用安全測(cè)試)和 IAST(交互式應(yīng)用安全測(cè)試)。
SAST(Static Application Security Testing,靜態(tài)應(yīng)用程序安全測(cè)試)
SAST 是通過分應(yīng)用程序源代碼以提早發(fā)現(xiàn)安全漏洞,也包括二進(jìn)制文件的靜態(tài)逆向分析。在產(chǎn)品形式上,主要體現(xiàn)為代碼審計(jì)系統(tǒng)等。SAST 分析比較全面,漏洞發(fā)現(xiàn)率高,哪怕是當(dāng)前未能執(zhí)行到的代碼,也可能被發(fā)現(xiàn)到漏洞,但是對(duì)于它最大的挑戰(zhàn)是如何降低誤報(bào)率。但代碼審計(jì)本質(zhì)上就是在誤報(bào)率與發(fā)現(xiàn)率之間相互協(xié)調(diào),直到在可接受的范圍內(nèi)找到一個(gè)平衡的過程。如果發(fā)現(xiàn)率很高,但其中包含過多的誤報(bào),告警量多到無法運(yùn)營的程度,那也等同于沒發(fā)現(xiàn)。
DAST(Dynamic Application Security Testing,動(dòng)態(tài)應(yīng)用程序安全測(cè)試)
DAST 是對(duì)應(yīng)用程序進(jìn)行黑盒分析,通常在測(cè)試或運(yùn)行階段分析應(yīng)用程序的動(dòng)態(tài)運(yùn)行狀態(tài),通過模擬黑客行為對(duì)應(yīng)用程序進(jìn)行動(dòng)態(tài)攻擊,分析應(yīng)用程序的反應(yīng),從而確定是否存在漏洞。DAST 通過動(dòng)態(tài)發(fā)送 payload 來測(cè)試漏洞,所以準(zhǔn)確率相對(duì)較高,而且檢測(cè)出來后就直接有現(xiàn)成的 PoC(Proof of Concept,概念驗(yàn)證)可以驗(yàn)證。但如果有些代碼未執(zhí)行,就無法發(fā)現(xiàn)。因此,跟 SAST 結(jié)合使用是最好的方式。DAST 在產(chǎn)品上一般體現(xiàn)為漏洞掃描器。
IAST(Interactive Application Security Testing,交互式應(yīng)用安全測(cè)試)
IAST 是近幾年興起的一種應(yīng)用安全測(cè)試新技術(shù),曾被 Gartner咨詢公司列為網(wǎng)絡(luò)安全領(lǐng)域的 Top 10 技術(shù)之一。IAST 融合了DAST 和 SAST 的優(yōu)勢(shì),漏洞檢出率極高、誤報(bào)率極低,同時(shí)可以定位到 API 接口和代碼片段。
本文介紹了一些常見的Web 漏洞特性以及防范技術(shù)、當(dāng)下主流的Web 漏洞檢測(cè)技術(shù),這些漏洞掃描技術(shù)在一定程度保證了網(wǎng)絡(luò)系統(tǒng)的安全。希望信息安全從業(yè)人員、開發(fā)人員在日常研究工作中能夠提防這些漏洞,研究開發(fā)下一代新型漏洞檢測(cè)技術(shù),為網(wǎng)絡(luò)安全提供保障。