XXE Açıkları

ÖNEMLİ NOT: Bu bölüm, güvenlik farkındalığı ve savunma amaçlıdır. Tüm testler yalnızca yetkili ortamlarda, yasal çerçevede gerçekleştirilmelidir.

XXE Nedir? (Güncel Anlayış)
XXE (XML External Entity Injection) , bir uygulamanın XML girdisini ayrıştırırken dış varlıkları (external entities) işlemesi sonucu oluşan bir güvenlik zafiyetidir. Saldırgan, XML ayrıştırıcısının özelliklerini kullanarak dosya okuma, sunucu tarafı istekleri (SSRF) ve hizmet reddi (DoS) gerçekleştirebilir.

XXE Türleri (Güncel):
1. In-Band XXE (Classic XXE)
Sunucu yanıtı doğrudan saldırgana gösterilir.

2. Out-of-Band XXE (Blind XXE)
Sunucu yanıtı gösterilmez ancak dışarıdan veri çalınır.

3. Blind XXE with Error-Based
Hata mesajları üzerinden veri sızdırma.

4. XXE Dos (Billion Laughs)
Kaynak tüketimi saldırısı.

XXE ile Yapılabilecek Saldırılar (Güncel):
Dosya Okuma: file:///etc/passwd, file:///c:/windows/win.ini (parser desteğine bağlı)

SSRF: http://169.254.169.254/latest/meta-data/ (IMDSv2 ile sınırlı)

Port Taraması: Zaman farkı ile iç servis keşfi

DoS: Billion Laughs ve entity genişletme saldırıları

RCE (Nadir ve Eski Sistemler):

PHP'nin expect:// protokolü ile (çok eski PHP sürümleri)

Java'nın jar: protokolü ile (belirli senaryolarda)

ÖNEMLİ: Günümüz modern parserlarında RCE beklenen bir etki değildir.

Sadece eski kütüphaneler veya özel protokol desteği bulunan ortamlarda dolaylı olarak mümkün olabilir.

Düzeltilmiş PHP Güvenli Yapılandırması
HATALI ÖRNEK (Kullanmayın!):

php
// BU YANLIŞ! Güvenlik riski oluşturur!
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD | LIBXML_DTDATTR);
Neden Yanlış?

LIBXML_NOENT → Entity çözümlemeyi ETKİNLEŞTİRİR (tam tersi!)

LIBXML_DTDLOAD → Harici DTD yüklenmesine izin verir

LIBXML_DTDATTR → DTD attribute'lerini işler

DOĞRU ÖRNEK (PHP 8 ve Güncel):

php
// DOĞRU: Güvenli yapılandırma
function parseXMLSafe($xmlContent) {
$dom = new DOMDocument();

// 1. Varsayılan olarak güvenli (PHP 8+)
// 2. DTD'yi tamamen devre dışı bırak
$dom->loadXML($xmlContent, LIBXML_NONET | LIBXML_NOBLANKS);

// 3. Veya sadece varsayılan ayarları kullan
// $dom->loadXML($xmlContent);
// LibXML 2.9+ varsayılan olarak external entity'leri engeller

return $dom;
}

// Alternatif: DTD doğrulamasını kapat
function parseXMLSafeAlternative($xmlContent) {
$dom = new DOMDocument();
$dom->loadXML($xmlContent);

// DTD'yi devre dışı bırak (ek güvenlik katmanı)
$dom->validateOnParse = false;
$dom->resolveExternals = false;
$dom->substituteEntities = false;

return $dom;
}
PHP 8.0+ Güvenli Varsayılanlar:

PHP 8.0+, libxml 2.9+ gerektirir

libxml 2.9+, external entity'leri varsayılan olarak devre dışı bırakır

Bu nedenle, güvenli olmayan ayarları KAPATMAK değil, AÇMAMAK önemlidir

Diğer Platformlar İçin Güvenli Parser Ayarları:
Python (lxml):
python
from lxml import etree

def parse_xml_safely(xml_content):
parser = etree.XMLParser(
resolve_entities=False, # Entity çözümleme KAPALI
no_network=True, # Ağ erişimi KAPALI
huge_tree=False, # Büyük XML engeli (DoS koruması)
dtd_validation=False, # DTD doğrulama KAPALI
load_dtd=False # DTD yükleme KAPALI
)

# Ekstra: Entity genişletme limiti
parser.set_entity_loader(None) # Özel entity loader'ı devre dışı

