hacktricks/pentesting-web/saml-attacks/saml-basics.md
2024-02-10 18:14:16 +00:00

9.5 KiB
Raw Blame History

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'ı desteklemenin diğer yolları:

SAML Genel Bakış

Security Assertion Markup Language (SAML), kimlik sağlayıcıların (IdP) yetkilendirme kimlik bilgilerini hizmet sağlayıcılara (SP) göndermek için kullanılmasını sağlayarak tek oturum açma (SSO) işlemini kolaylaştırır. Bu yaklaşım, tek bir kimlik bilgisi kümesinin birden çok web sitesinde kullanılmasına izin vererek çoklu oturum açma yönetimini basitleştirir. Kimlik sağlayıcılar ve hizmet sağlayıcılar arasında standartlaştırılmış iletişim için XML'yi kullanır ve kullanıcı kimliğinin kimlik doğrulamasını hizmet yetkilendirmesiyle bağlar.

SAML ve OAuth Karşılaştırması

  • SAML, SSO oturum açma güvenliği üzerinde daha fazla kontrol sağlamak için kurumlara yöneliktir.
  • OAuth, daha mobil dostu olacak şekilde tasarlanmıştır, JSON kullanır ve Google ve Twitter gibi şirketlerin işbirliğiyle geliştirilmiştir.

SAML Kimlik Doğrulama Akışı

Daha fazla ayrıntı için https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/ adresindeki tam yazıya bakın. İşte bir özet:

SAML kimlik doğrulama süreci, şemada gösterildiği gibi birkaç adımdan oluşur:

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

  1. Kaynak Erişim Denemesi: Kullanıcı, korumalı bir kaynağa erişmeye çalışır.
  2. SAML İstemi Oluşturma: SP, kullanıcıyı tanımaz ve bir SAML İsteği oluşturur.
  3. IdP'ye Yönlendirme: Kullanıcı, SAML İsteği tarayıcısı aracılığıyla geçerek IdP'ye yönlendirilir.
  4. IdP İstemi Alır: IdP, SAML İsteğini alır.
  5. IdP'de Kimlik Doğrulama: IdP, kullanıcının kimliğini doğrular.
  6. Kullanıcı Doğrulaması: IdP, kullanıcının istenen kaynağa erişim yetkisini doğrular.
  7. SAML Yanıtı Oluşturma: IdP, gerekli bildirimleri içeren bir SAML Yanıtı oluşturur.
  8. SP'nin ACS URL'sine Yönlendirme: Kullanıcı, SP'nin Assertion Consumer Service (ACS) URL'sine yönlendirilir.
  9. SAML Yanıtı Doğrulama: ACS, SAML Yanıtını doğrular.
  10. Kaynak Erişimi Onaylandı: İlk olarak istenen kaynağa erişim sağlanır.

SAML İstemi Örneği

Bir kullanıcının https://shibdemo-sp1.test.edu/secure/ adresindeki güvenli bir kaynağa erişim isteğini düşünelim. SP, kimlik doğrulamasının eksik olduğunu tespit eder ve bir SAML İsteği oluşturur:

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

SAML İsteği şu şekilde görünür:

<?xml version="1.0"?>
<samlp:AuthnRequest ...
</samlp:AuthnRequest>

Bu isteğin temel unsurları şunlardır:

  • AssertionConsumerServiceURL: IdP'nin SAML Yanıtını kimlik doğrulamasından sonra göndermesi gereken yerin belirlendiği yerdir.
  • Destination: İsteğin gönderildiği IdP'nin adresidir.
  • ProtocolBinding: SAML protokolü mesajlarının iletim yöntemini tanımlar.
  • saml:Issuer: İsteği başlatan varlığı tanımlar.

