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