IT @ Jason Tools v3.65.1

SAML 訊息檢視器

檢視登入訊息,找出 IdP 與 SP 設定差異

輸入訊息

貼上原始 XML、HTTP POST 的 SAMLRequest / SAMLResponse Base64,或 HTTP Redirect 的完整網址。全部在瀏覽器內解析:內容不會送出,也不會寫進網址、瀏覽器儲存或 console。

SAML 訊息裡可能有還能重播的登入憑證。這一頁只留在目前這個分頁的記憶體裡,重新整理就沒了;「複製連結」複製的是工具網址,不含你貼的內容。

裸貼的 Base64 裡 + 就是 Base64 的 +;表單 body 與 Redirect query 依 form-urlencoded 規則,+ 是空白、Base64 的 + 要寫成 %2B。Redirect 的內容是 raw DEFLATE(沒有 zlib 標頭),這兩件事弄反解出來的 XML 會少幾個位元組,而且錯得很安靜。

載入範例

使用說明 7

這支工具怎麼判,以及它刻意不替你決定的事

解析成功不代表登入有效。本版沒有驗證 XML 簽章、沒有檢查憑證鏈、也沒有解密加密的 Assertion —— 一份被竄改過的訊息在這裡看起來會跟正常的一模一樣。
有 Signature 元素不等於驗簽成功 完整的 XML 簽章驗證要處理標準化方式、允許的轉換、reference 摘要、受信任的外部憑證、ID 是否唯一,還要證明「畫面上顯示的那份 Assertion」正是被簽章保護的那一份(簽名包覆攻擊就是攻這一點)。少做任何一項,「已驗證」三個字就是騙人的。所以本版一律標「簽章尚未驗證」。
Audience 的多個限制是「而且」不是「或者」 Conditions 裡每一個 AudienceRestriction 都是獨立的限制,要全部滿足;同一個 restriction 內部的多個 Audience 才是任一符合即可。把所有 Audience 攤平成一個清單再問「有沒有包含」,會把「A 而且 B」讀成「A 或 B」—— 那正好會把一份不該給這個 SP 用的 Assertion 判成通過。
NotBefore 含當下,NotOnOrAfter 不含 NotBefore 是下界包含(時間剛好等於它就算成立),NotOnOrAfter 是上界不含(剛好等於它就已經過期)。兩者不對稱,寫成同一種比較會在邊界那一秒判反。容許時差讓某一項通過時,畫面會標出「靠時差才通過」。
POST 的 + 與 Redirect 的 %2B 裸貼的 Base64 裡 + 就是 Base64 的 +。表單 body 與 Redirect query 是 form-urlencoded,那裡的 + 是空白,Base64 的 + 必須寫成 %2B。另外 Redirect 的內容是 raw DEFLATE,沒有 zlib 標頭。這幾件事弄反,解出來的 XML 會少幾個位元組,而且看起來完全正常。
DOCTYPE 與外部實體一律拒絕 這支工具的 XML 剖析器不接受 DOCTYPE、不接受自訂實體宣告、也不會去讀任何外部資源或 schema。遇到未定義的實體參照會直接報錯,不會靜靜當成空字串放過去 —— 那正是外部實體攻擊的形狀。
多個 Assertion 全部列出來 只看第一個 Assertion 是簽名包覆攻擊的溫床,實務上 IdP 也真的會送多個。這裡每一個都獨立列出、獨立檢查。同名的 Attribute 也分開保存不合併 —— 「IdP 送了兩個同名 Attribute」本身就是排錯時要看到的事實。
加密的 Assertion 只看得到外層 本版只顯示 EncryptedAssertion 的加密演算法,不接收私鑰解密,也不會假裝看得到裡面的內容。SAML Artifact binding 同樣不在範圍內。