- 黑客攻防從入門到精通(Web技術實戰篇)
- 明月工作室 王棟
- 6756字
- 2020-05-22 18:52:24
6.3 處理會話令牌過程中的漏洞
應用程序以不安全的方式處理令牌表現在許多方面,致使令牌易于遭受攻擊。例如,如果以某種方式將令牌透露給攻擊者,那么即使攻擊者無法預測令牌,也仍然能夠劫持用戶的會話。
6.3.1 日志記錄導致的令牌泄露
許多應用程序為管理員和其他支持人員提供監控和控制應用程序運行時狀態(包括用戶會話)的功能。例如,幫助用戶解決疑難的服務臺工作人員可能會要求用戶提供用戶名,通過列表或搜索功能定位他們當前的會話,并查看與會話有關的細節。各種系統日志也常常將令牌泄露給未授權方。雖然這種情況很少發生,但由于除了處在網絡適當位置的竊聽者之外,還有其他各種潛在的攻擊者都能查閱這些日志,這種泄露通常會造成更嚴重的后果。
2014年漏洞報告平臺烏云網披露了攜程網安全漏洞信息,漏洞發現者稱由于攜程開啟了用戶支付服務接口的調試功能,支付過程中的調試信息可被任意黑客讀取。
由于該漏洞存在,攜程安全支付日志可遍歷下載,導致大量用戶銀行卡信息泄露,包含持卡人姓名、身份證、銀行卡號、卡CVV碼、6位卡Bin等。所謂遍歷是指沿著某條搜索路線,依次對樹中每個結點均做一次且僅做一次訪問。訪問結點所做的操作依賴于具體的應用問題。
專家解釋稱,該漏洞之所以存在,是因為攜程用于處理用戶支付的安全支付服務器接口存在調試功能,將用戶支付的記錄用文本保存了下來。同時因為保存支付日志的服務器未做較嚴格的基線安全配置,存在目錄遍歷漏洞,導致所有支付過程中的調試信息可被任意黑客讀取。
通常,這種監控和控制功能會泄露每個會話的令牌,而且,這種功能一般沒有得到良好的保護,允許未授權用戶訪問當前會話令牌列表,因而劫持所有應用程序用戶的會話。
會話令牌出現在系統日志中的另一個主要原因是應用程序使用URL查詢字符串,而不是使用HTTP Cookies或POST請求主體作為令牌傳輸機制。例如,在Google上查詢inurl:jsessionid即可確定數千個在以下URL中傳送Java平臺會話令牌(稱作jsessionid)的應用程序。如果應用程序以這種方式傳送會話令牌,它們的會話令牌就可能出現在各種未授權用戶能夠訪問的系統日志中,例如:
(1)用戶瀏覽器的日志;
(2)Web服務器日志;
(3)企業或ISP代理服務器日志;
(4)任何在應用程序主機環境中采用的反向代理的日志;
(5)應用程序用戶通過單擊站外鏈接訪問的任何服務器的Referer日志。
上面描述的最后一種情況為攻擊者提供一種截獲應用程序會話令牌的非常有效的方法。例如,如果一個Web郵件應用程序在URL中傳送會話令牌,那么攻擊者就可以向應用程序的用戶發送一封電子郵件,在里面包含一個連接到他控制的Web服務器的鏈接。如果任何用戶訪問這個鏈接(如單擊它,或者他們的瀏覽器加載了包含在HTML格式的電子郵件中的圖像),攻擊者就會實時收到該用戶的會話令牌。然后,攻擊者只需在他的服務器上運行一段腳本,就可以劫持收到每一個令牌的會話,并執行某種惡意操作,如發送垃圾郵件、獲取個人信息或修改密碼等。
測試日志記錄可能存在漏洞導致令牌泄露的方法如下。
(1)確定應用程序的所有功能,找出可查看會話令牌的任何日志或監控功能,查明誰能夠訪問這種功能,如管理員、任何通過驗證的用戶或匿名用戶。
(2)確定應用程序使用URL中傳送會話令牌的任何情況。可能應用程序通常以更加安全的方式傳送令牌,但開發者在特定情況下使用URL來解決特殊難題。例如,Web應用程序與外部系統交互時通常會出現這種情況。
(3)如果應用程序在URL中傳送會話令牌,嘗試發現任何允許在其他用戶查閱的頁面中注入任意站外鏈接的應用程序功能,如公告牌、站點反饋、問與答等。如果可以,向受控制的一個Web服務器提交鏈接,等待一段時間,看Referer日志中是否收到任何用戶的會話令牌。
(4)如果截獲到任何會話令牌,嘗試通過正常使用應用程序,而不是用截獲的令牌代替自己的令牌來劫持用戶的會話。可配置一些攔截代理服務器采用基于正則表達式(regex-based)的內容替換規則,自動修改HTTP Cookies之類的數據。
6.3.2 網絡傳送導致的令牌泄露
由于互聯網早期并沒有考慮到數據報文安全的問題,早期的理念都是基于進行通信的。現在隨著網絡興起,互聯網上慢慢有很多“犯罪團體”,用較低的犯罪成本通常是基于一個網絡通信協議的一個小的漏洞來完成竊取、篡改、重播其他人的數據報文。
如果通過網絡以非加密方式傳送會話令牌,就會產生這方面的漏洞,使得處在適當位置的竊聽者能夠截獲令牌并因此偽裝成合法用戶。竊聽的適當位置包括用戶的本地網絡、用戶所在的IT部門、用戶的ISP、互聯網骨干網、應用程序的ISP和運行應用程序組織的IT部門。處在上述任何一個位置,相關組織的授權人員和任何攻破相關基礎架構的外部攻擊者都可以截取會話令牌。
在最簡單的情形中,應用程序使用一個非加密的HTTP連接進行通信。這使得攻擊者能夠攔截客戶和服務器間傳送的所有數據,包括登錄證書、個人信息、支付細節等。這時,攻擊者通常不必攻擊用戶的會話,因為攻擊者已經可以查閱特權信息,并能夠使用截獲的證書登錄,執行其他惡意操作。然而,有些時候,用戶的會話仍然是攻擊者的主要攻擊目標。例如,如果截獲的證書不足以執行第二次登錄(如銀行應用程序可能要求登錄者提交在不斷變化的物理令牌上顯示的一串數字,或者用戶PIN號碼中的幾個特殊數字),這時攻擊者如果想執行任意操作,就必須劫持他竊聽的會話。或者如果登錄機制實施嚴格的審查,并且在每次成功登錄后通知用戶,那么攻擊者可能希望避免自己登錄,以盡可能保持活動的隱秘性。
在其他情況下,使用HTTPS保護關鍵客戶——服務器通信的應用程序的會話令牌仍然可能在網絡上遭到攔截。這種薄弱環節表現形式各異,其中有許多可能發生在應用程序使用HTTP Cookies作為會話令牌傳輸機制時。
一些應用程序在站點中預先通過驗證的區域(如站點首頁)使用HTTP,但從登錄頁面開始轉換到HTTPS。然而,許多時候,應用程序在用戶訪問第一個頁面時就給他發布一個會話令牌,并且在用戶登錄時也不修改這個令牌。最初并未通過驗證的用戶會話在登錄后卻被升級為通過驗證的會話。在這種情況下,竊聽者就可以在登錄前攔截用戶的令牌,等待用戶轉換到HTTPS進行通信(表示用戶正在登錄),然后嘗試使用那個令牌訪問一個受保護的頁面(如“我的賬戶”)。
即使應用程序在用戶成功登錄后發布一個新令牌,并從登錄頁面開始使用HTTPS,但是,如果用戶通過單擊驗證區域中的一個鏈接、使用“后退”按鈕或者直接輸入URL,重新訪問一個預先驗證的頁面(如“幫助”或“關于”頁面),用戶通過驗證的會話令牌仍有可能泄露。
與前面的情況稍有不同,應用程序可能在用戶單擊登錄鏈接后轉換到HTTPS。然而,如果用戶對URL進行相應修改,應用程序仍然接受通過HTTP進行登錄。這時,處在適當位置的攻擊者就可以修改站點預先通過驗證的區域返回的頁面,使登錄鏈接指向一個HTTP頁面。即使應用程序在用戶成功登錄后發布一個新令牌,如果攻擊者已成功將用戶的鏈接降級為HTTP,他仍然能夠攔截這個令牌。
一些應用程序對應用程序內的全部靜態內容(如圖像、腳本、樣式表和頁面模板)使用HTTP。如果出現這種行為,用戶的瀏覽器將顯示一條警告消息。如前所述,如果用戶的瀏覽器通過HTTP訪問一個資源,并使用這個令牌通過HTTPS訪問站點中受保護的非靜態區域,攻擊者就能攔截該用戶的會話令牌。
即使應用程序在每一個頁面(包括站點中未通過驗證的區域和靜態內容)都使用HTTPS,有些情況下,用戶的令牌仍然通過HTTP傳送。如果攻擊者能夠以某種方式誘使用戶通過HTTP提出一個請求,那么用戶就可能在這個過程中提交令牌。這時,攻擊者可以采用的攻擊手段包括在一封電子郵件或即時消息中給用戶發送一個URL、在他控制的一個Web站點中插入一個自動加載的鏈接,或者使用可單擊的標題廣告。
測試網絡傳送可能存在漏洞導致令牌泄露的方法如下。
(1)以正常方式訪問應用程序,從第一個進入點(“起始”URL)開始,接著是登錄過程,然后是應用程序的全部功能。記錄每一個被訪問的URL以及收到新會話令牌的每種場合。特別注意登錄功能及HTTP與HTTPS通信之間的轉換。可以使用網絡嗅探器(如Wireshark)手動或使用攔截代理服務器中的日志功能部分自動完成這一任務。
圖6-7表示使用Wireshark軟件捕獲網絡中傳輸的HTTP報文段。

