Go應(yīng)用程序需要注意的漏洞備忘單
譯文Go應(yīng)用程序中需要注意27個(gè)漏洞,其中包括任意文件寫(xiě)入、目錄遍歷、反序列化等。
保護(hù)應(yīng)用程序并不是最簡(jiǎn)單的事情。而一個(gè)應(yīng)用程序有許多組件:服務(wù)器端邏輯、客戶(hù)端邏輯、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)傳輸、API等等。而為了保護(hù)所有這些組件的安全,構(gòu)建安全的應(yīng)用程序似乎真的令人生畏。
值得慶幸的是,大多數(shù)現(xiàn)實(shí)生活中的漏洞都有相同的根源。通過(guò)研究這些常見(jiàn)的漏洞類(lèi)型、發(fā)生的原因以及如何發(fā)現(xiàn)它,可以學(xué)會(huì)預(yù)防,并保護(hù)應(yīng)用程序。
每種語(yǔ)言、框架或環(huán)境的使用都會(huì)使應(yīng)用程序暴露于一組獨(dú)特的漏洞中。修復(fù)應(yīng)用程序漏洞的第一步是知道需要尋找什么。以下是影響Go應(yīng)用程序的27個(gè)最常見(jiàn)的漏洞,以及如何找到預(yù)防的方法。
企業(yè)需要致力于保護(hù)Go應(yīng)用程序。以下是需要關(guān)注的27個(gè)漏洞:
(1)XML外部實(shí)體攻擊
XML外部實(shí)體攻擊(XXE)是指攻擊者利用XML解析器讀取服務(wù)器上的任意一些文件。使用XXE,攻擊者還可以檢索用戶(hù)信息、配置文件或其他敏感信息,例如AWS憑證。而為了防止XXE攻擊,需要明確禁用這些功能。
(2)不安全的反序列化
序列化是將編程語(yǔ)言中的對(duì)象(例如Python對(duì)象)轉(zhuǎn)換為可以保存到數(shù)據(jù)庫(kù)或通過(guò)網(wǎng)絡(luò)傳輸格式的過(guò)程。而反序列化則相反:它是從文件或網(wǎng)絡(luò)中讀取序列化對(duì)象并轉(zhuǎn)換回對(duì)象的過(guò)程。許多編程語(yǔ)言都支持對(duì)象的序列化和反序列化,其中包括Java、PHP、Python和Ruby。
不安全的反序列化是一種漏洞,當(dāng)攻擊者可以操縱序列化對(duì)象并在程序流程中造成意想不到的后果時(shí),就會(huì)出現(xiàn)這種漏洞。不安全的反序列化漏洞通常是非常關(guān)鍵的漏洞:不安全的反序列化漏洞通常會(huì)導(dǎo)致身份驗(yàn)證繞過(guò)、拒絕服務(wù),甚至是執(zhí)行任意代碼。
為了防止不安全的反序列化,需要首先留意最新的補(bǔ)丁并保持依賴(lài)關(guān)系。許多不安全的反序列化漏洞是通過(guò)依賴(lài)項(xiàng)引入的,因此需要確保其第三方代碼是安全的。它還有助于避免使用序列化對(duì)象,而是使用簡(jiǎn)單的數(shù)據(jù)類(lèi)型,如字符串和數(shù)組。
(3)遠(yuǎn)程代碼執(zhí)行
遠(yuǎn)程代碼執(zhí)行漏洞(RCE)是攻擊者可以在他人的機(jī)器上執(zhí)行其代碼時(shí)發(fā)生的一類(lèi)漏洞。當(dāng)Web服務(wù)器成為目標(biāo)時(shí),攻擊者通常通過(guò)HTTP請(qǐng)求注入惡意輸入來(lái)實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行漏洞(RCE),這些輸入被服務(wù)器錯(cuò)誤地評(píng)估為代碼。
在Go中,開(kāi)發(fā)人員經(jīng)常使用net/rpc或grpc等數(shù)據(jù)包來(lái)允許通過(guò)網(wǎng)絡(luò)遠(yuǎn)程調(diào)用方法。在這種情況下,確保任何過(guò)程調(diào)用來(lái)自受信任的來(lái)源非常重要。
(4)注入
當(dāng)應(yīng)用程序無(wú)法正確區(qū)分不受信任的用戶(hù)數(shù)據(jù)和代碼時(shí),就會(huì)發(fā)生注入問(wèn)題。例如以上所說(shuō)的例子,通過(guò)代碼注入的RCE就是一種注入漏洞。但注入漏洞也以其他方式表現(xiàn)出來(lái)。
(5)SQL注入
例如,在SQL注入攻擊中,攻擊者通過(guò)注入數(shù)據(jù)來(lái)操縱SQL命令。當(dāng)應(yīng)用程序沒(méi)有正確驗(yàn)證用戶(hù)輸入時(shí),攻擊者可以插入SQL語(yǔ)言的特殊字符來(lái)擾亂查詢(xún)邏輯,從而執(zhí)行任意SQL代碼。
SQL注入能夠讓攻擊者代碼更改應(yīng)用程序SQL查詢(xún)的結(jié)構(gòu),以竊取數(shù)據(jù)、修改數(shù)據(jù)或可能在底層操作系統(tǒng)中執(zhí)行任意命令。防止SQL注入的最好方法是使用參數(shù)化語(yǔ)句,這使得SQL注入幾乎不可能。
(6)NoSQL注入
數(shù)據(jù)庫(kù)并不總是使用SQL。NoSQL數(shù)據(jù)庫(kù)或NotOnlySQL數(shù)據(jù)庫(kù)是不使用SQL語(yǔ)言的數(shù)據(jù)庫(kù)。NoSQL注入是指將數(shù)據(jù)注入到這些數(shù)據(jù)庫(kù)語(yǔ)言的邏輯中的攻擊。NoSQL注入可能與SQL注入一樣嚴(yán)重:它們可能導(dǎo)致身份驗(yàn)證繞過(guò)和遠(yuǎn)程代碼執(zhí)行。
(7)日志注入
用戶(hù)可能會(huì)執(zhí)行系統(tǒng)日志記錄以監(jiān)控網(wǎng)絡(luò)中發(fā)生的惡意活動(dòng)。但是有沒(méi)有想過(guò)其日志文件條目可能會(huì)撒謊?與其他系統(tǒng)文件一樣,日志文件可能會(huì)被惡意行為者篡改。攻擊者經(jīng)常修改日志文件以在攻擊期間掩蓋他們的蹤跡。日志注入是攻擊者可以更改其日志文件的方式之一。當(dāng)攻擊者欺騙應(yīng)用程序在用戶(hù)的日志文件中寫(xiě)入虛假條目時(shí),就會(huì)發(fā)生這種情況。
當(dāng)應(yīng)用程序不清理寫(xiě)入日志的輸入中的換行符“\n”時(shí),通常會(huì)發(fā)生日志注入。攻擊者可以利用換行符將新條目插入應(yīng)用程序日志。攻擊者可以利用日志中的用戶(hù)輸入的另一種方式是,他們可以將惡意HTML注入日志條目,以嘗試在查看日志的管理員的瀏覽器上觸發(fā)XSS。
為了防止日志注入攻擊,需要一種方法來(lái)區(qū)分真實(shí)日志條目和攻擊者注入的虛假日志條目。一種方法是在每個(gè)日志條目前添加額外的元數(shù)據(jù),如時(shí)間戳、進(jìn)程ID和主機(jī)名。用戶(hù)還應(yīng)該將日志文件的內(nèi)容視為不受信任的輸入,并在訪(fǎng)問(wèn)或操作它們之前對(duì)其進(jìn)行驗(yàn)證。
(8)郵件注入
許多Web應(yīng)用程序會(huì)根據(jù)用戶(hù)的操作向用戶(hù)發(fā)送電子郵件。例如,如果訂閱了新聞媒體上的提要,該網(wǎng)站可能會(huì)向用戶(hù)發(fā)送包含提要名稱(chēng)的確認(rèn)信息。
當(dāng)應(yīng)用程序使用用戶(hù)輸入來(lái)確定將電子郵件發(fā)送到哪些地址或包含在電子郵件中的內(nèi)容時(shí),就會(huì)發(fā)生郵件注入。這可以讓垃圾郵件發(fā)送者使用其服務(wù)器向用戶(hù)發(fā)送大量電子郵件,或者使詐騙者能夠通過(guò)其電子郵件地址進(jìn)行社會(huì)工程活動(dòng)。
(9)模板注入
模板引擎是一種用于確定網(wǎng)頁(yè)外觀(guān)的軟件。這些Web模板以Jinja等模板語(yǔ)言編寫(xiě),為開(kāi)發(fā)人員提供了一種通過(guò)將應(yīng)用程序數(shù)據(jù)與Web模板相結(jié)合來(lái)指定如何呈現(xiàn)頁(yè)面的方法。Web模板和模板引擎一起允許開(kāi)發(fā)人員在Web開(kāi)發(fā)期間將服務(wù)器端應(yīng)用程序邏輯與客戶(hù)端表示代碼分開(kāi)。
模板注入是指注入到網(wǎng)頁(yè)模板中。根據(jù)受感染的應(yīng)用程序的權(quán)限,攻擊者可能能夠使用模板注入漏洞來(lái)讀取敏感文件、執(zhí)行代碼或提升他們?cè)谙到y(tǒng)上的權(quán)限。
(10)正則表達(dá)式注入
正則表達(dá)式是描述文本中搜索模式的特殊字符串。有時(shí),應(yīng)用程序讓用戶(hù)提供自己的正則表達(dá)式模式,以供服務(wù)器執(zhí)行或使用用戶(hù)輸入構(gòu)建正則表達(dá)式。正則表達(dá)式注入攻擊或正則表達(dá)式拒絕服務(wù)攻擊(ReDoS)發(fā)生在攻擊者為正則表達(dá)式引擎提供需要很長(zhǎng)時(shí)間評(píng)估的模式的時(shí)候。
值得慶幸的是,通過(guò)不從用戶(hù)輸入生成正則表達(dá)式模式,并通過(guò)構(gòu)造精心設(shè)計(jì)的正則表達(dá)式模式,其所需的計(jì)算時(shí)間不會(huì)隨著文本字符串的增長(zhǎng)而呈指數(shù)增長(zhǎng),能夠可靠地防止正則表達(dá)式注入。
(11)XPath注入
XPath是一種用于XML文檔的查詢(xún)語(yǔ)言。為XML考慮SQL。XPath用于對(duì)存儲(chǔ)在XML文檔中的數(shù)據(jù)進(jìn)行查詢(xún)和操作。例如,XPath可用于檢索存儲(chǔ)在XML文檔中的員工工資信息。它還可用于對(duì)該數(shù)據(jù)執(zhí)行數(shù)字運(yùn)算或比較。
XPath注入是一種注入XPath表達(dá)式以改變查詢(xún)結(jié)果的攻擊。和SQL注入一樣,它可以用來(lái)繞過(guò)業(yè)務(wù)邏輯,提升用戶(hù)權(quán)限,泄露敏感數(shù)據(jù)。由于應(yīng)用程序經(jīng)常使用XML在系統(tǒng)和Web服務(wù)之間傳遞敏感數(shù)據(jù),因此這些地方更容易受到XPath注入的影響。與其他類(lèi)型的注入漏洞類(lèi)似,用戶(hù)可以通過(guò)驗(yàn)證和清理用戶(hù)輸入來(lái)防止XPath注入。
(12)標(biāo)頭注入
當(dāng)HTTP響應(yīng)標(biāo)頭是從不受信任的輸入動(dòng)態(tài)構(gòu)建時(shí),就會(huì)發(fā)生標(biāo)頭注入。根據(jù)漏洞影響的響應(yīng)標(biāo)頭,標(biāo)頭注入可能導(dǎo)致跨站點(diǎn)腳本、開(kāi)放重定向和會(huì)話(huà)固定。
例如,如果標(biāo)頭可以由URL參數(shù)控制,則攻擊者可以通過(guò)在參數(shù)中指定他們的惡意站點(diǎn)來(lái)導(dǎo)致開(kāi)放重定向。攻擊者甚至可以在受害者的瀏覽器上執(zhí)行惡意腳本,或者通過(guò)標(biāo)頭注入向受害者發(fā)送完全受控的HTTP響應(yīng)來(lái)強(qiáng)制受害者下載惡意軟件。
可以通過(guò)避免將用戶(hù)輸入寫(xiě)入響應(yīng)標(biāo)頭、從用戶(hù)輸入中去除換行符(換行符用于創(chuàng)建新的HTTP響應(yīng)標(biāo)頭)以及使用允許列表來(lái)驗(yàn)證標(biāo)頭值來(lái)防止標(biāo)頭注入。
(13)會(huì)話(huà)注入和不安全的cookie
會(huì)話(huà)注入是一種標(biāo)頭注入。如果攻擊者可以操縱他們的會(huì)話(huà)cookie的內(nèi)容,或者竊取其他人的cookie,他們可以欺騙應(yīng)用程序。攻擊者可以通過(guò)三種主要方式獲取他人的會(huì)話(huà):會(huì)話(huà)劫持、會(huì)話(huà)篡改和會(huì)話(huà)欺騙。
會(huì)話(huà)劫持是指攻擊者竊取別人的會(huì)話(huà)cookie并將其用作自己的。攻擊者經(jīng)常通過(guò)XSS或MITM(中間人)攻擊竊取會(huì)話(huà)cookie。會(huì)話(huà)篡改是指攻擊者可以更改其會(huì)話(huà)cookie以更改服務(wù)器解釋其身份的方式。當(dāng)會(huì)話(huà)狀態(tài)在cookie中進(jìn)行通信并且cookie沒(méi)有正確簽名或加密時(shí),就會(huì)發(fā)生這種情況。最后,當(dāng)會(huì)話(huà)ID是可預(yù)測(cè)的時(shí),攻擊者可以欺騙會(huì)話(huà)。如果是這種情況,攻擊者可以偽造有效的會(huì)話(huà)cookie并以其他人的身份登錄。防止這些會(huì)話(huà)管理陷阱需要多層防御。
(14)主機(jī)標(biāo)頭中毒
Web服務(wù)器通常在同一個(gè)IP地址上托管多個(gè)不同的網(wǎng)站。HTTP請(qǐng)求到達(dá)某個(gè)IP地址后,服務(wù)器會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到主機(jī)標(biāo)頭中指定的主機(jī)。盡管主機(jī)標(biāo)頭通常由用戶(hù)的瀏覽器設(shè)置,但它仍然是用戶(hù)提供的輸入,因此不應(yīng)被信任。
如果Web應(yīng)用程序在使用主機(jī)標(biāo)頭構(gòu)造地址之前未對(duì)其進(jìn)行驗(yàn)證,則攻擊者可以通過(guò)Host標(biāo)頭發(fā)起一系列攻擊,例如XSS、服務(wù)器端請(qǐng)求偽造(SSRF)和Web緩存中毒攻擊。例如,如果應(yīng)用程序使用主機(jī)標(biāo)頭來(lái)確定腳本的位置,則攻擊者可以提交惡意主機(jī)標(biāo)頭以使應(yīng)用程序執(zhí)行惡意腳本:
Go
1 scriptURL := fmt.Sprintf("https://%s/script.js",
2 request.Header.Get("Host"))
(15)敏感數(shù)據(jù)泄露
當(dāng)應(yīng)用程序未能正確保護(hù)敏感信息時(shí),就會(huì)發(fā)生敏感數(shù)據(jù)泄漏,從而使用戶(hù)能夠訪(fǎng)問(wèn)他們不應(yīng)該獲得的信息。這些敏感信息可能包括有助于攻擊的技術(shù)細(xì)節(jié),例如軟件版本號(hào)、內(nèi)部IP地址、敏感文件名和文件路徑。它還可能包含允許攻擊者對(duì)應(yīng)用程序進(jìn)行源代碼審查的源代碼。有時(shí),該應(yīng)用程序會(huì)泄露用戶(hù)的私人信息,例如他們的銀行帳號(hào)、電子郵件地址和郵寄地址。
應(yīng)用程序泄漏敏感技術(shù)細(xì)節(jié)的一些常見(jiàn)方式是通過(guò)描述性響應(yīng)頭、帶有堆棧跟蹤或數(shù)據(jù)庫(kù)錯(cuò)誤消息的描述性錯(cuò)誤消息、系統(tǒng)文件系統(tǒng)上的開(kāi)放目錄列表,以及在HTML和模板文件中顯示注釋。
(16)身份驗(yàn)證繞過(guò)
身份驗(yàn)證指的是在執(zhí)行敏感操作或訪(fǎng)問(wèn)敏感數(shù)據(jù)之前證明自己的身份。如果未在應(yīng)用程序上正確實(shí)施身份驗(yàn)證,攻擊者可以利用這些錯(cuò)誤配置來(lái)訪(fǎng)問(wèn)他們不能夠訪(fǎng)問(wèn)的功能。
(17)訪(fǎng)問(wèn)控制不當(dāng)
身份驗(yàn)證繞過(guò)問(wèn)題本質(zhì)上是不正確的訪(fǎng)問(wèn)控制。當(dāng)應(yīng)用程序中的訪(fǎng)問(wèn)控制實(shí)施不當(dāng)并且可以被攻擊者繞過(guò)時(shí),任何時(shí)候都會(huì)發(fā)生不當(dāng)?shù)脑L(fǎng)問(wèn)控制。然而,訪(fǎng)問(wèn)控制不僅僅包括身份驗(yàn)證。雖然身份驗(yàn)證要求用戶(hù)證明他們的身份:“你是誰(shuí)?”,但授權(quán)要求應(yīng)用程序“允許此用戶(hù)做什么?”。適當(dāng)?shù)纳矸蒡?yàn)證和授權(quán)共同確保用戶(hù)無(wú)法訪(fǎng)問(wèn)超出其權(quán)限的功能。
為用戶(hù)配置授權(quán)有多種方式:基于角色的訪(fǎng)問(wèn)控制、基于所有權(quán)的訪(fǎng)問(wèn)控制、訪(fǎng)問(wèn)控制列表等。
(18)目錄遍歷
目錄遍歷漏洞是另一種不恰當(dāng)?shù)脑L(fǎng)問(wèn)控制。當(dāng)攻擊者可以通過(guò)操縱用戶(hù)輸入字段中的文件路徑來(lái)查看、修改或執(zhí)行他們不應(yīng)訪(fǎng)問(wèn)的文件時(shí),就會(huì)發(fā)生這種情況。這一過(guò)程涉及通過(guò)將../字符或其他特殊字符添加到文件路徑來(lái)操作應(yīng)用程序,用于引用文件的文件路徑變量。../序列指的是Unix系統(tǒng)中當(dāng)前目錄的父目錄,因此通過(guò)將其添加到文件路徑中,通??梢栽L(fǎng)問(wèn)web目錄之外的系統(tǒng)文件。
攻擊者通??梢允褂媚夸洷闅v來(lái)訪(fǎng)問(wèn)敏感文件,如配置文件、日志文件和源代碼。為了防止目錄遍歷,應(yīng)該驗(yàn)證插入到文件路徑中的用戶(hù)輸入,或者避免直接引用文件名并改用間接標(biāo)識(shí)符。
(19)任意文件寫(xiě)入
任意文件寫(xiě)入漏洞的工作方式與目錄遍歷類(lèi)似。如果應(yīng)用程序?qū)⑽募?xiě)入底層機(jī)器,并通過(guò)用戶(hù)輸入確定輸出文件名,則攻擊者可能能夠在他們想要的任何路徑上創(chuàng)建任意文件或覆蓋現(xiàn)有系統(tǒng)文件。攻擊者可能能夠更改密碼文件或日志文件等關(guān)鍵系統(tǒng)文件,或?qū)⑺麄冏约旱目蓤?zhí)行文件添加到腳本目錄中。
減輕這種風(fēng)險(xiǎn)的最佳方法是不根據(jù)任何用戶(hù)輸入創(chuàng)建文件名,包括會(huì)話(huà)信息、HTTP輸入或用戶(hù)控制的任何內(nèi)容。應(yīng)該控制每個(gè)創(chuàng)建的文件的文件名、路徑和擴(kuò)展名。例如,在用戶(hù)每次需要生成唯一文件時(shí)生成一個(gè)隨機(jī)的字母數(shù)字文件名,還可以在創(chuàng)建文件之前去除用戶(hù)輸入的特殊字符。
(20)拒絕服務(wù)攻擊
拒絕服務(wù)攻擊或DoS攻擊會(huì)破壞目標(biāo)機(jī)器,使合法用戶(hù)無(wú)法訪(fǎng)問(wèn)其服務(wù)。攻擊者可以通過(guò)耗盡所有服務(wù)器資源、崩潰進(jìn)程或一次發(fā)出過(guò)多耗時(shí)的HTTP請(qǐng)求來(lái)發(fā)起DoS攻擊。
拒絕服務(wù)攻擊很難防御。但是有一些方法可以通過(guò)讓攻擊者盡可能地困難來(lái)最小化風(fēng)險(xiǎn)。例如,可以部署提供DoS保護(hù)的防火墻,并通過(guò)設(shè)置文件大小限制和禁止某些文件類(lèi)型來(lái)防止基于邏輯的DoS攻擊。
(21)加密漏洞
加密問(wèn)題可能是應(yīng)用程序中可能發(fā)生的最嚴(yán)重的漏洞之一。加密漏洞是指未正確實(shí)施加密和散列。這可能導(dǎo)致廣泛的數(shù)據(jù)泄漏和通過(guò)會(huì)話(huà)欺騙繞過(guò)身份驗(yàn)證。
開(kāi)發(fā)人員在網(wǎng)站上實(shí)施加密時(shí)常犯的一些錯(cuò)誤是:
?使用弱算法。
?使用錯(cuò)誤的算法達(dá)到目的。
?創(chuàng)建自定義算法。
?生成弱隨機(jī)數(shù)。
?將編碼誤認(rèn)為加密。
(22)不安全的TLS配置和不正確的證書(shū)驗(yàn)證
除了正確加密數(shù)據(jù)存儲(chǔ)中的信息之外,用戶(hù)還需要確保正在與受信任的機(jī)器進(jìn)行通信,而不是與惡意的第三方進(jìn)行通信。TLS使用數(shù)字證書(shū)作為其公鑰加密的基礎(chǔ),需要在與第三方建立連接之前驗(yàn)證這些證書(shū)。用戶(hù)應(yīng)該驗(yàn)證其嘗試連接的服務(wù)器是否具有由受信任的證書(shū)頒發(fā)機(jī)構(gòu)(CA)頒發(fā)的證書(shū),并且證書(shū)鏈中的任何證書(shū)都沒(méi)有過(guò)期。
(23)批量分配
“批量賦值”是指一次為多個(gè)變量或?qū)ο髮傩再x值的做法。當(dāng)應(yīng)用程序自動(dòng)將用戶(hù)輸入分配給多個(gè)程序變量或?qū)ο髸r(shí),就會(huì)出現(xiàn)批量分配漏洞。這是許多旨在簡(jiǎn)化應(yīng)用程序開(kāi)發(fā)的應(yīng)用程序框架中的一個(gè)功能。
但是,這一功能有時(shí)允許攻擊者隨意覆蓋、修改或創(chuàng)建新的程序變量或?qū)ο髮傩?。這可能導(dǎo)致身份驗(yàn)證繞過(guò)和對(duì)程序邏輯的操縱。要防止批量分配,可以使用正在使用的框架禁用批量分配功能,或者使用白名單僅允許對(duì)某些屬性或變量進(jìn)行分配。
(24)打開(kāi)重定向
網(wǎng)站通常需要自動(dòng)重定向其用戶(hù)。例如,這個(gè)當(dāng)未經(jīng)身份驗(yàn)證的用戶(hù)嘗試訪(fǎng)問(wèn)頁(yè)面時(shí)會(huì)發(fā)生這種情況需要登錄。網(wǎng)站通常會(huì)將這些用戶(hù)重定向到登錄頁(yè)面,然后在他們通過(guò)身份驗(yàn)證后將它們返回到原來(lái)的位置。
在開(kāi)放式重定向攻擊期間,攻擊者誘騙用戶(hù)訪(fǎng)問(wèn)通過(guò)向他們提供來(lái)自合法站點(diǎn)的URL來(lái)訪(fǎng)問(wèn)外部站點(diǎn)重定向到其他地方。這可以讓用戶(hù)相信他們?nèi)匀辉谠季W(wǎng)站上,并幫助詐騙者構(gòu)建更可信的網(wǎng)絡(luò)釣魚(yú)活動(dòng)。
為了防止開(kāi)放重定向,需要確保應(yīng)用程序不會(huì)將用戶(hù)重定向到惡意位置。例如,可以通過(guò)驗(yàn)證重定向URL來(lái)完全禁止異地重定向。還有許多其他方法可以防止打開(kāi)重定向,例如檢查請(qǐng)求的引用者或使用頁(yè)面索引進(jìn)行重定向。但是由于驗(yàn)證URL很困難,開(kāi)放重定向仍然是現(xiàn)代Web應(yīng)用程序中的一個(gè)普遍問(wèn)題。
(25)跨站請(qǐng)求偽造
跨站點(diǎn)請(qǐng)求偽造(CSRF)是一種客戶(hù)端技術(shù),用于攻擊Web應(yīng)用程序的其他用戶(hù)。使用跨站點(diǎn)請(qǐng)求偽造(CSRF),攻擊者可以發(fā)送假裝來(lái)自受害者的HTTP請(qǐng)求,代表受害者執(zhí)行不需要的操作。例如,攻擊者可能會(huì)在未經(jīng)許可的情況下更改密碼或銀行賬戶(hù)轉(zhuǎn)賬。
與開(kāi)放式重定向不同,有一種防止跨站點(diǎn)請(qǐng)求偽造(CSRF)的萬(wàn)無(wú)一失的方法:結(jié)合使用跨站點(diǎn)請(qǐng)求偽造(CSRF)令牌和SameSite cookie,并避免使用GET請(qǐng)求進(jìn)行狀態(tài)更改操作。
(26)服務(wù)器端請(qǐng)求偽造
服務(wù)器端請(qǐng)求偽造(SSRF)或服務(wù)器端請(qǐng)求偽造是攻擊者能夠代表服務(wù)器發(fā)送請(qǐng)求時(shí)發(fā)生的漏洞。它允許攻擊者“偽造”易受攻擊的服務(wù)器的請(qǐng)求簽名,從而在網(wǎng)絡(luò)上占據(jù)特權(quán)地位,繞過(guò)防火墻控制并獲得對(duì)內(nèi)部服務(wù)的訪(fǎng)問(wèn)權(quán)限。
根據(jù)授予易受攻擊服務(wù)器的權(quán)限,攻擊者可能能夠讀取敏感文件、進(jìn)行內(nèi)部API調(diào)用以及訪(fǎng)問(wèn)隱藏管理面板等內(nèi)部服務(wù)。防止SSRF漏洞的最簡(jiǎn)單方法是永遠(yuǎn)不要根據(jù)用戶(hù)輸入發(fā)出出站請(qǐng)求。但是,如果確實(shí)需要根據(jù)用戶(hù)輸入發(fā)出出站請(qǐng)求,則需要在發(fā)起請(qǐng)求之前驗(yàn)證這些地址。
(27)信任邊界違規(guī)
“信任邊界”是指不受信任的用戶(hù)輸入進(jìn)入受控環(huán)境的位置。例如,一個(gè)HTTP請(qǐng)求在被服務(wù)器驗(yàn)證之前被認(rèn)為是不可信的輸入。
用戶(hù)存儲(chǔ)、傳輸和處理可信和不可信輸入的方式應(yīng)該有明顯的區(qū)別。當(dāng)不尊重這種區(qū)別并且信任和不信任的數(shù)據(jù)相互混淆時(shí),就會(huì)發(fā)生信任邊界違規(guī)。例如,如果受信任和不受信任的數(shù)據(jù)存儲(chǔ)在同一個(gè)數(shù)據(jù)結(jié)構(gòu)或數(shù)據(jù)庫(kù)中,應(yīng)用程序可能將這二者混淆。在這種情況下,不受信任的數(shù)據(jù)可能會(huì)被錯(cuò)誤地視為已驗(yàn)證。
防止信任邊界違規(guī)的一個(gè)很好方法是在驗(yàn)證之前永遠(yuǎn)不要將不受信任的輸入寫(xiě)入會(huì)話(huà)存儲(chǔ)。
原文標(biāo)題:Go Application Vulnerability Cheatsheet,作者:Vickie Li
鏈接:https://dzone.com/articles/go-applications-vulnerability-cheatsheet