XML Enjeksiyon Saldırıları: XPath, XQuery, XXE ve Daha Fazlası Hakkında Bilinmesi Gerekenler

XML enjeksiyonları, siber suçlular için büyük kazançlar sağlayabilecek web uygulaması güvenlik açıklarından yararlanmalardır - işte bu saldırılar hakkında bilmeniz gerekenler ve bunları nasıl azaltabileceğiniz

Florian adlı bir bilgisayar bilimi doktora öğrencisi (FHantke kullanıcı adını kullanıyor) kısa süre önce blogunda tesadüfi bir XML enjeksiyon saldırısı keşfini paylaştı. Gönderisine göre Florian, Saarland Üniversitesi'nin web sunucusunu XML enjeksiyonu (veya bazen de adlandırıldığı gibi bir XML enjeksiyon saldırısı) olarak bilinen bir teknik kullanarak hackleyebileceğini keşfetti . Başvuru sahibi kimliği alanından sadece bir numarayı kaldırarak, kişisel kimlik bilgilerinin (PII) diğer kullanıcıların benzer verileriyle birlikte görüntülenmesini sağladı.

Ancak bir XML enjeksiyon saldırısı nedir? Ve bu tekniği web uygulaması geliştiricileri için bu kadar kolay ancak genellikle gözden kaçan bir konu yapan nedir?

Hadi çözelim.

XML Enjeksiyon Saldırısı Nedir? XML Saldırılarının Açıklaması

Bazen XML kod yerleştirme olarak da adlandırılan XML yerleştirme, bir uygulamanın kullanıcı girişini bir XML belgesinde veya sorgusunda kullanmadan önce doğru şekilde doğrulamadığı/temizlemediği bir güvenlik açıkları kategorisidir. Genişletilebilir biçimlendirme dili anlamına gelen XML, veri depolamayı yapılandırmak için yaygın olarak kullanılan bir dil biçimidir. Uygulamanızda XML yerleştirme güvenlik açıklarına sahip olmak, kötü adamların XML belgelerinize verebilecekleri her türlü zararı vermekte özgür olacakları anlamına gelir.

XML enjeksiyonları da genel olarak enjeksiyon saldırılarının bir alt kategorisidir. Kötü adamlar, uygulamalarınızdaki ve ön uç hizmetlerinizdeki kötü niyetli yükleri dağıtmalarına ve saklanan hassas verilerinize erişim kazanmalarına olanak tanıyan zayıflıklardan yararlanmak için enjeksiyon saldırıları kullanır.

XML enjeksiyonları, doğrulanmamış kullanıcı verilerinin, bir saldırganın XML belgelerini okumasına veya değiştirmesine ya da XML etkin veritabanınızda komutlar yürütmesine olanak tanıyan sorgular oluşturmasına olanak tanır. Bu, bir saldırganın giriş alanlarında (örneğin, kullanıcı adı, parola ve arama giriş alanları) bulunan güvenlik açıklarından yararlanarak aradıkları sulu depolanmış verilere erişmek için uygulamanızın ön ucunu dolaşmasını sağlar.

Bir saldırganın kuruluşunuzun depolanan veri dosyalarının içeriğini okumak istediğini hayal edin. Doğrulanmamış girişin sistemi kandırarak mesajı web sunucunuza iletmesi umuduyla, web uygulamanızın ön ucuna yanlış biçimlendirilmiş sorgular girmeye çalışacaklardır. Uygulamanız düzgün bir şekilde kodlanmış ve yapılandırılmışsa bu gerçekleşmemelidir (bu durumda iyi iş çıkardınız!). Ancak, eğer öyleyse, topu bir yere düşürdünüz ve bu doğrulanmamış istek uygulamanızın XML ayrıştırıcısına (birkaç dakika içinde bu konuda daha fazla bilgi) ve ardından web sunucusuna ve yürütme için XML etkin veritabanına gönderilecek demektir. .

Bunun bueno olmadığını söylemek yeterli .

XML Enjeksiyonlarının Kullanılabileceği Yerler

