Penligent Başlık

XML Enjeksiyonu Açıklandı: Riskler, Gerçek Saldırılar ve Eksiksiz Savunma Kılavuzu

XML Enjeksiyonu, bir uygulamanın verileri ayrıştırma veya yorumlama şeklini değiştirmek için XML girdisinin manipüle edilmesidir. Kullanıcı kontrollü girdinin bir XML belgesine uygun doğrulama yapılmadan eklenmesi durumunda ortaya çıkar ve saldırganların kontrol akışını değiştiren, mantığı atlayan veya tehlikeli ayrıştırıcı davranışlarını tetikleyen düğümler, nitelikler, varlıklar veya yükler eklemesine olanak tanır. Günümüzün API ağırlıklı ve entegrasyon odaklı ekosistemlerinde XML Enjeksiyonu, güvenlik ekiplerinin görmezden gelemeyeceği gerçek bir tehdit olmaya devam etmektedir.

Basit girdi kurcalamalarının aksine XML Enjeksiyonu, XML'in ifade gücünden faydalanarak SOAP, SAML, IoT cihazları, kurumsal entegrasyonlar ve eski finansal sistemler gibi karmaşık sistemleri etkiler.

XML Enjeksiyonu Neden Hala Önemli?

JSON modern uygulamalara hakim olsa da XML kurumsal yazılımlara, kimlik doğrulama protokollerine ve arka uç entegrasyonlarına derinlemesine gömülüdür. Saldırganlar XML yapılarını şu amaçlarla kötüye kullanabilir:

  • İş mantığını kurcalayın
  • Yetkisiz düğümleri enjekte etme
  • XPath sorgularını manipüle etme
  • XXE tarzı dosya ifşasını tetikleme
  • Şema doğrulamasını kırın
  • XML Tabanlı Hizmet Reddine Neden Olma

XML'in esnekliği, kötüye kullanımını özellikle güçlü kılmaktadır.

Gerçek CVE Örneği: CVE-2025-13526

CVE-2025-13526, basit bir XML ayrıştırma yanlış yapılandırmasının tam dosya ifşasına nasıl yol açabileceğini göstermektedir. Sistem XML yapılandırma dosyalarının yüklenmesine izin vermiş, ancak harici varlık çözümlemesini devre dışı bırakamamıştır.

Örnek kötü amaçlı yük:

xml

<!DOCTYPE data [

]>

&xxe;

Sunucu aşağıdakilerin içeriğini döndürdü /etc/passwdXXE ile birlikte XML Enjeksiyonunun kritik dosyaları nasıl açığa çıkarabileceğini gösteriyor.

XML Enjeksiyonunun Saldırı Yüzeyleri

Saldırganlar istismar ediyor:

  • Düğüm Enjeksiyonu
  • Öznitelik Enjeksiyonu
  • XPath Sorgu Manipülasyonu
  • Şema (XSD) Manipülasyonu
  • XXE yükleri
  • DoS için varlık genişletme
  • XML tabanlı iş akışları içinde mantık atlama

Her kategori sistemin farklı bir katmanını etkilemektedir.

Saldırı Örnekleri (Aynı miktar korunmuştur)

  1. Düğüm Enjeksiyon Manipülasyonu

xml

ÜrünA

Enjekte edilen yük:

pgsql

true

Ortaya çıkan XML yapısal olarak bozulur ve yetkisiz ayrıcalıklar verebilir.

XPath Enjeksiyonu

python

query = f"//users/user[username/text()='{user}']"

Kötü niyetli girdi:

bash

' veya '1'='1

Bu, yetkisiz kullanıcı kayıtlarını açığa çıkarır.

XXE Yükü

xml

<!DOCTYPE foo [

]>&payload;

Şema Manipülasyonu

xml

<xs:element name="amount" type="xs:string"/>

Bu, beklenen doğrulama davranışını devre dışı bırakır.

Billion Laughs DoS

xml

<!ENTITY a "ha"><!ENTITY b "&a;&a;"><!ENTITY c "&b;&b;">

Büyük genişletme ayrıştırıcıya aşırı yük bindirir.

Savunma Teknikleri

Varlık çözümlemesini devre dışı bırakma

python

parser = etree.XMLParser(resolve_entities=False, no_network=True)

Güvenli kütüphaneler kullanın

python

import defusedxml.ElementTree as ET

Güçlü şema doğrulama

python

schema.validate(input_xml)

XML dizelerini asla birleştirmeyin

Daha güvenli yaklaşım:

python

el = Element("kullanıcı") name_tag.text = user_input

Karşılaştırma Tablosu

TipHedefCiddiyetEtki
XML EnjeksiyonuYapı manipülasyonuOrta-YüksekMantıksal baypas
XPath EnjeksiyonuSorgu kontrolüYüksekYetkisiz erişim
XXEAyrıştırıcının kötüye kullanımıYüksekDosya okuma / SSRF
Şema EnjeksiyonuDoğrulama baypasıOrtaBütünlük riskleri
XML Enjeksiyonu

