Ushbu bo'limda XML external entity injection nima ekanini tushuntiramiz, ba'zi keng tarqalgan misollarni ta'riflaymiz, turli xil XXE injection turlarini qanday topish va ekspluatatsiya qilishni tushuntiramiz hamda XXE injection hujumlarining oldini olishni qisqacha bayon qilamiz.
XML external entity injection (XXE nomi bilan ham tanilgan) — bu veb-xavfsizlik zaifligi bo'lib, hujumchiga ilovaning XML ma'lumotlarini qayta ishlashiga aralashish imkonini beradi. U ko'pincha hujumchiga ilova serverining fayl tizimidagi fayllarni ko'rish, shuningdek ilovaning o'zi kira oladigan har qanday back-end yoki tashqi tizimlar bilan o'zaro ta'sir qilish imkonini beradi.
Ba'zi holatlarda hujumchi XXE zaifligidan foydalanib server-side request forgery (SSRF) hujumlarini amalga oshirish orqali XXE hujumini kuchaytirib, asosiy serverni yoki boshqa back-end infratuzilmani buzishi mumkin.
Ba'zi ilovalar brauzer va server o'rtasida ma'lumot uzatish uchun XML formatidan foydalanadi. Buni qiladigan ilovalar deyarli har doim server tomonida XML ma'lumotlarini qayta ishlash uchun standart kutubxona yoki platforma API'sidan foydalanadi. XXE zaifliklari yuzaga keladi, chunki XML spetsifikatsiyasi turli xil potentsial xavfli xususiyatlarni o'z ichiga oladi va standart parserlar bu xususiyatlarni ilova ular odatda ishlatmasa ham qo'llab-quvvatlaydi.
XML external entity'lar — bu maxsus XML entity'ning bir turi bo'lib, ularning belgilangan qiymatlari e'lon qilingan DTD'dan tashqaridan yuklanadi. External entity'lar xavfsizlik nuqtai nazaridan ayniqsa qiziq, chunki ular entity'ni fayl yo'li yoki URL mazmuni asosida aniqlash imkonini beradi.
XXE hujumlarining turli xil turlari mavjud:
Server fayl tizimidan ixtiyoriy faylni oladigan XXE injection hujumini amalga oshirish uchun siz yuborilgan XML'ni ikki usulda o'zgartirishingiz kerak:
DOCTYPE elementini kiriting (yoki tahrirlang).Masalan, faraz qilaylik, xarid ilovasi mahsulotning ombordagi holatini serverga quyidagi XML'ni yuborish orqali tekshiradi:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>Ilova XXE hujumlariga qarshi hech qanday maxsus himoya qo'llamaydi, shuning uchun siz XXE zaifligidan foydalanib /etc/passwd faylini quyidagi XXE payload'ni yuborish orqali olishingiz mumkin:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>Ushbu XXE payload qiymati /etc/passwd faylining mazmuni bo'lgan &xxe; external entity'sini aniqlaydi va entity'ni productId qiymati ichida ishlatadi. Bu ilovaning javobiga fayl mazmunini kiritishga sabab bo'ladi:
Invalid product ID: 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
...Haqiqiy XXE zaifliklarida yuborilgan XML ichida ko'pincha ko'p sonli ma'lumot qiymatlari bo'ladi, ularning har biri ilovaning javobida ishlatilishi mumkin. XXE zaifliklarini tizimli ravishda sinash uchun, odatda, XML'dagi har bir ma'lumot tugunini alohida sinashingiz kerak bo'ladi — aniqlangan entity'ingizdan foydalanib, u javobda paydo bo'ladimi yoki yo'qligini ko'rish orqali.
Maxfiy ma'lumotni olishdan tashqari, XXE hujumlarining boshqa asosiy ta'siri shundaki, ular server-side request forgery (SSRF) amalga oshirish uchun ishlatilishi mumkin. Bu potentsial jiddiy zaiflik bo'lib, unda server tomonidagi ilovani server kira oladigan har qanday URL'ga HTTP so'rovlar qilishga majbur qilish mumkin.
XXE zaifligidan SSRF hujumini amalga oshirish uchun siz nishonga olmoqchi bo'lgan URL yordamida external XML entity'ni aniqlashingiz va aniqlangan entity'ni ma'lumot qiymati ichida ishlatishingiz kerak. Agar aniqlangan entity'ni ilovaning javobida qaytariladigan ma'lumot qiymati ichida ishlatishingiz mumkin bo'lsa, u holda siz URL'dan kelgan javobni ilovaning javobi ichida ko'ra olasiz va shu tariqa back-end tizim bilan ikki tomonlama o'zaro ta'sirga erishasiz. Aks holda siz faqat blind SSRF hujumlarini amalga oshira olasiz (bu ham jiddiy oqibatlarga olib kelishi mumkin).
Quyidagi XXE misolida external entity serverni tashkilot infratuzilmasidagi ichki tizimga back-end HTTP so'rovi qilishga majbur qiladi:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>XXE zaifliklarining ko'p holatlari blind (ko'r) bo'ladi. Bu shuni anglatadiki, ilova o'z javoblarida aniqlangan external entity'larning qiymatlarini qaytarmaydi va shuning uchun server tomonidagi fayllarni to'g'ridan-to'g'ri olish mumkin emas.
Blind XXE zaifliklarini hali ham aniqlash va ekspluatatsiya qilish mumkin, lekin buning uchun ilg'or usullar talab qilinadi. Ba'zan siz out-of-band usullaridan foydalanib zaifliklarni topishingiz va ularni ma'lumotni eksfiltratsiya qilish uchun ekspluatatsiya qilishingiz mumkin. Ba'zan esa xato xabarlari ichida maxfiy ma'lumotning oshkor bo'lishiga olib keladigan XML tahlil xatolarini keltirib chiqarishingiz mumkin. Batafsil: Blind XXE zaifliklarini topish va ekspluatatsiya qilish.
XXE injection zaifliklari uchun hujum yuzasi ko'p hollarda aniq, chunki ilovaning odatiy HTTP trafigi XML formatidagi ma'lumotlarni o'z ichiga olgan so'rovlarni o'z ichiga oladi. Boshqa hollarda hujum yuzasi kamroq ko'rinadi. Biroq, agar to'g'ri joylarga qarasangiz, XML'ni umuman o'z ichiga olmagan so'rovlarda ham XXE hujum yuzasini topasiz.
Ba'zi ilovalar mijoz yuborgan ma'lumotlarni qabul qiladi, ularni server tomonida XML hujjatiga joylashtiradi va keyin hujjatni tahlil qiladi. Bunga misol, mijoz yuborgan ma'lumotlar back-end SOAP so'roviga joylashtirilib, keyin back-end SOAP xizmati tomonidan qayta ishlanganda sodir bo'ladi.
Bu holatda siz klassik XXE hujumini amalga oshira olmaysiz, chunki siz butun XML hujjatini nazorat qilmaysiz va shuning uchun DOCTYPE elementini aniqlay yoki o'zgartira olmaysiz. Biroq, buning o'rniga XInclude'dan foydalanishingiz mumkin. XInclude — bu XML spetsifikatsiyasining bir qismi bo'lib, XML hujjatini kichik hujjatlardan tuzish imkonini beradi. Siz XInclude hujumini XML hujjatidagi har qanday ma'lumot qiymati ichiga joylashtirishingiz mumkin, shuning uchun hujum siz server tomonidagi XML hujjatiga joylashtiriladigan bitta ma'lumot elementini nazorat qiladigan holatlarda ham amalga oshirilishi mumkin.
XInclude hujumini amalga oshirish uchun siz XInclude namespace'iga murojaat qilishingiz va kiritmoqchi bo'lgan faylga yo'lni ko'rsatishingiz kerak. Masalan:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>Ba'zi ilovalar foydalanuvchilarga fayllarni yuklash imkonini beradi, keyin ular server tomonida qayta ishlanadi. Ba'zi keng tarqalgan fayl formatlari XML'dan foydalanadi yoki XML kichik komponentlarini o'z ichiga oladi. XML asosidagi formatlarga misol — DOCX kabi ofis hujjat formatlari va SVG kabi rasm formatlari.
Masalan, ilova foydalanuvchilarga rasmlarni yuklash imkonini berishi va yuklangandan so'ng ularni server tomonida qayta ishlashi yoki tekshirishi mumkin. Ilova PNG yoki JPEG kabi formatni kutayotgan bo'lsa ham, ishlatilayotgan rasmni qayta ishlash kutubxonasi SVG rasmlarni qo'llab-quvvatlashi mumkin. SVG formati XML'dan foydalanganligi sababli, hujumchi zararli SVG rasmni yuborib, XXE zaifliklari uchun yashirin hujum yuzasiga yetib borishi mumkin.
Ko'pchilik POST so'rovlari HTML formalari tomonidan yaratiladigan standart content type'dan foydalanadi, masalan application/x-www-form-urlencoded. Ba'zi veb-saytlar so'rovlarni shu formatda kutadi, lekin XML kabi boshqa content type'larni ham qabul qiladi.
Masalan, agar oddiy so'rov quyidagilarni o'z ichiga olsa:
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=barU holda siz quyidagi so'rovni yuborishingiz mumkin, natija bir xil bo'ladi:
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>Agar ilova xabar tanasida XML'ni o'z ichiga olgan so'rovlarga toqat qilsa va tana mazmunini XML sifatida tahlil qilsa, u holda siz so'rovlarni XML formatidan foydalanadigan qilib qayta formatlashning o'zi bilan yashirin XXE hujum yuzasiga yetib borishingiz mumkin.
XXE zaifliklarining aksariyat qismini Burp Suite'ning veb-zaiflik skaneri yordamida tez va ishonchli tarzda topish mumkin.
XXE zaifliklarini qo'lda sinash odatda quyidagilarni o'z ichiga oladi:
Yodda tutingki, XML shunchaki ma'lumot uzatish formati. XML asosidagi funksiyani XSS va SQL injection kabi boshqa zaifliklar uchun ham sinashni unutmang. Sintaksisni buzmaslik uchun payload'ingizni XML escape ketma-ketliklaridan foydalanib kodlashingiz kerak bo'lishi mumkin, lekin buni kuchsiz himoyalarni chetlab o'tish uchun hujumingizni obfuskatsiya qilish maqsadida ham ishlatishingiz mumkin.
Deyarli barcha XXE zaifliklari ilovaning XML tahlil kutubxonasi ilova muhtoj bo'lmagan yoki ishlatishni maqsad qilmagan potentsial xavfli XML xususiyatlarini qo'llab-quvvatlaganligi sababli yuzaga keladi. XXE hujumlarining oldini olishning eng oson va samarali usuli — bu xususiyatlarni o'chirib qo'yishdir.
Odatda, external entity'lar resolyutsiyasini o'chirib qo'yish va XInclude qo'llab-quvvatlashini o'chirib qo'yish yetarli bo'ladi. Bu odatda konfiguratsiya sozlamalari orqali yoki standart xatti-harakatni dasturiy ravishda bekor qilish orqali amalga oshirilishi mumkin. Keraksiz imkoniyatlarni qanday o'chirib qo'yish haqida batafsil ma'lumot uchun XML tahlil kutubxonangiz yoki API'ingiz hujjatlariga murojaat qiling.