Ushbu bo'limda saytlar tomonidan bajariladigan standart dekodlashdan foydalanib, kirish filtrlarini chetlab o'tish va XSS hamda SQL injection kabi turli hujumlar uchun zararli payloadlarni kiritishni ko'rsatamiz.
Klientlar va serverlar tizimlar o'rtasida ma'lumot uzatish uchun turli kodlashlardan foydalanadi. Ma'lumotni haqiqatan ishlatmoqchi bo'lganda, ko'pincha uni avval dekodlash kerak. Dekodlash qadamlarining aniq ketma-ketligi ma'lumot paydo bo'ladigan kontekstga bog'liq. Masalan, query parametri odatda server tomonida URL-dekodlanadi, HTML element matni esa klient tomonida HTML-dekodlanadi. Hujum tuzayotganda payloadingiz aynan qayerga kiritilayotganini o'ylab ko'ring.
Inyeksiya hujumlari ko'pincha tanish naqshlarga ega payloadlarni o'z ichiga oladi — HTML teglari, JavaScript funksiyalari yoki SQL iboralari. Saytlar bunday shubhali naqshlarni bloklaydi. Lekin bunday kirish filtrlari xavfsizlikni tekshirish uchun kirishni dekodlashi ham kerak. Muhimi: tekshirish paytidagi dekodlash back-end server yoki brauzer ma'lumotni ishlatganda bajaradigan dekodlash bilan bir xil bo'lishi shart. Har qanday nomuvofiqlik hujumchiga zararli payloadni filtr orqali yashirincha o'tkazishga imkon beradi.
WAF'lar ba'zan kirishni tekshirishda uni to'g'ri URL-dekodlamaydi. Bunday holda qora ro'yxatdagi belgilar yoki so'zlarni kodlab payloadni back-end'ga yashirincha o'tkazishingiz mumkin. Masalan, SQL inyeksiyada SELECT %53%45%4C%45%43%54 ga aylanadi.
Ba'zi serverlar kelgan URL'larni ikki marta URL-dekodlaydi. Agar xavfsizlik mexanizmi faqat bir marta dekodlasa, payloadni ikki marta kodlab yashirish mumkin — % belgilarining o'zi %25 bilan almashtiriladi:
[...]/?search=%253Cimg%2520src%253Dx%2520onerror%253Dalert(1)%253EWAF buni faqat bir marta dekodlagani uchun xavfli ekanligini aniqlay olmasligi mumkin. Back-end server keyin ikki marta dekodlab, payload muvaffaqiyatli kiritiladi.
HTML hujjatlarida ba'zi belgilar & bilan boshlanib ; bilan tugaydigan havola bilan almashtiriladi. Havola belgining o'nlik yoki o'n oltilik kod nuqtasi orqali ham berilishi mumkin (: va :). Agar server tekshiruvi alert() payloadini aniq qidirsa, belgilarni HTML-kodlab uni aldash mumkin:
<img src=x onerror="alert(1)">O'nlik yoki o'n oltilik HTML kodlashda kod nuqtalariga ixtiyoriy sonli boshlovchi nollar qo'shishingiz mumkin. Ba'zi WAF'lar buni hisobga olmaydi: javascript:alert(1)
XML HTML bilan chambarchas bog'liq va bir xil raqamli escape ketma-ketliklarini qo'llab-quvvatlaydi. Payloadingiz brauzer emas, serverning o'zi tomonidan dekodlanadi — bu SQL inyeksiya kalit so'zlarini aniqlaydigan WAF'larni chetlab o'tish uchun foydali:
<stockCheck>
<productId>123</productId>
<storeId>999 SELECT * FROM information_schema.tables</storeId>
</stockCheck>String kontekstiga inyeksiya qilganda, ko'p dasturlash tillari (jumladan brauzerdagi JavaScript dvigateli) escape ketma-ketliklarini dekodlaydi. Unicode escape \u prefiksi va to'rt raqamli hex kodidan iborat (\u003a = ikki nuqta). Hex escape \x (\x61 = a), octal escape esa \ (\141 = a):
eval("\u0061lert(1)")
eval("\x61lert(1)")
eval("\141lert(1)")Bu kodlashlar server tomonida dekodlanmay qoladi va brauzer ularni qayta dekodlaguncha aniqlanmasligi mumkin.
Payloadingizni bir nechta obfuskatsiya qatlami ortiga yashirish uchun kodlashlarni birlashtirishingiz mumkin:
<a href="javascript:\u0061lert(1)">Click me</a>Brauzer avval \ ni backslash'ga dekodlaydi, natijada \u0061 unicode escape hosil bo'ladi, u esa alert ga aylanadi. Bunday inyeksiya uchun qaysi dekodlash qanday tartibda bajarilishini yaxshi tushunish kerak.
Qat'iy kodlash bo'lmasa-da, SQL inyeksiya hujumlarini CHAR() funksiyasi bilan yashirish mumkin — u bitta kod nuqtasini qabul qilib mos belgini qaytaradi. Qaytarilgan qiymatlarni birlashtirib bloklangan kalit so'zlarni yashirish mumkin:
CHAR(83)+CHAR(69)+CHAR(76)+CHAR(69)+CHAR(67)+CHAR(84)Bu SQL sifatida qayta ishlanganda dinamik ravishda SELECT kalit so'zini quradi va kiritilgan so'rovni bajaradi.