Otomatik Sızma Testinde XML Enjeksiyonu

Penligent gibi modern yapay zeka odaklı sızma testi platformları yapı mutasyonu, XML fuzzing, XPath yük testi ve ayrıştırıcı yanlış yapılandırma tespiti gerçekleştirir. Bu platformlar:

  • XML tabanlı saldırı yüzeylerini keşfedin
  • Enjeksiyon noktalarını belirleyin
  • Şema davranışını otomatik öğrenme
  • Uyarlanabilir yükler oluşturun
  • Birden fazla yapılandırma altında ayrıştırıcı davranışını doğrulama

Bu, tespit kapsamını önemli ölçüde genişletir.

Güvenlik Temelleri ve Otomatik Düzeltme Önerileri

Otomatik platformlar da sağlayabilir:

  • Ayrıştırıcı yapılandırma denetimleri
  • Güvenli olmayan XML kütüphanelerinin tespiti
  • Varlık çözünürlük ayarlarının doğrulanması
  • Sıkı XSD doğrulamasının uygulanması
  • Güvensiz XML işlemlerinin CI/CD ile engellenmesi

Bu, tespiti eyleme geçirilebilir iyileştirmeye dönüştürür.

Örnek için Senaryo

Semgrep Kuralları - Python XML Enjeksiyonu / XXE / Güvenli Olmayan Ayrıştırma

Bir dosya oluşturun:

semgrep-rules/python-xml-injection.yaml

yaml

`kurallar:

KURAL 1: xml.etree'nin güvenli olmayan kullanımı - varsayılan ayrıştırıcı XXE'ye karşı savunmasızdır

  • id: python-unsafe-xml-etree önem derecesi: ERROR iletisi: | xml.etree.ElementTree güvenilmeyen XML için güvensizdir. Varsayılan olarak dış varlık genişletmesini devre dışı BIRAKMAZ. Bunun yerine defusedxml kullanın. metadata: cwe: "CWE-611" owasp: "A04:2021 XML Dış Varlıklar" kalıpları:
    • pattern: | import xml.etree.ElementTree as ET languages: [python]

KURAL 2: xml.dom.minidom'un doğrudan kullanımı - güvenli olmayan XML ayrıştırıcı

  • id: python-unsafe-xml-minidom önem derecesi: ERROR iletisi: | xml.dom.minidom DTD'leri veya ENTITY genişletmesini devre dışı bırakmaz. Güvenilmeyen XML için KULLANMAYIN. metadata: cwe: "CWE-611" kalıbı: | import xml.dom.minidom languages: [python]

KURAL 3: resolve_entities=True ile tehlikeli lxml XMLParser

  • id: python-lxml-resolve-entities-enabled önem derecesi: ERROR iletisi: resolve_entities=True ile | lxml XMLParser() XXE'yi etkinleştirir. resolve_entities=False ve load_dtd=False olarak ayarlayın. metadata: cwe: "CWE-611" desen: | XMLParser(resolve_entities=True, ...) languages: [python]

KURAL 4: load_dtd=True ile lxml - tehlikeli

  • id: python-lxml-load-dtd önem derecesi: UYARI iletisi: | load_dtd=True DTD işlemeyi etkinleştirir ve varlık genişletmeye izin verebilir. Kesinlikle gerekmedikçe devre dışı bırakın. metadata: cwe: "CWE-611" kalıp: | XMLParser(load_dtd=True, ...) diller: [python]

KURAL 5: lxml.fromstring() kullanılırken güvenli ayrıştırıcı yapılandırması eksik

  • id: python-lxml-fromstring-no-safe-config önem derecesi: UYARI iletisi: | lxml.fromstring() güvenli bir XMLParser olmadan çağrıldı. resolve_entities=False, no_network=True olduğundan emin olun. metadata: cwe: "CWE-611" kalıpları:
    • pattern: | from lxml import etree - pattern: | etree.fromstring($XML) dilleri: [python]

KURAL 6: Harici XML ayrıştırırken defusedxml kullanmamak

  • id: python-defusedxml-not-used önem derecesi: INFO iletisi: | Python'da güvenli XML ayrıştırma için önerilen defusedxml kullanımı eksik. metadata: cwe: "CWE-611" pattern-either:
    • desen: | ET.parse($X) - pattern: | etree.parse($X) diller: [python]

KURAL 7: defused parser'ı zorlamadan xmltodict

  • id: python-xmltodict-unsafe önem derecesi: UYARI iletisi: | xmltodict, XXE'ye izin veren temel bir XML çözümleyicisini çağırabilir. Kullanım defusedxml bunun yerine ayrıştırıcı. pattern: | xmltodict.parse($X) dilleri: [python]

KURAL 8: XML türevli girdilerde eval() işlevinin tehlikeli kullanımı

  • id: python-eval-from-xml önem derecesi: KRİTİK ileti: | XML'den türetilmiş girdi üzerinde eval() işlevi RCE'ye yol açabilir. Ayrıştırılmış XML değerlerini asla doğrudan değerlendirmeyin. metadata: cwe: "CWE-95" owasp: "A03:2021 Injection" kalıpları:
    • desen: | $VAL = $XML.xpath(...) - pattern: | eval($VAL) dilleri: [python]

KURAL 9: XML kaynaklı veriler üzerinde güvenli olmayan pickle.loads

  • id: python-pickle-on-xml önem derecesi: KRİTİK mesaj: | XML'den türetilen girdi üzerinde pickle.loads() işlevi keyfi kod yürütülmesine yol açabilir. Kullanıcı verileri üzerinde pickle kullanmaktan kaçının. metadata: cwe: "CWE-502" kalıpları:
    • desen: | $DATA = etree.fromstring(...) - pattern: | pickle.loads($DATA) diller: [python]`