Pratik olarak konuşursak, XML enjeksiyonu, veri girişi, çıkışı ve/veya depolaması için XML kullanan hemen hemen her tür yazılıma karşı kullanılabilecek bir tekniktir. Bu hassas yüzeylerin birkaç hızlı örneği şunları içerir:

  • XML tabanlı protokollere dayanan uygulamalar
  • XML belgelerini bir veritabanında veya düz dosyalar olarak depolayan uygulamalar
  • XML tabanlı belge biçimlerini ve veri içe aktarımını destekleyen uygulamalar
  • XML etkin veritabanlarına dayanan yazılımlar (örneğin, BaseX veya MarkLogic)
  • XML tabanlı uygulama programlama arayüzleri (API'ler), örneğin SOAP

XML Enjeksiyonları Ne Yapar (Ve Neden Güvensiz Uygulamalar İçin Büyük Sorunlardır)

Artık bu tür enjeksiyon saldırılarının ne olduğunu bildiğimize göre, işletmeniz için büyük sorunlara neden olabilecek ne yaptıklarını keşfedelim. Bir XML yerleştirme saldırısı, bir tehdit aktörünün aşağıdakilerden herhangi birini veya tümünü yapmasına izin verir:

  • Web uygulamanızın kimlik doğrulama önlemlerini atlayın. Bir XML enjeksiyonu, kimlik doğrulama gereksinimlerini tamamen atlamalarına izin veren kodu girerek depolanan hassas verilerinize yetkisiz erişim sağlayabilir. Böyle bir güvenlik açığı yakın zamanda Ulusal Standartlar ve Teknoloji Enstitüsü (NIST) tarafından CVE-2022-25251 olarak yayınlandı . Windows için Axeda aracısındaki ve masaüstü sunucularındaki bir güvenlik açığı, bir saldırganın belirli bir bağlantı noktasına XML mesajları göndermek için kimlik doğrulamasını atlamasına ve potansiyel olarak etkilenen sistemin yapılandırmasını okuyup değiştirmesine izin verdi.
  • Kuruluşunuzun depolanan hassas dosyalarını okuyun. XML enjeksiyonları genellikle kötü adamların XML veri dosyalarınızın içeriğini okumasına veya değiştirmesine izin verir. Bu nedenle, yetkisiz bir ahmağın eşyalarınıza göz kulak olması veya yapmaması gereken başka şeyler yapması fikrinden hoşlanmıyorsanız, kesinlikle mutlu olmayacaksınız.  
  • XML dosyalarınızı değiştirin veya değiştirin. Verilerini okumak yeterince kötü değilmiş gibi, bazı XML enjeksiyon saldırıları kötü adamların içlerindeki verileri değiştirmesine izin verir!
  • XML tabanlı hizmet reddi (DoS) saldırıları gerçekleştirin. Saldırganlar bir web uygulamasının belleğini aşırı yükleyebilir ve yasal trafiğin web uygulamalarınıza veya hizmetlerinize erişmesini engelleyebilir.

Örneğin, bir saldırgan, web uygulamanızın kullanıcı veritabanının tablosuna kendilerini eklemek için bir XML enjeksiyonu kullanabilir. Heck, sadece şakalar ve kıkırdamalar için kendilerini yönetici kullanıcı olarak veritabanınıza bile ekleyebilirler. Temel olarak, uygulamanın, yönetici ayrıcalıkları verilen profile erişilebilen tüm dosyaları okumalarına erişim sağlayan XML etkin veritabanına eklenecek bir düğüm oluşturmasını sağlarlar. Makalede daha sonra bir XML enjeksiyon saldırısının nasıl çalıştığı hakkında daha fazla konuşacağız.

Bu arada, saldırganın nihai hedefi ne olursa olsun, buradan çıkarmanızı istediğimiz önemli nokta, XML enjeksiyonlarının kötü haber olduğu ve bu güvenlik açıklarının istismar edilmesini önlemek için elinizden gelen her şeyi yapmanız gerektiğidir. Azaltma stratejilerini makalenin sonuna doğru daha fazla ele alacağız.

Başarılı XML Enjeksiyon Saldırıları Büyük Fiyat Etiketleri ile Gelir

JSON, bazı uygulamalarda XML'i başarmış olsa da, XML, web'in birçok yerinde hala kullanılan popüler bir dildir. (Doğru iş için doğru aracı kullanmalısınız, evet?) Bu nedenle, enjeksiyon saldırılarıyla ilişkili riskleri kilitlemezseniz, birçok yönden acı dolu bir dünyadasınız demektir:

  • Veri güvenliği sorunları
  • Güvenli kaynaklarınıza ve sistemlerinize yetkisiz erişim
  • Marka itibarı zararları
  • Uyumluluk sorunları
  • Müşteri güveni kaybı ve ilişki hasarı
  • Mali kayıplar (gelir kaybı, para cezaları ve cezalar, davalar vb.)

İstemci Uygulamalarında XML Ayrıştırıcısının Rolü

Uygulamanız için XML kullanmak için bir XML ayrıştırıcınız olması gerekir. Bir XML ayrıştırıcı, genellikle XML belgelerini ve sorgularını okumaktan, yorumlamaktan, düzenlemekten ve doğrulamaktan sorumlu bir yazılım paketi veya kitaplığıdır.

XML ayrıştırıcısının işi doğrudan XML belgeleriyle çalışmak olduğundan, XML yerleştirme saldırılarını önlemek, XML ayrıştırıcınızın kullanıcı girdisini doğru şekilde temizlemesini ve doğrulamasını sağlamakla başlar. Bu, girdiler bir XML belgesine veya sorgusuna eklenmeden önce gerçekleşmelidir.  

Artık bir XML ayrıştırıcısının ne olduğunu ve web uygulamalarınızı ve verilerinizi geçersiz girdilere karşı korumaya yardımcı olmak için ne yaptığını bildiğimize göre, bazı farklı XML enjeksiyon saldırıları türlerine aşina olmamızın zamanı geldi.

Farklı XML Enjeksiyon Saldırısı Türlerine Genel Bir Bakış

XML enjeksiyonları tekil zayıflıklar değildir. Bunlar, çakışma eğiliminde olan, girdiyle ilgili, doğrulanmamış birden çok güvenlik açığından oluşan tam bir şemsiye kategoridir:

  • XML varlık genişletme (XEE) — XML bombaları olarak da bilinir (bir XML DoS saldırısı veya daha önce bahsettiğimiz "milyar gülme saldırısı" olarak da bilinir), bu taktik, web uygulamanızı çökertmek için çok sayıda özyinelemeli veya iç içe referans enjekte eden bir saldırganı içerir veya sunucu.
  • XML harici varlığı (XXE) — Bu, bir saldırganın, erişmemeleri gereken hassas XML dosyalarına erişmek veya harici URI'lere kötü amaçlı sorgular yapmak için girdilerine harici bir varlık referansı eklediği yerdir.  
  • XPath enj*eksiyonu — Bu saldırı türü, bir saldırganın bir XPath ifadesi aracılığıyla XML belgenize veya veritabanınıza kötü amaçlı veriler veya komutlar göndermesini içerir. (XPaths, sitenizde veya uygulamanızda görüntülenecek XML veya HTML belgelerinin belirli bölümlerini seçmenize olanak tanır.) Bir saldırgan, XPath ifadesine kötü amaçlı bir değer ekleyerek, XML etkin veritabanınızı veya belgenizi değiştirebilir veya bunlara bir şeyler ekleyebilir veya başka bir şey yapın (örneğin, kimlik doğrulamasını atlayarak hassas verilere uzaktan erişim sağlayın).
  • Kör XPath yerleştirme — Bu, bir saldırgan hedef XML belgesinin nasıl yapılandırıldığını bilmediğinde veya yararlı bulduğu hataları görüntülemiyorsanız, bir XPath yerleştirmesi gerçekleştirmenin bir yolu olarak yapılır. Bu, bir saldırganın dosyalarınızın nasıl yapılandırıldığını keşfetmesine ve içerdiği verileri istediğiniz gibi değiştirmesine yardımcı olur. Bu saldırı yöntemi tipik olarak, bir saldırının başarılı veya başarısız olduğunu bildiren doğru/yanlış yanıtları oluşturmak için XML taramasından ve Boole testinden oluşur.  
  • XQuery Injection — Saldırgan, kötü amaçlı bir komut yürütmek veya XML etkin veritabanınıza veya dosyalarınıza yetkisiz bilgiler eklemek için kötü amaçlı bir XQuery girişi kullanır. XQL enjeksiyonları, XML belgelerinizde veya veritabanınızda bulunan hassas bilgilere erişmek veya bunları değiştirmek için geçersiz sözdizimine sahip girişler oluşturmak için XML sorgu dili karakterlerini kullanır.

XML, Kod Ekleme Saldırılarının Yalnızca Bir Kategorisidir

Buna daha önce değinmiştik: XML enjeksiyonları yalnızca bir tür enjeksiyon saldırısıdır. Dolayısıyla, XML enjeksiyonlarının türünün tek örneği olduğunu düşünüyorsanız, ne yazık ki yanılmışsınız. Kod enjeksiyonu, doğrulanmamış kod veya komutlar aracılığıyla erişmemeleri gereken bilgilere erişmeyi veya bunları değiştirmeyi amaçlayan kötü adam saldırıları için genel bir şemsiye terimdir. Uygulama verileri doğrulayamadığı için doğrulama sürecinde kırmızı bayrakları tetiklemeyen hatalı biçimlendirilmiş sorgular veya komutlar kullanarak bunu yapabilirler.

Bu nedenle, kod yerleştirme istismarları genellikle uygulamanızın yanlış yapılandırılmasından veya başlangıçtan itibaren kötü kodlanmasından kaynaklanır.

Bazı enjeksiyon saldırıları istemci tarafı saldırıları iken diğerleri sunucu tarafı saldırılarıdır. Amaç, web sunucunuzda depolanan hassas kaynaklara erişim elde etmek için bir veya daha fazla güvenlik açığından yararlanmak olduğundan, bir XML enjeksiyonu sunucu tarafı saldırısının şemsiyesi altına girer.

XML enjeksiyonları, web uygulamalarında göreceğiniz en yaygın istismarlardan biri olsa da, bu, Common Weaknesses Enumeration (CWE) enjeksiyon listesinde bulacağınız yalnızca bir tür kod enjeksiyonudur . Diğerlerinin örnekleri şunları içerir:

  • HTML yerleştirme saldırıları — Bu yerleştirme tekniği saldırısı, hiper metin biçimlendirme dili (HTML) öğelerini hedefleyen bir saldırganı içerir. Bu, istemci tarafı enjeksiyon saldırısına bir örnektir.
  • LDAP enjeksiyonları — Bu tür yerleştirme saldırısı, ek komutlar eklemek ve hassas bilgileri döndürmek için hafif dizin erişim protokolü (LDAP) ifadelerinden yararlanan bir saldırganı içerir. Bu, sunucu tarafı saldırısının başka bir örneğidir.
  • SSI enjeksiyonları - Bunu bir tür gecikmeli sunucu tarafı saldırısı olarak düşünün. Bir saldırganın, sunucunun HTML dosyasına (sunucunun daha sonra yürütür) bilgi eklemek için doğrulanmamış girdi kullanması için bir web uygulamasındaki güvenlik açıklarından yararlanmasına olanak tanır.
  • SQL enjeksiyon saldırıları — Bu saldırı yöntemi, SQL veritabanındaki verileri değiştirmek için bir site veya hizmetin veri akışlarına kendi yapılandırılmış sorgu dili (SQL) kodunuzu enjekte etmeyi içerir. Bu, sunucu tarafı enjeksiyon saldırısına bir örnektir.
  • Siteler arası komut dosyası çalıştırma (XSS) yerleştirme saldırıları — XSS, kötü niyetli kod yerleştirme yoluyla güvenliği ihlal edilmiş meşru bir web sitesinden yararlanarak kullanıcıları hedeflemeyi amaçlayan bir istemci tarafı saldırısıdır.

Öyleyse, bir XML enjeksiyonu ile bir SQL enjeksiyonu arasındaki fark nedir? O kadar da değil - aslında benzer hedeflere ulaşmayı amaçlayan birbiriyle yakından ilişkili iki saldırı tekniği. Ancak bu iki saldırı türü arasındaki temel fark, birincisinin XML belgelerini ve veritabanlarını hedeflemek için XML girdilerini kullanması, ikincisinin ise SQL sorgularını kullanması ve SQL kaynaklarını hedeflemesidir.

Tabii ki, kuralın her zaman istisnaları vardır. XML kaynaklarına saldırıyı gerçekleştirmek için bir saldırganın bir XML yüküne SQL kodu enjekte etmesini içeren, XML SQL enjeksiyonu olarak bilinen bir hibrit saldırı vardır .

Bu güvenlik açıkları, savunmalarınızdaki istismar edilme potansiyeline sahip zayıf noktalardır. Bu nedenle, onları hafifletmek için adımlar atarak savunmalarınızı güvence altına almanız gerekir.

XML Enjeksiyon Saldırısı Nasıl Çalışır?

XML enjeksiyon saldırısı, SQL enjeksiyon saldırısı ile hemen hemen aynı şekilde çalışır. Ancak bir XML kod enjeksiyonu durumunda, mevcut XML veri akışlarına veya dosyalarına yetkisiz bilgiler eklemiş olursunuz. XML belgelerinde, veri veya XML sözdizimlerini eklemek veya değiştirmek için kullanılabilen metakarakterler (<, >, “ ve &) adı verilen özel karakterler vardır. Saldırgan bu karakterleri kullandığında, hedef sunucunun istenen işlemleri gerçekleştirmesini sağlar.

XML enjeksiyonlarının nasıl çalıştığını anlamak, başka bir tam makalenin içeriği ve açıklaması olduğu için bu bölümde çok derine inmeyeceğiz. Ancak, en azından size nasıl çalıştığına dair temel bir anlayış kazandırmak için kısaca ele alacağız. Saldırganın bir dosyayı okumak istediği bir XML yerleştirme saldırısında genellikle neler olduğuna dair hızlı bir genel bakış:

  • Saldırgan, ön uç sisteminize yasal olmayan bir girdi girer. Bunu, bir XML sorgusu oluşturarak veya belirli belgelere veya kaynaklara erişim isteyen web uygulamanıza uygunsuz biçimlendirilmiş bir XML belgesi yükleyerek yapabilirler. Örneğin, bir saldırgan bir telefon numarası girişinden dijitali kaldırabilir veya şifre alanına '1'='1 ekleyebilir.
  • Bu doğrulanmamış giriş bir hataya neden olacak veya girişi veri tabanına gönderecektir. Uygun ayrıştırma ve doğrulama süreçleri olmadan, web uygulama sunucunuz kötü amaçlı yükü sunucunuza ve ardından işlemek için veritabanınıza gönderir.
  • Veritabanınız daha sonra sorguyu işlemeye çalışır. Bu genellikle, sorguya yanıt olarak sunucuya bilgilerin geri gönderilmesiyle sonuçlanır. Geçersiz sorgu defalarca tekrarlanan bilgiler içeriyorsa, XML ayrıştırıcınızın bir DoS saldırısı olarak aşırı yüklenmesine neden olabilir.
  • Sunucu daha sonra sorgunuza istenen bilgilerle yanıt verir. Bu genellikle, istenen kaynağa dahil edilen her türlü bilgiyi paylaşmayı veya belirtilen bilgileri ona eklemeyi gerektirir.

Bir XML yerleştirme saldırısının nasıl çalıştığına dair temel bir genel bakış sağlayan aşağıdaki temel resme bakın:

Uygulamanızı XML Enjeksiyon Güvenlik Açıkları İçin Test Etme

Tüm bunlar, uygulamanızın bir XML enjeksiyonuna karşı güvenli olup olmadığını nasıl anlayabileceğinizi merak etmenize neden olabilir. Uygulamanızın alanlarından birine XML metakarakterleri (örneğin, tek veya çift tırnak) girerek uygulamanızı test edebilir ve bir yanıt oluşturup oluşturmadığını görebilirsiniz. Bir hatayla sonuçlanırsa, bir XML enjeksiyonunun mümkün olabileceğini gösterir.  

XML enjeksiyon testi hakkında daha fazla bilgi için OWASP'ın bu kaynağına göz atın .

XML Enjeksiyon Risklerini Azaltma

Girişleri ve çıkışları güvenli bir şekilde işlemek için uygulamanızı düzgün bir şekilde yazarsanız, gerçekten endişelenecek bir şeyiniz olmaz (en azından XML enjeksiyon saldırıları söz konusu olduğunda). Niye ya? Çünkü bir saldırganın herhangi bir XML belgesine veya sorgusuna onaylanmamış kod eklemesini engellemiş, böylece güçlü ve güvenli bir uygulama oluşturmuş olursunuz.

Peki, organizasyonunuz bu kampa girmezse ne yaparsınız? XML yerleştirme saldırılarına açık, güvenli olmayan bir uygulamanız varsa yapabileceğiniz birkaç önemli şey vardır:

  1. Kabul edilemez karakterleri filtrelemek için kullanıcı girişlerini sterilize edin. Bunu, daha önce bahsettiğimiz gibi - ', ”, <, >, /, vb. gibi XML metakarakterlerini- web formu kullanıcı giriş alanlarınızdan kaçarak veya bunlara izin vermeyerek yapabilirsiniz.   
  2. Hangi girişlere izin verildiğini belirtin . Tüm temellerinizi tek tek kapsamaya çalışmak yerine (ki bu çok sıkıcıdır ve muhtemelen bir şeyleri gözden kaçırırsınız), farklı bir yaklaşım benimseyebilir ve varsayılan bir reddetme politikası belirleyerek hangi karakterlere izin verileceğini belirleyebilirsiniz. Örneğin, bir kullanıcının yaşı için bir alan eklemek istiyorsanız, kullanıcı girişlerini yalnızca sayıların kullanımına izin verecek şekilde kısıtlayın.
  3. XML ayrıştırıcınıza göz kulak olun . XML ayrıştırıcınızı bu tür saldırılara karşı daha güvenli hale getirmeye yardımcı olmak için, güvenlik açıklarını belirlemek için ayrıştırıcınıza göz kulak olun. Ayrıca DTD'lere izin vermediğinizden emin olun.
  4. Bir içerik güvenlik politikası (CSP) uygulayın . Bir HTTP CSP yanıt başlığı, bir kullanıcının sitenizi kullanırken yükleyebileceği kaynak türlerini önceden belirlenmiş bir dizi kaynak listesiyle kısıtlar.

Bazı ek iyi kurallar aşağıdaki önerileri içerir:

  • Güvenli kodlama en iyi uygulamalarını takip edin
  • Kendinizi ve diğer geliştiricileri bu en iyi uygulamalar konusunda sürekli olarak eğitin
  • Yazılımınızı ve sistemlerinizi yamalı ve güncel tutun

XML Enjeksiyonlarının Ne Olduğu ve Neden Bunları Azaltmanız Gerektiğine İlişkin Son Düşünceler

Kötü kodlama kullanımı yoluyla etkinleştirilen güvenlik açıkları nedeniyle XML enjeksiyonları mümkündür. Ancak, gerçek o kadar siyah-beyaz değil. XML enjeksiyon saldırıları, zayıf siber güvenlik farkındalığından veya başlatmadan önce test ve QA web uygulamalarını test etmek için yeterli zamanın olmamasından da kaynaklanabilir.

Konu bilgi ve sektördeki en iyi uygulamaları takip etmek olduğunda, neyi bilmediğinizi bilemezsiniz. Ve programcılarınız ve geliştiricileriniz projelerle o kadar bunalmışlar ki, uygun uygulama testlerine ayıracak zamanları olmuyorsa, o zaman daha büyük problemler var demektir.

Bu nedenle, bir geliştiriciyi güvenli olmayan bir web uygulaması oluşturduğu için azarlamadan önce, önce kuruluşunuzun süreçlerine, prosedürlerine, politikalarına ve proje beklentilerine baktığınızdan emin olun. Çalışanlarınıza eksiksiz ve başarılı olmaları için gereken eğitim kaynaklarını, eğitimi ve zamanı sağlamıyorsanız, onları ve kuruluşunuzu başarısızlığa hazırlıyor olabilirsiniz.