return etree.fromstring(xml_content, parser=parser)
Java (DocumentBuilderFactory):
java
import javax.xml.parsers.DocumentBuilderFactory;

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dbf.setFeature("http://xml.org/sax/features/validation", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
// Dos limiti
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
C# (.NET):
csharp
using System.Xml;

XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
settings.XmlResolver = null; // Dış kaynak erişimini kapat
settings.MaxCharactersFromEntities = 1024; // DoS koruması
settings.MaxCharactersInDocument = 1024 * 1024; // Doküman boyut limiti

using (XmlReader reader = XmlReader.Create(xmlStream, settings))
{
// XML işleme
}
Node.js (libxmljs):
javascript
const libxmljs = require('libxmljs');

function parseXMLSafe(xmlContent) {
// DTD'yi devre dışı bırak
const options = {
noent: false, // Entity çözümleme KAPALI
nonet: true, // Ağ erişimi KAPALI
dtdvalid: false, // DTD doğrulama KAPALI
huge_tree: false // Büyük XML engeli
};

const doc = libxmljs.parseXml(xmlContent, options);
return doc;
}
JSON ve Güvenlik (Düzeltilmiş Yaklaşım)
YANLIŞ ifade:

"JSON XML'den daha güvenlidir."

DOĞRU ifade:

"JSON, XML External Entity (XXE) gibi XML'e özgü riskleri içermez. Ancak JSON da kendi güvenlik sorunlarına sahiptir (örneğin: JSON injection, prototype pollution, DoS). Bu nedenle yalnızca JSON kullanmak tek başına güvenliği garanti etmez. Güvenlik, veri formatından bağımsız olarak, doğru validasyon, sanitasyon ve parser yapılandırmasıyla sağlanır."

JSON Güvenlik Riskleri (Örnekler):

{"__proto__": {"admin": true}} (Prototype Pollution)

{"user": "admin", "password": {"$ne": null}} (NoSQL injection)

Çok büyük JSON dokümanları (DoS)

Derin iç içe JSON yapıları (DoS)

Entity Sayma Yöntemi (Düzeltilmiş)
YANLIŞ Yöntem:

python
entity_count = xml_content.count('<!ENTITY') # Atlatılabilir!
DOĞRU Yöntem (Parser Seviyesinde):

Python (lxml):

python
from lxml import etree

def parse_xml_with_limits(xml_content):
parser = etree.XMLParser(
resolve_entities=False,
no_network=True,
huge_tree=False, # Büyük XML engeli
)

# Entity limiti - lxml'de direkt yok, ancak huge_tree False ile
# entity genişletme sınırlanır
return etree.fromstring(xml_content, parser=parser)
Java (SAX Parser):

java
import org.xml.sax.*;
import javax.xml.parsers.*;

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
// Entity genişletme limiti
spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
Node.js (sax):

javascript
const sax = require('sax');

const parser = sax.createStream(true, {
trim: true,
normalize: true,
xmlns: true,
position: true,
// Entity limiti - max entity count
maxEntities: 100
});
XInclude (Düzeltilmiş)
ÖNEMLİ NOT: XInclude, XML'in bir özelliğidir ve her parser tarafından desteklenmez.

lxml (Python): Destekler (parser.set_xinclude(True))

Java (DocumentBuilderFactory): Destekler (setXIncludeAware(true))

PHP (DOMDocument): Varsayılan olarak DESTEKLEMEZ

Node.js (libxmljs): Destekler (doc.xinclude())

XInclude Koruması (Destekleniyorsa):

python
# Python lxml - XInclude kapatma
parser = etree.XMLParser(resolve_entities=False, no_network=True)
# XInclude varsayılan olarak kapalı
java
// Java - XInclude kapatma
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(false); // XInclude devre dışı
WAF ve XXE (Düzeltilmiş)
YANLIŞ Görüş:

"WAF XXE'yi çözer."

DOĞRU Görüş:
WAF, XXE için:

Yararlı: Bilinen XXE payload'larını yakalayabilir.

Yetersiz: XML kodlamaları, bypass teknikleri karşısında zayıftır.

Ana Çözüm: XXE'nin çözümü WAF DEĞİL, parser ayarları, DTD kapatma ve XmlResolver kapatmadır.

Doğru Yaklaşım:

Parser Seviyesi: External entity'ler devre dışı bırakılır.

Uygulama Seviyesi: Input validasyonu ve sanitasyon yapılır.

Ağ Seviyesi: Dış kaynak erişimi firewall ile sınırlanır.

WAF: Ekstra savunma katmanı olarak kullanılır.

XXE Kontrol Listesi (Güncel):
A. Parser Yapılandırması (Kesin Çözüm):
External entity'ler devre dışı mı? (resolve_entities=False)

Ağ erişimi devre dışı mı? (no_network=True)

DTD yükleme devre dışı mı? (load_dtd=False, dtd_validation=False)

Huge Tree limiti var mı? (huge_tree=False)

Entity genişletme limiti var mı? (parser seviyesinde)

XInclude devre dışı mı? (setXIncludeAware(false))

B. Doküman Limitleri:
Maksimum doküman boyutu sınırlı mı?

Maksimum element sayısı sınırlı mı?

Maksimum attribute sayısı sınırlı mı?

Maksimum entity genişletme sayısı sınırlı mı?

C. Validasyon:
XML şema doğrulaması yapılıyor mu? (ek katman)

Beyaz liste ile element/attribute kontrolü yapılıyor mu?

Hata mesajları bilgi sızdırmıyor mu?

Özet - XXE Savunma Stratejisi:
Kesin Çözüm: Parser ayarları ile external entity'leri devre dışı bırak

Ek Katman: DTD yükleme ve XInclude'u kapat

DoS Koruması: Huge tree limiti ve entity genişletme limiti

WAF: Ekstra savunma katmanı (ana çözüm değil)

Validasyon: XML girdisini doğrula ve boyutunu sınırla

Alternatif: Mümkünse JSON kullan (ancak kendi risklerini bilerek)

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,055Konular
3,297,760Mesajlar
326,240Kullanıcılar
Üst Alt