圖6-7 使用Wireshark捕獲網絡中傳輸的HTTP報文段
1 單擊軟件左上角捕獲按鈕開始捕獲。
2 在過濾器輸入框中輸入“http”,只捕獲http報文信息。
(2)如果應用程序使用HTTP Cookies傳送會話令牌,那么應確認其是否設置了secure標記,防止它們通過非加密連接傳送令牌。
(3)在正常使用應用程序的情況下,確定會話令牌是否通過非加密連接傳送。如果確實如此,應將其視為易于受到攔截。
(4)如果起始頁面使用HTTP,然后在登錄和站點中通過驗證的區域轉換到HTTPS,確認應用程序是否在用戶登錄后發布一個新令牌,或者在使用HTTP階段傳送的令牌是否仍被用于追蹤用戶通過驗證的會話。同時確認,如果對登錄URL進行相應修改,應用程序是否接受通過HTTP登錄。
(5)即使應用程序在每一個頁面使用HTTPS,確認服務器是否還監聽80端口,通過它運行任何服務或內容。如果是這樣,直接使用通過驗證的會話訪問所有HTTP URL,確認會話令牌是否被傳送。
(6)如果通過HTTP將通過驗證會話的令牌傳送給服務器,確認該令牌是否繼續有效,或者立即被服務器終止。
6.3.3 會話管理機制存在各種漏洞
由于應用程序在將生成和處理的會話令牌與令牌所屬的用戶會話之間進行對應的過程中存在薄弱環節,會話管理機制因此存在各種常見的漏洞。
最簡單的漏洞是允許給同一個用戶賬戶同時分配幾個有效的令牌。在幾乎每一個應用程序中,任何用戶都沒有正當理由在任何指定的時間擁有幾個會話。當然,用戶常常會終止一個處于活動狀態的會話,再開始一個新會話,如關閉瀏覽器窗口或轉換到另一臺計算機上。但是,如果一名用戶明顯同時在使用兩個不同的會話,這通常表示出現了安全問題:要么是用戶將證書泄露給了另一方,要么是攻擊者通過其他某種途徑獲得了他們的證書。無論發生哪一種情況,都不應允許并行會話,因為它可使用戶能夠持續執行任何非法操作,也因為它允許攻擊者使用截獲的證書,卻不存在被檢測出來的風險。
應用程序使用“靜態”令牌是一種相對較為特殊的缺陷。這些“令牌”看似會話令牌,最初表現的功能和會話令牌一樣,但實際并非如此。在這些應用程序中,每名用戶都分配有一個令牌,并且用戶每次登錄,都收到相同的令牌。無論用戶是否已經登錄并獲得令牌,應用程序都應將該令牌視為有效令牌。這種應用程序實際上是對會話的整體概念以及這樣做有助于管理和控制應用程序訪問存有誤解。有些時候,應用程序這樣運作,是為了執行設計上存在缺陷的“記住我”功能,并因此將靜態令牌保存在一個持久性Cookies中(請參閱第6章了解相關內容)。有時,令牌本身易于受到預測攻擊,致使這種漏洞造成更加嚴重的后果,因為一次成功的攻擊不僅能夠攻破當前登錄用戶的會話,如果時間允許,還能攻破所有注冊用戶的賬戶。
測試會話管理機制可能存在漏洞導致令牌泄露的方法如下。
(1)用相同的用戶賬戶從不同的瀏覽器進程或從不同的計算機兩次登錄應用程序,確定這兩次會話是否都處于活動狀態。如果是,表示應用程序支持并行會話,使得攻破其他用戶證書的攻擊者能夠利用這些證書,而不會有被檢測出來的風險。
(2)用相同的用戶賬戶從不同的瀏覽器進程或從不同的計算機幾次登錄和退出應用程序,確定應用程序在每次登錄時是發布一個新會話令牌,還是發布相同的令牌。如果每次發布相同的令牌,那么應用程序根本沒有正確使用令牌。
(3)如果令牌明顯包含某種結構和意義,設法將標識用戶身份的成分與無法辨別的成分區分開來。嘗試修改所有與用戶有關的令牌成分,使其指向其他已知的應用程序用戶,確定修改后的令牌是否被應用程序接受,以及能夠讓攻擊者偽裝成哪名用戶。
6.3.4 不能提供有效會話終止功能
在網絡中,客戶端與服務器之間通過登錄進程開始會話,通過退出進程結束會話,在TCP/IP環境下,每一個應用層協議都有自己開始和接收會話的語法。例如,FTP協議中客戶端向服務器發送USER命令并跟隨用戶名,然后發送PASS命令和密碼;結束時,FTP程序發送QUIT命令。這些雖說是FTP客戶端程序和它們完成的會話層指定的功能,作為TCP/IP協議簇一部分的其他應用程序,都有與FTP類似的會話開始和結束的命令來完成會話層的功能。在登錄過程中,有一個進程決定用戶可以登錄的時間和可以訪問的資源,決定哪些工作站可以登錄。當用戶退出資源訪問時,文件關閉,支持會話的網絡進程中斷。會話結束,在整個過程中,客戶端發出登錄和退出會話過程,服務器處理客戶端相應的請求。
由于兩方面的原因,正確終止會話非常重要。首先,盡可能縮短一個會話的壽命可降低攻擊者截獲、猜測或濫用有效會話令牌的可能性;其次,如果用戶不再需要現有會話,終止會話為用戶提供一種使其失效的途徑,在進一步降低上述可能性的同時,在某種程度上確保共享計算環境中會話的安全。會話終止功能的主要缺陷大都與無法滿足這兩個關鍵目標有關。
一些應用程序并不實施有效的會話終止功能,會話一旦建立,它在收到最后請求后的許多天內也仍然有效,直到服務器最終將其清除。即使令牌存在某種非常難以利用的缺陷(如確定每個有效令牌需要100000次猜測),攻擊者仍然能夠截獲最近訪問應用程序的每一名用戶的令牌。甚至有些時候,應用程序根本不執行退出功能。用戶沒有辦法要求應用程序終止他們的會話。退出功能實際上并不能幫助服務器終止會話。即使服務器從用戶的瀏覽器中刪除令牌(如通過發布一個清空令牌的Set-Cookies指令),如果用戶繼續提交這個令牌,服務器仍然接受它。
最糟糕的情況:當用戶單擊“退出”按鈕時,應用程序并不與服務器通信,因此服務器不采取任何行動。相反,應用程序執行一段客戶端腳本清空用戶的Cookies,在隨后的請求中將用戶返回到登錄頁面。訪問這個Cookies的攻擊者就能使用會話,好像用戶從未退出一樣。
測試會話終止功能可能存在漏洞導致令牌泄露的方法如下。
(1)不要掉入陷阱,檢查應用程序對客戶端令牌執行的操作(如通過一個新的Set-Cookies指令、客戶端腳本或者終止時間屬性令Cookies失效)。在客戶瀏覽器內對令牌執行的任何操作并不能終止會話。相反,調查服務器端是否執行會話終止操作。
首先登錄應用程序獲得一個有效令牌,然后不使用這個令牌,等待一段時間后,使用這個令牌提交一個訪問受保護頁面的請求。如果該頁面正常顯示,表示令牌仍然處于活動狀態。
最后使用反復試驗的方法確定會話終止超時時間,或者一個令牌在最后一次使用它提交請求幾天后是否仍被使用。可配置Burp Stuite遞增連續請求之間的時間間隔,自動完成這項任務。
(2)確定是否存在退出功能,用戶是否能夠使用這一功能。如果不能,表示用戶更易于受到攻擊,因為他們沒有辦法讓應用程序終止會話。
(3)如果應用程序提供退出功能,測試其效率。退出后,嘗試重新使用原有的令牌,確定其是否仍然有效。如果令牌仍然有效,那么即使用戶已經“退出”,也依然易于受到會話劫持攻擊。
6.3.5 向應用程序客戶端用戶發動攻擊
攻擊者可以使用其他針對用戶的攻擊,以不同的方式劫持用戶的會話。這包括實施會話固定攻擊,即攻擊者向一名用戶發送一個已知的會話令牌,等待他們登錄,然后劫持他們的會話,以及跨站點請求偽造攻擊,其中攻擊者從他控制的一個Web站點向應用程序提出一個專門設計的請求,由于用戶的瀏覽器會隨同這個請求一起自動提交用戶當前的Cookies,攻擊者因此會獲得用戶的Cookies。
測試應用程序客戶端可能存在漏洞導致令牌泄露的方法如下。
(1)確定應用程序中存在的任何跨站點腳本漏洞,看是否可以利用這些漏洞截獲其他用戶的會話令牌。
(2)如果應用程序向未通過驗證的用戶發布令牌,就會獲得一個令牌并進行一次登錄。如果應用程序在攻擊者登錄后并不發布一個新令牌,就表示它易于受到會話固定攻擊。
(3)即使應用程序并不向未通過驗證的用戶發布會話令牌,仍然會通過登錄獲得一個令牌,然后返回登錄頁面。如果應用程序“愿意”返回這個頁面,即使攻擊者已經通過驗證,那么也可以使用相同的令牌以另一名用戶的身份提交另一次登錄。如果應用程序在第二次登錄后并不發布一個新令牌,表示它易于受到會話固定攻擊。
(4)確定應用程序會話令牌的格式。用一個捏造的格式有效的值修改令牌,然后嘗試使用它登錄。如果應用程序允許使用一個捏造的令牌建立一個通過驗證的會話,表示它易于受到會話固定攻擊。
(5)如果應用程序并不支持登錄功能,但處理敏感數據(如個人信息和支付細節),并在提交后顯示這些信息(如在“確認訂單”頁面上),那么使用前面的3種測試方法嘗試訪問顯示敏感數據的頁面。如果在匿名使用應用程序期間生成的令牌可用于獲取用戶的敏感信息,那么應用程序就易于遭受會話固定攻擊。
(6)如果應用程序完全依靠HTTP Cookies傳送會話令牌,它很可能容易受到跨站點請求偽造(XSRF)攻擊。首先登錄應用程序,然后從另一個應用程序的一個頁面向應用程序提出一個請求,確認它是否會提交用戶的令牌。設法確定所有參數可由攻擊者提前決定的應用程序敏感功能,利用這種缺陷在目標用戶的權限下執行未授權操作。
- 大型互聯網企業安全架構
- 白帽子講Web安全(紀念版)
- Wireshark 2 Quick Start Guide
- 深入淺出隱私計算:技術解析與應用實踐
- 開發者的Web安全戒律:真實威脅與防御實踐
- Mastering Kali Linux for Advanced Penetration Testing
- Enterprise Cloud Security and Governance
- Learning Veeam? Backup & Replication for VMware vSphere
- 解密彩虹團隊非凡實戰能力:企業安全體系建設(共5冊)
- API安全技術與實戰
- 數據安全架構設計與實戰
- 網絡服務安全與監控
- 計算機網絡安全實驗指導
- 云計算安全技術與應用
- Practical Mobile Forensics