Open Redirect

≡ Barcha darslar
Tezkor 🔎 Indeks
↪️

Open Redirect

Boshqa saytga yo'naltirish
Dars 21 O'rta o'z saytingizda
1

Maqsad

saytning obro'si bilan zararli sahifaga yuborish

redirect parametri tekshirilmaysa — hujumchi site.uz havolasini zararli.uz ga yo'naltiradi. Foydalanuvchi domen ishonchi bilan kirsak, phishing va o'g'irlikka uchun ishlatiladi.

2

Tushuntirish

// XAVFLI
res.redirect(req.query.next);        // hujum: next=https://zararli.uz

// TO'G'RI
const ALLOW = new Set(['/dashboard','/profile','/orders']);
const next = req.query.next;
if (!ALLOW.has(next)) return res.redirect('/');

Yana 2 xil himoya

// 1) relative-only
if (next.startsWith('/') && !next.startsWith('//')) ok = true;

// 2) domain allowlist
const u = new URL(next, 'https://site.uz');
if (u.origin === 'https://site.uz') ok = true;
3

Qanday aniqlanadi

# 1) redirect qo'ng'iroqlari
grep -rnE "res\.redirect|window\.location|location\.href|header\('Location" src/ | head

# 2) parametr nomlari
grep -rniE "next=|returnUrl|redirect_uri|continue|return_to|goto|url=" src/ templates/ 2>/dev/null | head
4

Buyruqlar

# 1) to'g'ridan-to'g'ri URL
for U in "https://zararli.uz" "//zararli.uz" "https://site.uz.zararli.uz" \
          "https:/\zararli.uz" "https:\\\\zararli.uz" "/\\zararli.uz" \
          "https://site.uz@zararli.uz" "https://zararli.uz/?x=https://site.uz"; do
  printf "  %-32s → " "$U"
  curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" \
    "https://site.uz/login?next=$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1]))" "$U")"
done

# 2) Location sarlavhasini ko'rish
curl -s -D- -o /dev/null "https://site.uz/login?next=https://zararli.uz" | grep -i location

# 3) login orqali (ko'p sayt shu yerda yo'naltiradi)
curl -s -D- -o /dev/null -X POST https://site.uz/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"sinov@site.uz","password":"x","next":"https://zararli.uz"}' \
  | grep -iE "location|set-cookie"

# 4) JS da tekshirish
curl -s "https://site.uz/login?next=-alert(1)-" | grep -oE "next[^,;]{0,40}"
curl -s "https://site.uz/login?next=javascript:alert(1)" | grep -i javascript

# 5) ichki o'tish (open redirect emas, lekin tekshiriladi)
curl -s -D- -o /dev/null "https://site.uz/redirect?next=/admin" | grep -i location
5

Natija

✓ MUvaffaqiyat — hujum ISHLADI
Server javobiNima degani
`Location: https://zararli.uz`**Open redirect — phishing uchun**
`//zararli.uz` qabul qilindi**Protocol-relative zaiflik**
`site.uz.zararli.uz` qabul qilindi**Subdomain chalkashligi**
`javascript:` bajarildi**XSS + redirect**
`site.uz@zararli.uz` — userinfo hiylaosi**Zaif parsing**
✗ Rad etish — hujum ISHLAMADI
Server javobiNima degani
`Location: /dashboard` (ichki)**To'g'ri**
`/login` ga qaytarildi**To'g'ri** — filtr ishlayapti
400 / invalid redirect**Rad etilgan**
6

Zararni yopish

1. Yo'l (path) allowlist

const ALLOW = new Set(['/dashboard','/profile','/orders','/settings']);
const next = req.query.next;
if (typeof next !== 'string' || !ALLOW.has(next))
  return res.redirect('/');
// eng ishonchli: faqat ma'lum yo'llar

2. Agar URL kerak bo'lsa — origin tekshiruvi

function safeNext(raw, fallback = '/') {
  if (!raw) return fallback;
  const u = new URL(raw, 'https://site.uz');
  if (u.origin !== 'https://site.uz') return fallback;
  if (u.protocol === 'javascript:') return fallback;
  return u.pathname + u.search;
}

3. Taqiqlanadigan shakllar

const BAD = [
  /^\/\//,          //zararli.uz
  /^\/\\/,         /\zararli.uz
  /^\w+:/,          //javascript:, data:, https:
  /@/,               //site.uz@zararli.uz
  /%00/i, /[
]/   //null va yangi qator
];
if (BAD.some(r => r.test(raw))) return fail();

4. Link rel atributlari

<a href="https://site.uz/tashqi" rel="noopener noreferrer nofollow">Tashqi</a>
7

Tekshirish ro'yxati

  • `next` faqat yo'l (path) allowlist dan
  • `//`, `/\`, `\`, `@`, `javascript:` rad etiladi
  • Origin `https://site.uz` bilan solishtiriladi
  • Login'dan keyingi redirect ham tekshiriladi
  • Tashqi linklarda `rel="noopener"`
  • `?next=https://zararli.uz` bilan test qilindi