Komple Python SAST Tarayıcısı

Bu, aşağıdakiler dahil riskli kalıpları tarayarak Semgrep'i tamamlar:

  • Güvenli olmayan XML ayrıştırıcı içe aktarımları
  • ENTITY / DOCTYPE kullanımı
  • eval, yönetici, turşu, Mareşal, yaml.load desenleri
  • XXE tetikleyicileri .xml, .xsd, .wsdl dosyalar

Yarat: python_sast_scanner.py

python

#!/usr/bin/env python3″"" python_sast_scanner.py Hafif, hızlı Python'a özgü SAST tarayıcı konusunda uzmanlaşmıştır:

  • XML Enjeksiyonu / XXE
  • güvenli olmayan ayrıştırıcı kullanımı
  • tehlikeli fonksiyonlar (eval, exec, pickle.loads, yaml.load) CI için güvenlidir; herhangi bir kod çalıştırmaz. Bulgularda JSON ve sıfır olmayan çıkış çıktıları verir. """import os, re, json, sys PATTERNS = {# XML / XXE "xml_etree": r "import\s+xml\.etree\.ElementTree", "xml_minidom": r "import\s+xml\.dom\.minidom", "lxml_resolve_entities": r "resolve_entities\s*=\sTrue", "lxml_load_dtd": r "load_dtd\s=\s*True", "doctype_in_xml": r"<!DOCTYPE", "entity_in_xml": r"<!ENTITY",
Tek Tıkla PoC XML Enjeksiyonu

Tehlikeli fonksiyonlar

"eval_usage": r"\\beval\\s*\\(","exec_usage": r"\\bexec\\s*\\(","pickle_loads": r"pickle\\.loads\\s*\\(","marshal_loads": r"marshal\\.loads\\s*\\(","yaml_unsafe_load": r"yaml\\.load\\s*\\(",

} IGNORED = {".git", "venv", "env", "pycache", "dist", "build", "node_modules"} def scan_file(path): findings = []try:with open(path, "r", encoding="utf-8″, errors="ignore") as f:for i, line in enumerate(f, 1):for rule, regex in PATTERNS.items():if re.search(regex, line): findings.append({"rule": kural, "line": line.strip(), "lineno": i, })except Exception:pass return findings def walk(root="."): results={}for dp, dirs, files in os.walk(root): dirs[:] = [d for d in dirs if d not in IGNORED]for f in files:if f.endswith((".py",".xml",".xsd",".wsdl")): full = os.path.join(dp, f) hits = scan_file(full)if hits: results[full] = hitsreturn results def main(): root = sys.argv[1] if len(sys.argv)>1 else "." results = walk(root)print(json.dumps({"results": results, "file_count": len(results)}, indent=2))if results: sys.exit(3) sys.exit(0) if name == "main": main()`

Bu Neleri Kapsıyor - Python SAST Kapsamı

XML Enjeksiyonu / XXE

✔ Güvenli olmayan XML ayrıştırıcıları ✔ lxml ile resolve_entities=True DTD yüklemesi (potansiyel olarak tehlikeli) ✔ Saklanan XML dosyalarındaki XXE işaretleyicileri

Kod enjeksiyonu

eval()exec()

Güvenli olmayan serileştirme

pickle.loads()marshal.loads() ✔ güvensiz yaml.load()

Diğer güvenli olmayan modeller

✔ ENTITY / DOCTYPE içinde .xml, .xsd, .wsdl ✔ sertleştirilmiş ayrıştırıcı olmadan xmltodict

Sonuç

XML Enjeksiyonu, ilgili ve tehlikeli bir güvenlik açığı kategorisi olmaya devam etmektedir. Etkisi, iş mantığı atlamasından dosya ifşasına ve hizmet reddine kadar uzanmaktadır. XML davranışlarını anlamak, ayrıştırıcıları güvence altına almak, yapıyı doğrulamak ve otomatik sızma testlerini dahil etmek, sağlam uygulama güvenliği sağlamanın temel adımlarıdır.

Gönderiyi paylaş:
İlgili Yazılar
tr_TRTurkish