IT @ Jason Tools v3.68.13

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 同樣不在範圍內。