Maqolalar 10 daqiqa o‘qish 2 soat amaliyot 36 ko‘rish
Business logic: tool talab qilmaydigan hujum — tizim dizaynidagi mantiqiy bo'shliqlar
Bu darsda payload yo'q, maxsus belgi yo'q, tool yo'q — faqat fikrlash. Zaiflik kodda emas, tizim mantig'ida: manfiy son, ikki kupon, mijoz taraf tekshiruvi. Beshta labda dizayn bo'shliqlarini topamiz, keyin nega 'jarayon faqat men o'ylagancha ketadi' degan taxmin eng qimmatga tushishini ko'ramiz.
Mundarija
Kursning boshqa hamma darsida bitta texnik naqsh bor edi: maxsus belgi, payload, filtr. Bu dars boshqacha — bu yerda hech qanday texnika yo'q. Zaiflik kodda emas, tizimning mantig'ida: dasturchi jarayon qanday ketishini taxmin qilgan, hujumchi esa boshqacha yo'l topgan.
Business logic zaifligini avtomatik skaner topa olmaydi, chunki har bir so'rov "to'g'ri" ko'rinadi — manfiy son ham son, ikki kupon ham amaldagi kupon. Buni faqat odam topadi, va aynan shuning uchun bu eng qimmatli mahorat: siz tizimni dasturchi o'ylamagan tomondan ko'rasiz.
Bu darsdan keyin siz mantiqiy bo'shliqlarni qidirishni bilasiz, beshta turli xatoni topasiz va nega har bir muhim qoidani serverda tekshirish kerakligini tushunasiz.
Bu dars kimga
1-dars (Burp) tugagan bo'lsin. Bu darsda tooldan ko'ra fikrlash muhim —
"dasturchi nimani taxmin qilgan?" degan savolni doim bering.
Buzilgan taxmin#
Business logic zaifligi bitta umumiy taxmindan tug'iladi:
"Foydalanuvchi jarayonni men dizayn qilgancha bosib o'tadi."
Dasturchi xarid jarayonini chizadi: mahsulot tanla → savatga qo'sh → to'lov → tasdiq. Har qadam avvalgisiga bog'liq deb o'ylaydi. Lekin foydalanuvchi qadamlarni o'zgartirib, takrorlab, teskari bajarishi mumkin — brauzer uni majburlamaydi.
Xato aslida bitta savolni tashlab ketishdan kelib chiqadi: "Agar foydalanuvchi buni qilmasa nima bo'ladi?" Manfiy son kiritsa? Kuponni ikki marta ishlatsa? To'lovni o'tkazib yuborsa? Dasturchi "kim ham unday qilardi" deydi — hujumchi esa aynan shuni qiladi.
Har qoida — serverda tekshirilishi shart: agar tekshiruv faqat brauzerda yoki faqat "odatiy yo'lda" bo'lsa, u tekshiruv emas, taxmin.
Atamalar#
| Atama | Ma'nosi |
|---|---|
business logic flaw |
tizim mantig'idagi bo'shliq (kod xatosi emas) |
client-side control |
brauzerda qilingan tekshiruv (oson chetlab o'tiladi) |
server-side validation |
serverda qilingan tekshiruv (yagona ishonchli joy) |
workflow |
ko'p qadamli jarayon (xarid, ro'yxatdan o'tish) |
integer overflow |
son chegaradan oshib, manfiyga "aylanib" ketishi |
race condition |
ikki so'rov bir vaqtda kelib, tekshiruvni chetlab o'tishi |
invariant |
har doim rost bo'lishi kerak bo'lgan qoida (narx ≥ 0) |
trust boundary |
ishonchli va ishonchsiz tomon chegarasi (brauzer ↔ server) |
Nazariya: brauzer majburlamaydi#
Zaif qolip — muhim qiymatga yoki qoidaga brauzerda ishonish:
# Zaif: narx mijozdan keladi — brauzer uni "to'g'ri" yuboradi deb ishoniladi
def checkout(request):
price = int(request.POST["price"]) # <-- mijozdan
if price <= request.user.credit:
create_order(request.user, price)
Dasturchi narxni forma yuboradi deb o'ylaydi, chunki brauzerda u yashirin
maydon. Lekin 1-darsda ko'rdik: brauzer foydalanuvchining dasturi, u
istalgan qiymatni yuboradi. price=1 yuborilsa, server rozi bo'ladi —
mantig'i "narx kreditdan kam bo'lsa yetadi", "narx haqiqiymi" emas.
Dizayn: tanla → narx(server) → to'lov → tasdiq
Hujum: tanla → narx(MIJOZ o'zgartirdi) → to'lov → tasdiq
▲
brauzer majburlamaydi
Kuzating
har so'rovda qiymat va qoidalarni ko'zdan kechiring: narx, miqdor, chegirma, rol, holat. "Bu qiymatni server tekshiradimi yoki mijozga ishonadimi?" — asosiy savol shu. Manfiy, nol, juda katta, takroriy qiymatlarni sinang.
Amaliyot#
1-labMijoz tarafiga ishonch#
Lab: Excessive trust in client-side controls
· APPRENTICE
Vazifa: kreditingizdan qimmat kurtkani arzon sotib olish.
Nimani ko'rasiz: xarid so'rovida price maydoni yuboriladi.
Savol: narxni kim belgilaydi — server bazadanmi yoki so'rovdagi
price maydonimi? Uni o'zgartirsangiz, server tekshiradimi?
Eng oddiy tekshiruv: Burp'da price ni kichik songa o'zgartiring.
Bu 1-darsdagi taxminning oqibati: narx so'rovda keladi va server unga ishonadi. Narx serverda, bazadan olinishi kerak edi; mijoz faqat qaysi mahsulotni tanlaydi. Bir maydon — butun to'lov mantig'i chetlab o'tildi. Bu IDOR'dagi "so'rovdagi qiymatga ishonma" qoidasining pul versiyasi.
2-labManfiy miqdor#
Lab: High-level logic vulnerability
· APPRENTICE
Vazifa: yana o'sha kurtka, lekin bu safar price emas, quantity
bilan.
Nimani ko'rasiz: savatga miqdor qo'shiladi. Server narxni to'g'ri hisoblaydi — miqdor × narx.
Savol: miqdor manfiy bo'lsa nima bo'ladi? -1 × narx qancha? Server
manfiy miqdorni rad etadimi?
Eng oddiy tekshiruv: quantity ni manfiy songa o'zgartiring.
Server narxni to'g'ri hisoblaydi — lekin manfiy miqdorni kutmaydi. Manfiy son jami summani kamaytiradi yoki hatto manfiy qiladi. Dasturchi "miqdor musbat bo'ladi" deb o'ylagan va tekshirmagan. Tashlab ketilgan savol: "agar foydalanuvchi manfiy son kiritsa?"
3-labSon chegaradan oshadi#
Lab: Low-level logic flaw
· PRACTITIONER
Vazifa: kurtkani sotib olish — jami summani integer overflow bilan manfiyga "aylantirib".
Nimani ko'rasiz: miqdor musbat bo'lishi tekshiriladi, lekin juda katta miqdorga chek yo'q.
Savol: son ma'lum chegaradan oshsa, u "aylanib" manfiyga tushishi mumkin. Yetarlicha ko'p qo'shsangiz, jami summa nima bo'ladi?
Eng oddiy tekshiruv: mahsulotni juda ko'p marta qo'shib, summani chegaradan oshiring; keyin kreditga sig'adigan qilib to'g'rilang.
Manfiy son bloklangan, lekin juda katta son unutilgan. Butun son xotirada chekli — chegaradan oshsa, u eng kichik manfiy songa "aylanadi" (integer overflow). Bu texnik detal, lekin ildizi o'sha mantiqiy bo'shliq: qiymatning chegaralari tekshirilmagan. Musbatni tekshirish yetarli emas — yuqori chegara ham kerak.
4-labNomuvofiq nazorat#
Lab: Inconsistent security controls
· PRACTITIONER
Vazifa: admin panelga kirib, carlos ni o'chirish.
Nimani ko'rasiz: admin panel faqat @dontwannacry.com domenidagi
xodimlarga ochiq. Siz email manzilingizni o'zgartira olasiz.
Savol: kim admin bo'lishini email domeni hal qiladi. Email domeningizni o'zgartira olsangiz, o'zingizni "xodim" qila olmaysizmi?
Eng oddiy tekshiruv: ro'yxatdan o'ting, keyin email'ni
@dontwannacry.com ga o'zgartiring.
Xavfsizlik nazorati bor — admin faqat xodimlarga. Lekin "xodim" ta'rifi o'zgartiriladigan ma'lumotga (email domeni) bog'langan. Bir joyda qattiq nazorat, boshqasida (email o'zgartirish) bo'sh — nazorat nomuvofiq. Hujumchi qattiq eshikni emas, ochiq derazani topadi.
5-labQoidani buzib ishlatish#
Lab: Flawed enforcement of business rules
· APPRENTICE
Vazifa: kurtkani ikki kuponni navbatma-navbat ishlatib arzonlashtirish.
Nimani ko'rasiz: ikkita chegirma kupon — NEWCUST5 va SIGNUP30.
Har biri bir marta ishlatilishi kerak.
Savol: bitta kuponni ketma-ket ishlatib bo'lmaydi — server "allaqachon ishlatilgan" deydi. Lekin ikkitasini navbatma-navbat ishlatsangiz-chi?
Eng oddiy tekshiruv: NEWCUST5 → SIGNUP30 → NEWCUST5 → ... ketma-ket
qo'llang.
Har kupon "bir marta" degan qoida bor, lekin u faqat ketma-ket bir xil kuponni tekshiradi. Navbatlashtirish holatni "tozalaydi" va qoida qayta qayta ishlaydi. Dasturchi foydalanuvchi kuponlarni navbatlab ishlatishini tasavvur qilmagan. Yana o'sha savol: "agar foydalanuvchi buni kutilmagan tartibda qilsa?"
Nima ishlamaydi va nega#
"Brauzerda tekshiruv qo'ydim." 1-lab: brauzerdagi har qanday tekshiruv Burp bilan chetlab o'tiladi. Brauzer — ishonchsiz tomon. Har qoida serverda takrorlanishi shart.
"Musbat sonni tekshirdim." 2, 3-lab: manfiy bloklangan bo'lsa, juda katta son overflow qiladi. Qiymatning ikki chegarasi ham kerak.
"Har eshikni himoyaladim." 4-lab: bir eshik qattiq, ikkinchisi (email o'zgartirish) ochiq bo'lsa, nazorat nomuvofiq. Himoya eng zaif nuqta qadar kuchli.
Endi yopamiz#
Business logic'ning yechimi bitta kod satri emas — u fikrlash odati. Lekin uni Django'da amalga oshirishning aniq qoidalari bor:
1. Har muhim qiymatni serverda oling yoki tekshiring. Narx, rol, holat — hech qachon mijozdan ishonch bilan olmang:
# Zaif: narx va miqdor mijozdan
price = int(request.POST["price"])
qty = int(request.POST["quantity"])
# To'g'ri: narx bazadan, miqdor tekshirilgan chegarada
product = get_object_or_404(Product, pk=request.POST["product_id"])
qty = int(request.POST["quantity"])
if not (1 <= qty <= 99): # ikki chegara ham
raise ValidationError("Miqdor 1 dan 99 gacha")
total = product.price * qty # narx serverdan
2. Invariantlarni modelda qulflang. "Narx manfiy bo'lmaydi", "miqdor musbat" — bu qoidalarni ma'lumotlar bazasi darajasida majburlang:
from django.core.validators import MinValueValidator
from django.db import models
class OrderItem(models.Model):
quantity = models.PositiveIntegerField(validators=[MinValueValidator(1)])
# PositiveIntegerField manfiyni bazada ham rad etadi
3. Ko'p qadamli jarayonni serverda kuzating. Foydalanuvchi qadamni o'tkazib yuborsa, server sezishi kerak — har qadamda oldingi qadam bajarilganini tekshiring, brauzerning "keyingi" tugmasiga ishonmang.
4. Kupon/limit kabi qoidalarni atomik hisoblang. "Bir marta"ni har foydalanuvchi uchun bazada belgilang, navbatlashtirib chetlab bo'lmasin.
Muhim
business logic zaifligini test suite topa oladi — agar siz "kutilmagan kirish" testlarini yozsangiz. Har muhim funksiyaga manfiy, nol, juda katta, takroriy va tartibsiz kirish testini qo'shing. Dasturchi tashlab ketgan savol — "agar foydalanuvchi buni qilmasa?" — aynan test bo'lishi kerak.
Aniq misol: bu saytda holatni o'zgartiruvchi asosiy joy — layk tugmasi
(like_toggle). U @require_POST bilan himoyalangan, CSRF token
tekshiriladi, rate limiting qo'yilgan, va eng muhimi — qaysi maqolaga
layk bosilgani URL yo'lidan (<slug:slug>) olinadi va get_post
bilan tekshiriladi, so'rov tanasidagi ishonchsiz qiymatdan emas. Ya'ni
"qaysi obyekt" qarori serverda, mijoz faqat mavjud maqolani tanlaydi.
Nazorat savollari#
- Business logic zaifligi nima uchun avtomatik skaner bilan topilmaydi?
- Nega brauzerdagi tekshiruv (client-side control) himoya emas?
- 1-labda narx qayerdan olinishi kerak edi? Nega mijozdan emas?
- Manfiy miqdor (2-lab) nega o'tib ketdi? Qaysi savol tashlab ketilgan?
- Integer overflow (3-lab) nima? Nega "musbatni tekshirish" yetarli emas?
- 4-labda nazorat nega "nomuvofiq"? Qattiq eshik qayerda, ochiq deraza qayerda edi?
- 5-labda "bir marta" qoidasi qanday chetlab o'tildi?
PositiveIntegerFieldqanday himoya beradi? U qaysi darajada majburlaydi?- Ko'p qadamli jarayonni server qanday kuzatishi kerak?
- "Agar foydalanuvchi buni qilmasa?" savolini test suite'da qanday ifodalaysiz?
Report uchun talablar#
- Skrinshot: kamida bitta labda "solved" ko'ringan holat.
- Fikrlash izi: har lab uchun bitta jumla — "dasturchi nimani taxmin qilgan, siz qaysi taxminni buzdingiz?"
- Nima ishlamadi: biror mantiqiy g'oyani sinadingiz, lekin server tekshirgan ekan — qaysi biri va nega ishlamadi?
- Tuzatuvchi kod: yuqoridagi zaif
checkoutfunksiyasini oling (yoki o'z loyihangizdan) va uni server tarafida narx + chegara tekshiruvi bilan yoping. Oldingi va keyingi holatni keltiring.
Faqat ruxsat berilgan joyda
Narxni o'zgartirish yoki qoidani buzib ishlatish — natijasi qanday "arzon" ko'rinishidan qat'i nazar, firibgarlik. Bu texnikalarni faqat PortSwigger laboratoriyasida yoki o'zingizga tegishli tizimda sinang.
Keyingi dars: kurs yakuni — hamma darsni bitta g'oyaga bog'laymiz va mustaqil sinov loyihasi bilan yopamiz.