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)
- Düğüm Enjeksiyon Manipülasyonu
xml
ÜrünA sipariş>
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
| Tip | Hedef | Ciddiyet | Etki |
|---|---|---|---|
| XML Enjeksiyonu | Yapı manipülasyonu | Orta-Yüksek | Mantıksal baypas |
| XPath Enjeksiyonu | Sorgu kontrolü | Yüksek | Yetkisiz erişim |
| XXE | Ayrıştırıcının kötüye kullanımı | Yüksek | Dosya okuma / SSRF |
| Şema Enjeksiyonu | Doğrulama baypası | Orta | Bütünlük riskleri |

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
defusedxmlbunun 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.loaddesenleri- XXE tetikleyicileri
.xml,.xsd,.wsdldosyalar
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",

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.

