hacktricks/pentesting-web/saml-attacks/saml-basics.md

9.4 KiB
Raw Blame History

htARTEHackTricks AWS Red Team Expertを使って、ゼロからヒーローまでAWSハッキングを学びましょう

HackTricksをサポートする他の方法

SAML概要

**セキュリティアサーションマークアップ言語SAML**は、アイデンティティプロバイダーIdPがサービスプロバイダーSPに認証資格情報を送信するために利用され、シングルサインオンSSOを容易にします。このアプローチは、複数のログインの管理を簡素化し、複数のウェブサイトで1つの資格情報セットを使用できるようにします。ユーザーの認証とサービスの認可をリンクするために、IdPとSPの間で標準化された通信にXMLを活用しています。

SAMLとOAuthの比較

  • SAMLは、企業がSSOログインセキュリティをより細かく制御できるように設計されています。
  • OAuthは、モバイルフレンドリーであり、JSONを使用し、GoogleやTwitterなどの企業の協力によるものです。

SAML認証フロー

詳細については、https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/から完全な投稿を確認してください。 これは要約です:

SAML認証プロセスには、次のステップが関与します。スキーマで示されている通り

https://epi052.gitlab.io/notes-to-self/img/saml/saml-flow.jpg

  1. リソースアクセス試行:ユーザーが保護されたリソースにアクセスしようとします。
  2. SAMLリクエスト生成SPはユーザーを認識せず、SAMLリクエストを生成します。
  3. IdPへのリダイレクトユーザーはIdPにリダイレクトされ、SAMLリクエストがユーザーのブラウザを介して渡されます。
  4. IdPがリクエストを受信IdPはSAMLリクエストを受信します。
  5. IdPでの認証IdPがユーザーを認証します。
  6. ユーザーの検証IdPは、ユーザーが要求されたリソースにアクセスする正当性を検証します。
  7. SAMLレスポンスの作成IdPは、必要なアサーションを含むSAMLレスポンスを生成します。
  8. SPのACS URLへのリダイレクトユーザーはSPのAssertion Consumer ServiceACSURLにリダイレクトされます。
  9. SAMLレスポンスの検証ACSがSAMLレスポンスを検証します。
  10. リソースアクセスが許可される:最初に要求されたリソースへのアクセスが許可されます。

SAMLリクエストの例

ユーザーがhttps://shibdemo-sp1.test.edu/secure/のセキュアリソースへのアクセスをリクエストするシナリオを考えてみましょう。SPは認証の欠如を特定し、SAMLリクエストを生成します

GET /secure/ HTTP/1.1
Host: shibdemo-sp1.test.edu
...

SAMLリクエストの生データは次のようになります

<?xml version="1.0"?>
<samlp:AuthnRequest ...
</samlp:AuthnRequest>
  • AssertionConsumerServiceURL: IdPがSAMLレスポンスを送信する場所を指定します。
  • Destination: リクエストが送信されるIdPのアドレスです。
  • ProtocolBinding: SAMLプロトコルメッセージの送信方法を定義します。
  • saml:Issuer: リクエストを開始したエンティティを識別します。

SAMLリクエストの生成後、SPは302リダイレクトを返し、ブラウザをSAMLリクエストをHTTPレスポンスのLocationヘッダにエンコードしてIdPにリダイレクトします。RelayStateパラメータはトランザクション全体で状態情報を維持し、SPがSAMLレスポンスを受け取った際に初期リソースリクエストを認識することを保証します。SAMLRequestパラメータは、生のXMLスニペットの圧縮およびエンコードされたバージョンであり、Deflate圧縮とbase64エンコーディングを使用します。

SAMLレスポンスの例

こちらで完全なSAMLレスポンスを見つけることができます。レスポンスの主要なコンポーネントは次のとおりです:

  • ds:Signature: このセクションはXML署名で、アサーションの発行者の整合性と信頼性を確保します。例のSAMLレスポンスには、メッセージ用とアサーション用の2つのds:Signature要素が含まれています。
  • saml:Assertion: この部分には、ユーザーのアイデンティティや他の属性に関する情報が含まれています。
  • saml:Subject: アサーション内のすべてのステートメントの主題を指定します。
  • saml:StatusCode: 対応するリクエストに対する操作のステータスを表します。
  • saml:Conditions: アサーションの有効期間や指定されたサービスプロバイダのような条件の詳細を示します。
  • saml:AuthnStatement: IdPがアサーションの主題を認証したことを確認します。
  • saml:AttributeStatement: アサーションの主題を記述する属性を含みます。

SAMLレスポンスの後、プロセスにはIdPからの302リダイレクトが含まれます。これにより、サービスプロバイダのAssertion Consumer ServiceACSURLに対するPOSTリクエストが行われます。POSTリクエストにはRelayStateおよびSAMLResponseパラメータが含まれます。ACSはSAMLレスポンスの処理と検証を担当します。

POSTリクエストを受信し、SAMLレスポンスが検証されると、ユーザーが最初にリクエストした保護されたリソースへのアクセスが許可されます。これは、GETリクエストを/secure/エンドポイントに対して行い、成功したリソースへのアクセスを示す200 OKレスポンスで示されます。

XML署名

XML署名は多目的であり、XMLツリー全体または特定の要素に署名することができます。これはレスポンス要素だけでなく、任意のXMLオブジェクトに適用できます。以下にXML署名の主要なタイプを示します

XML署名の基本構造

XML署名には、次に示す基本要素が含まれます

<Signature>
<SignedInfo>
<CanonicalizationMethod />
<SignatureMethod />
<Reference>
<Transforms />
<DigestMethod />
<DigestValue />
</Reference>
...
</SignedInfo>
<SignatureValue />
<KeyInfo />
<Object />
</Signature>

Reference要素は、URI属性によって識別される特定のリソースを示します。

XML署名の種類

  1. 封入署名このタイプの署名は、署名されるリソースの子孫であり、署名は署名されたコンテンツと同じXML構造内に含まれていることを意味します。

例:

<samlp:Response ... ID="..." ... >
...
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>
...
</samlp:Response>

封入署名では、ds:Transform要素がenveloped-signatureアルゴリズムを介して封入されていることを指定します。

  1. 包含署名:封入署名とは対照的に、包含署名は署名されるリソースを包み込みます。

例:

<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
<samlp:Response ... ID="..." ... >
...
</samlp:Response>
</ds:Signature>
  1. 切り離し署名:このタイプは、署名されるコンテンツとは別に存在します。署名とコンテンツは独立して存在しますが、両者の間にリンクが維持されます。

例:

<samlp:Response ... ID="..." ... >
...
</samlp:Response>
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>

結論として、XML署名は異なる構造とセキュリティのニーズを満たすために柔軟な方法を提供し、各タイプが異なる構造とセキュリティのニーズに対応しています。