5.5 XML eXternal Entity (XXE)
XXE (XML eXternal Entity)
Zranitelnost typu XXE vzniká v momentě, kdy webová aplikace zpracovává soubory nebo zprávy ve formátu XML pomocí špatně (nebo zcela defaultně) nakonfigurovaného XML parseru, u kterého nejsou zablokované externí entity (External Entities). Útočník může uvnitř předávaného XML souboru tyto externí entity definovat a referencovat systém na aplikačním serveru nebo cizí URL adresy.
Pokud se útočníkovi takový "vylepšený" XML dokument podaří úspěšně protlačit do aplikace a následně je entita v XML zpracována a vypsána zpět, útočník uvidí např. výpis chráněného souboru nebo výsledek neočekávaného vnitřního požadavku. XXE může vést nejen k vyzrazení lokálních souborů (File Inclusion), ale lze přes něj provádět útoky SSRF (Server-Side Request Forgery) či vykonávat škodlivý kód.
Ukázka XXE útoku pro čtení lokálního souboru (File inclusion)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <foo> &xxe; </foo>Parser v tomto případě nahradí odkaz &xxe; přímo obsahem citlivého souboru /etc/passwd, který se může vzápětí uživateli vykreslit jako text na stránce.Billion Laughs Attack
Jde o populární útok, jehož cílem je vyčerpání zdrojů (Denial of Service) serveru aplikací exponenciálního vnořování XML entit bez potřeby využívat vůbec externí entity. Útočník definuje entitu (např. 'lol1'), která v sobě opakovaně (třeba 10krát) volá další entitu 'lol', entita 'lol2' 10krát volá 'lol1' a tak dále. Pokud to dovede až k 'lol9' a v těle zavolá výpis
&lol9;, vytvoří obrovské břemeno (výsledek zabere miliardu slov "lol", což může obsadit např. ~3GB RAM) a shodí zranitelný XML parser.Ochrana proti XXE
Základní a nejspolehlivější ochranou proti všem druhům XXE útoků je zcela zakázat používání externích entit (External Entities) v konfiguraci XML parseru předtím, než začne zpracovávat uživatelská data. V mnoha parserových knihovnách je též vhodné kompletně zakázat samotné zpracovávání DTD (Document Type Definitions), pokud je přímo nevyžadujete.