SAML İsteği oluşturulduktan sonra, SP, tarayıcıyı SAML İsteğini HTTP yanıtının Location başlığında kodlanmış olarak içeren IdP'ye yönlendiren bir 302 yönlendirmesi ile yanıt verir. RelayState parametresi, işlem boyunca durum bilgisini korur ve SP, SAML Yanıtını aldığında başlangıç kaynağı isteğini tanır. SAMLRequest parametresi, ham XML parçacığının sıkıştırılmış ve kodlanmış bir sürümüdür ve Deflate sıkıştırma ve base64 kodlama kullanır.

SAML Yanıtı Örneği

İşte tam bir SAML yanıtı bulabilirsiniz. Yanıtın temel bileşenleri şunları içerir:

  • ds:Signature: Bu bölüm, bir XML İmzasıdır ve beyanın yayıncısının bütünlüğünü ve otantikliğini sağlar. Örnekteki SAML yanıtı, mesaj için bir ds:Signature öğesi ve beyan için başka bir ds:Signature öğesi içerir.
  • saml:Assertion: Bu bölüm, kullanıcının kimlik bilgilerini ve olası diğer öznitelikleri içerir.
  • saml:Subject: Beyanda yer alan tüm ifadelerin temel konusunu belirtir.
  • saml:StatusCode: İlgili isteğe yanıt olarak işlemin durumunu temsil eder.
  • saml:Conditions: Beyanın geçerlilik zamanlaması ve belirtilen Hizmet Sağlayıcı gibi koşulları ayrıntılandırır.
  • saml:AuthnStatement: Beyanın konusunun IdP tarafından kimlik doğrulandığını onaylar.
  • saml:AttributeStatement: Beyanın konusunu tanımlayan öznitelikleri içerir.

SAML Yanıtını takiben, süreç IdP'den bir 302 yönlendirmesi içerir. Bu, Hizmet Sağlayıcının Assertion Consumer Service (ACS) URL'sine bir POST isteği yapılmasına yol açar. POST isteği, RelayState ve SAMLResponse parametrelerini içerir. ACS, SAML Yanıtını işlemek ve doğrulamakla sorumludur.

POST isteği alındıktan ve SAML Yanıtı doğrulandıktan sonra, kullanıcının başlangıçta istediği korumalı kaynağa erişim sağlanır. Bu, /secure/ uç noktasına bir GET isteği ve başarılı erişimi gösteren bir 200 OK yanıtı ile gösterilir.

XML İmzaları

XML İmzaları çok yönlüdür ve bir XML ağacının tamamını veya belirli öğelerini imzalayabilir. Bunlar yalnızca Yanıt öğelerine değil, herhangi bir XML Nesnesine uygulanabilir. Aşağıda XML İmzalarının temel türleri bulunmaktadır:

XML İmzasının Temel Yapısı

Bir XML İmzası, aşağıdaki temel öğelerden oluşur:

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

Her bir Reference öğesi, URI özniteliği ile belirlenen belirli bir kaynağın imzalandığını gösterir.

XML İmzalarının Türleri

  1. Kapsayan İmza: Bu tür bir imza, imzalanan içeriğin bir alt öğesi olup, imza, imzalanan içerikle aynı XML yapısı içinde bulunur.

Örnek:

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

Kapsayan bir imzada, ds:Transform öğesi, enveloped-signature algoritmasıyla kapsandığını belirtir.

  1. Kapsayan İmza: Kapsayan imzalar, imzalanan kaynağı saran imzalardır.

Örnek:

<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
<samlp:Response ... ID="..." ... >
...
</samlp:Response>
</ds:Signature>
  1. Ayrı İmza: Bu tür, imzaladığı içerikten ayrıdır. İmza ve içerik bağımsız olarak var olsa da, ikisi arasındaki bir bağlantı korunur.

Örnek:

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

Sonuç olarak, XML İmzaları, farklı yapısal ve güvenlik ihtiyaçlarını karşılayan esnek yöntemler sunar.

Referanslar

AWS hackleme konusunda sıfırdan kahraman olmak için htARTE (HackTricks AWS Red Team Expert)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları: