# SAML Saldırıları {{#include ../../banners/hacktricks-training.md}} ## Temel Bilgiler {{#ref}} saml-basics.md {{#endref}} ## Araç [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Bir URL veya URL listesi alabilen ve SAML tüketim URL'sini geri yazdıran bir araç. ## XML gidiş-dönüş XML'de, imzalı kısmı bellek içinde saklanır, ardından bazı kodlama/şifreleme işlemleri gerçekleştirilir ve imza kontrol edilir. İdeal olarak, bu kodlama/şifreleme veriyi değiştirmemelidir, ancak bu senaryoya dayanarak, **kontrol edilen veri ile orijinal veri aynı olmayabilir**. Örneğin, aşağıdaki kodu kontrol edin: ```ruby require 'rexml/document' doc = REXML::Document.new <]> XML puts "First child in original doc: " + doc.root.elements[1].name doc = REXML::Document.new doc.to_s puts "First child after round-trip: " + doc.root.elements[1].name ``` REXML 3.2.4 veya daha önceki bir sürümle programı çalıştırmak, bunun yerine aşağıdaki çıktıyı verecektir: ``` First child in original doc: Y First child after round-trip: Z ``` This is how REXML saw the original XML document from the program above: ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (1001).png>) And this is how it saw it after a round of parsing and serialization: ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (445).png>) For more information about the vulnerability and how to abuse it: - [https://mattermost.com/blog/securing-xml-implementations-across-the-web/](https://mattermost.com/blog/securing-xml-implementations-across-the-web/) - [https://joonas.fi/2021/08/saml-is-insecure-by-design/](https://joonas.fi/2021/08/saml-is-insecure-by-design/) ## XML İmza Sarma Saldırıları **XML İmza Sarma saldırılarında (XSW)**, düşmanlar, XML belgeleri iki farklı aşamadan geçirilirken ortaya çıkan bir zafiyeti istismar eder: **imza doğrulama** ve **işlev çağrısı**. Bu saldırılar, XML belgesinin yapısını değiştirmeyi içerir. Özellikle, saldırgan **sahte öğeler** enjekte eder ve bu öğeler XML İmzasının geçerliliğini tehlikeye atmaz. Bu manipülasyon, **uygulama mantığı** tarafından analiz edilen öğeler ile **imza doğrulama modülü** tarafından kontrol edilenler arasında bir tutarsızlık yaratmayı amaçlar. Sonuç olarak, XML İmzası teknik olarak geçerli kalırken ve doğrulamadan geçerken, uygulama mantığı **sahte öğeleri** işler. Böylece, saldırgan XML İmzasının **bütünlük korumasını** ve **kaynak kimlik doğrulamasını** etkili bir şekilde atlatır ve **rastgele içerik enjekte etme** olanağına sahip olur. Aşağıdaki saldırılar [**bu blog yazısına**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **ve** [**bu makaleye**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) dayanmaktadır. Daha fazla ayrıntı için bunları kontrol edin. ### XSW #1 - **Strateji**: İmza içeren yeni bir kök öğe eklenir. - **Sonuç**: Doğrulayıcı, meşru "Response -> Assertion -> Subject" ile saldırganın "kötü yeni Response -> Assertion -> Subject" arasında karışıklık yaşayabilir, bu da veri bütünlüğü sorunlarına yol açar. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-1.svg](<../../images/image (506).png>) ### XSW #2 - **XSW #1'den Farkı**: Sarılı bir imza yerine ayrık bir imza kullanır. - **Sonuç**: XSW #1'e benzer "kötü" yapı, bütünlük kontrolünden sonra iş mantığını yanıltmayı amaçlar. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-2.svg](<../../images/image (466).png>) ### XSW #3 - **Strateji**: Kötü bir Assertion, orijinal assertion ile aynı hiyerarşik seviyede oluşturulur. - **Sonuç**: İş mantığını kötü verileri kullanmaya yönlendirmeyi amaçlar. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-3.svg](<../../images/image (120).png>) ### XSW #4 - **XSW #3'ten Farkı**: Orijinal Assertion, kopyalanmış (kötü) Assertion'ın çocuğu haline gelir. - **Sonuç**: XSW #3'e benzer ancak XML yapısını daha agresif bir şekilde değiştirir. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-4.svg](<../../images/image (551).png>) ### XSW #5 - **Benzersiz Özellik**: Ne İmza ne de orijinal Assertion standart yapılandırmalara (sarılı/sarılı/ayrık) uyar. - **Sonuç**: Kopyalanmış Assertion, İmza'yı sarar ve beklenen belge yapısını değiştirir. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-5.svg](<../../images/image (1030).png>) ### XSW #6 - **Strateji**: XSW #4 ve #5 ile benzer konum ekleme, ancak bir değişiklikle. - **Sonuç**: Kopyalanmış Assertion, İmza'yı sarar, bu da orijinal Assertion'ı sarar ve iç içe geçmiş yanıltıcı bir yapı oluşturur. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-6.svg](<../../images/image (169).png>) ### XSW #7 - **Strateji**: Kopyalanmış Assertion'ın çocuk olarak eklendiği bir Extensions öğesi eklenir. - **Sonuç**: Bu, Extensions öğesinin daha az kısıtlayıcı şemasını istismar ederek şema doğrulama önlemlerini atlatır, özellikle OpenSAML gibi kütüphanelerde. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-7.svg](<../../images/image (971).png>) ### XSW #8 - **XSW #7'den Farkı**: Saldırının bir varyantı için başka bir daha az kısıtlayıcı XML öğesi kullanır. - **Sonuç**: Orijinal Assertion, daha az kısıtlayıcı öğenin çocuğu haline gelir ve XSW #7'de kullanılan yapıyı tersine çevirir. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-8.svg](<../../images/image (541).png>) ### Araç İsteğinizi ayrıştırmak, seçtiğiniz herhangi bir XSW saldırısını uygulamak ve başlatmak için Burp eklentisi [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz. ## XXE XXE saldırılarının ne tür saldırılar olduğunu bilmiyorsanız, lütfen aşağıdaki sayfayı okuyun: {{#ref}} ../xxe-xee-xml-external-entity.md {{#endref}} SAML Yanıtları **sıkıştırılmış ve base64 kodlu XML belgeleri**dir ve XML Dış Varlık (XXE) saldırılarına karşı hassas olabilir. SAML Yanıtının XML yapısını manipüle ederek, saldırganlar XXE zafiyetlerini istismar etmeye çalışabilir. İşte böyle bir saldırının nasıl görselleştirilebileceği: ```xml ]> ... ... ... [...] ``` ## Araçlar SAML isteğinden POC oluşturmak için Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e)'ı kullanarak olası XXE zafiyetlerini ve SAML zafiyetlerini test edebilirsiniz. Ayrıca bu konuşmaya da göz atın: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI) ## SAML Üzerinden XSLT XSLT hakkında daha fazla bilgi için gidin: {{#ref}} ../xslt-server-side-injection-extensible-stylesheet-language-transformations.md {{#endref}} Genişletilebilir Stil Sayfası Dili Dönüşümleri (XSLT), XML belgelerini HTML, JSON veya PDF gibi çeşitli formatlara dönüştürmek için kullanılabilir. **XSLT dönüşümlerinin dijital imzanın doğrulanmasından önce gerçekleştirildiğini** belirtmek önemlidir. Bu, bir saldırının geçerli bir imza olmadan bile başarılı olabileceği anlamına gelir; devam etmek için kendi kendine imzalanmış veya geçersiz bir imza yeterlidir. Burada bu tür zafiyetleri kontrol etmek için bir **POC** bulabilirsiniz, bu bölümün başında bahsedilen hacktricks sayfasında payload'lar bulabilirsiniz. ```xml ... ... ``` ### Araç Ayrıca, SAML isteğinden POC oluşturmak için Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz. Bu, olası XSLT zafiyetlerini test etmek için kullanılabilir. Ayrıca bu konuşmaya da göz atın: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI) ## XML İmza Hariç Tutma **XML İmza Hariç Tutma**, İmza öğesinin mevcut olmadığı durumlarda SAML uygulamalarının davranışını gözlemler. Bu öğe eksikse, **imza doğrulaması gerçekleşmeyebilir**, bu da onu savunmasız hale getirir. Bu durumu, genellikle imza ile doğrulanan içerikleri değiştirerek test etmek mümkündür. ![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../images/image (457).png>) ### Araç Ayrıca, Burp uzantısı [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) kullanabilirsiniz. SAML Yanıtını yakalayın ve `İmzaları Kaldır` butonuna tıklayın. Böylece **tüm** İmza öğeleri kaldırılır. İmzalar kaldırıldıktan sonra, isteğin hedefe devam etmesine izin verin. Eğer İmza, Servis tarafından gerekli değilse ## Sertifika Sahteciliği ## Sertifika Sahteciliği Sertifika Sahteciliği, bir **Hizmet Sağlayıcının (SP) bir SAML Mesajının güvenilir bir Kimlik Sağlayıcı (IdP) tarafından imzalandığını doğru bir şekilde doğrulayıp doğrulamadığını test etmek için kullanılan bir tekniktir**. Bu, SAML Yanıtını veya İddiasını imzalamak için \***kendinden imzalı bir sertifika** kullanmayı içerir ve bu, SP ile IdP arasındaki güven doğrulama sürecini değerlendirmeye yardımcı olur. ### Sertifika Sahteciliği Nasıl Yapılır Aşağıdaki adımlar, [SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) Burp uzantısını kullanarak süreci özetlemektedir: 1. SAML Yanıtını yakalayın. 2. Eğer yanıt bir imza içeriyorsa, sertifikayı `Sertifikayı SAML Raider Sertifikalarına Gönder` butonunu kullanarak gönderin. 3. SAML Raider Sertifikalar sekmesinde, içe aktarılan sertifikayı seçin ve orijinal sertifikanın kendinden imzalı bir klonunu oluşturmak için `Kaydet ve Kendinden İmzala` butonuna tıklayın. 4. Burp’un Proxy’sinde yakalanan isteğe geri dönün. XML İmza açılır menüsünden yeni kendinden imzalı sertifikayı seçin. 5. `İmzaları Kaldır` butonunu kullanarak mevcut imzaları kaldırın. 6. Mesajı veya iddiayı yeni sertifika ile **`(Yeniden) Mesajı İmzala`** veya **`(Yeniden) İddia İmzala`** butonunu kullanarak imzalayın. 7. İmzalı mesajı iletin. Başarılı bir kimlik doğrulama, SP'nin kendinden imzalı sertifikanızla imzalanmış mesajları kabul ettiğini gösterir ve SAML mesajlarının doğrulama sürecinde potansiyel zafiyetleri ortaya çıkarır. ## Token Alıcı Karışıklığı / Hizmet Sağlayıcı Hedef Karışıklığı Token Alıcı Karışıklığı ve Hizmet Sağlayıcı Hedef Karışıklığı, **Hizmet Sağlayıcının bir yanıtın hedef alıcısını doğru bir şekilde doğrulayıp doğrulamadığını kontrol etmeyi** içerir. Özünde, bir Hizmet Sağlayıcı, bir başka sağlayıcı için tasarlanmışsa bir kimlik doğrulama yanıtını reddetmelidir. Buradaki kritik unsur, SAML Yanıtının **SubjectConfirmationData** öğesi içinde bulunan **Alıcı** alanıdır. Bu alan, İddianın gönderilmesi gereken yeri belirten bir URL'yi belirtir. Eğer gerçek alıcı, hedef Hizmet Sağlayıcı ile eşleşmiyorsa, İddia geçersiz sayılmalıdır. #### **Nasıl Çalışır** Bir SAML Token Alıcı Karışıklığı (SAML-TRC) saldırısının gerçekleştirilebilmesi için belirli koşulların sağlanması gerekir. Öncelikle, bir Hizmet Sağlayıcıda (SP-Legit olarak adlandırılır) geçerli bir hesap olmalıdır. İkincisi, hedeflenen Hizmet Sağlayıcı (SP-Target), SP-Legit'e hizmet veren aynı Kimlik Sağlayıcıdan token kabul etmelidir. Bu koşullar altında saldırı süreci basittir. SP-Legit ile paylaşılan Kimlik Sağlayıcı aracılığıyla geçerli bir oturum başlatılır. Kimlik Sağlayıcıdan SP-Legit'e gelen SAML Yanıtı yakalanır. Bu yakalanan SAML Yanıtı, aslında SP-Legit için tasarlanmışken, SP-Target'a yönlendirilir. Bu saldırının başarısı, SP-Target'ın İddia kabul etmesiyle ölçülür ve bu, SP-Legit için kullanılan aynı hesap adı altında kaynaklara erişim sağlar. ```python # Example to simulate interception and redirection of SAML Response def intercept_and_redirect_saml_response(saml_response, sp_target_url): """ Simulate the interception of a SAML Response intended for SP-Legit and its redirection to SP-Target. Args: - saml_response: The SAML Response intercepted (in string format). - sp_target_url: The URL of the SP-Target to which the SAML Response is redirected. Returns: - status: Success or failure message. """ # This is a simplified representation. In a real scenario, additional steps for handling the SAML Response would be required. try: # Code to send the SAML Response to SP-Target would go here return "SAML Response successfully redirected to SP-Target." except Exception as e: return f"Failed to redirect SAML Response: {e}" ``` ## Logout işlevinde XSS Orijinal araştırmaya [bu bağlantıdan](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/) erişilebilir. Dizin brute forcing sürecinde, şu adreste bir çıkış sayfası keşfedildi: ``` https://carbon-prototype.uberinternal.com:443/oidauth/logout ``` Bu bağlantıya erişildiğinde, bir yönlendirme gerçekleşti: ``` https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1 ``` Bu, `base` parametresinin bir URL kabul ettiğini ortaya koydu. Bunu göz önünde bulundurarak, bir XSS (Cross-Site Scripting) saldırısını başlatma girişimiyle URL'yi `javascript:alert(123);` ile değiştirme fikri ortaya çıktı. ### Kitlesel Sömürü [Bu araştırmadan](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/): [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) aracı, aynı kütüphaneyi kullanan `uberinternal.com` alt alanlarını analiz etmek için kullanıldı. Ardından, `oidauth/prompt` sayfasını hedef alan bir script geliştirildi. Bu script, verileri girerek ve çıktıda yansıyıp yansımadığını kontrol ederek XSS (Cross-Site Scripting) testi yapar. Giriş gerçekten yansıyorsa, script sayfayı savunmasız olarak işaretler. ```python import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) from colorama import init ,Fore, Back, Style init() with open("/home/fady/uberSAMLOIDAUTH") as urlList: for url in urlList: url2 = url.strip().split("oidauth")[0] + "oidauth/prompt?base=javascript%3Aalert(123)%3B%2F%2FFady&return_to=%2F%3Fopenid_c%3D1520758585.42StPDwQ%3D%3D&splash_disabled=1" request = requests.get(url2, allow_redirects=True,verify=False) doesit = Fore.RED + "no" if ("Fady" in request.content): doesit = Fore.GREEN + "yes" print(Fore.WHITE + url2) print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit) ``` ## Referanslar - [https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/) - [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) - [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/) - [https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/) {{#include ../../banners/hacktricks-training.md}}