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

9.6 KiB
Raw Blame History

htARTEHackTricks AWS Red Team Expert 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>

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署名は、異なる構造とセキュリティのニーズを満たすために、柔軟な方法を提供します。

参考文献