Padding的含義是“填充”,在解密時,如果算法發現解密後得到的結果,它的填充方式不符合規則,那么表示輸入數據有問題,對於解密的類庫來說,往往便會拋出一個異常,提示Padding不正確。Oracle在這裡便是“提示”的意思,和甲骨文公司沒有任何關係。
基本介紹
- 中文名:Padding Oracle
- 含義:填充
什麼叫Padding Oracle,如何進行Padding Oracle Attack,
什麼叫Padding Oracle
Padding在這裡的含義是“填充”,因為對於加密算法來說,它們是基於等長的“數據塊”進行操作的(如對於RC2,DES或TripleDES算法來說這個長度是8位元組,而對於Rijndael算法來說則是16、24或32位元組)。但是,我們的輸入數據長度是不規則的,因此必然需要進行“填充”才能形成完整的“塊”。“填充”時比較常用的是PKCS #5規則,簡單地說,便是根據最後一個數據塊所缺少的長度來選擇填充的內容。
例如,數據塊長度要求是8位元組,如果輸入的最後一個數據塊只有5個位元組的數據,那么則在最後補充三個位元組的0x3。如果輸入的最後一個數據塊正好為8位元組長,則在最後補充一個完整的長為8位元組的數據塊,每個位元組填0x8。使用這個規則,我們便可以根據填充的內容來得知填充的長度,以便在解密後去除填充的位元組。
在解密時,如果算法發現解密後得到的結果,它的填充方式不符合規則,那么表示輸入數據有問題,對於解密的類庫來說,往往便會拋出一個異常,提示Padding不正確。Oracle在這裡便是“提示”的意思,和甲骨文公司沒有任何關係
如何進行Padding Oracle Attack
如果輸入的密文不合法,類庫則會拋出異常,這便是一種提示。攻擊者可以不斷地提供密文,讓解密程式給出提示,不斷修正,最終得到的所需要的結果。這裡的一個關鍵在於,攻擊者所需要的提示僅僅是“解密成功與否”這樣一個二元信息,例如它在一個Web程式中可能只是“200 - OK”及“500 - Internal Server Error”這樣的表現形式,而不需要其他任何詳細信息。 例如,現代流行的Web框架大都是開源的,因此它的加密方式完全透明(當然這點其實並不是必須的,只是大有幫助而已),對於攻擊者來說唯一不知道的便是密鑰。於是攻擊者便可以根據這個加密方式設計有針對性的密文,最終得到密鑰(及IV等信息)。在很多時候,一個網站都會使用同樣的密鑰和IV,於是只需從一個漏洞,便可以在網站的其他方面進行破壞,或解密信息,或繞開驗證。
在具體操作上還可以有許多方式進行輔助,在Juliano Rizzo和Thai Duong的《Practical Padding Oracle Attacks》(及此)論文(下文稱PPOA)中便提到了很多方式,例如使用Google搜尋異常的關鍵字(這說明許多站點都把異常信息輸出在頁面上),檢查代碼,從外表檢查一些BASE64形式的字元串,猜測常見的分割符,如“--”,“|”或是“:”等等。PPOA認為,如今Padding Oracle漏洞與SQL注入,腳本注入等漏洞一樣無處不在,論文中還詳細討論了利用這個漏洞來攻擊eBay拉丁美洲站點,CAPTCHA等套用,以及在JSF(包括Apache MyFaces和Sun Mojarra實現),Ruby on Rails等Web框架中的漏洞——奇怪的是其中反而沒有提到ASP NET。