Translated ['src/pentesting-web/xss-cross-site-scripting/integer-overflo

This commit is contained in:
Translator 2025-07-24 16:25:32 +00:00
parent b85cc22a1f
commit 4c7065d853

View File

@ -1,11 +1,104 @@
# Integer Overflow
# Integer Overflow (Web Applications)
{{#include ../../banners/hacktricks-training.md}}
Proveri:
> Ova stranica se fokusira na to kako **integer overflow/kratki rezovi mogu biti zloupotrebljeni u web aplikacijama i pretraživačima**. Za tehnike eksploatacije unutar nativnih binarnih datoteka možete nastaviti sa čitanjem posvećene stranice:
>
> {{#ref}}
> ../../binary-exploitation/integer-overflow.md
> {{#endref}}
{{#ref}}
../../binary-exploitation/integer-overflow.md
{{#endref}}
---
## 1. Zašto integer matematika i dalje ima značaj na webu
Iako je većina poslovne logike u modernim stakovima napisana u *sigurnim* jezicima, osnovni runtime (ili biblioteke trećih strana) je na kraju implementiran u C/C++. Kada se brojevi koje kontroliše korisnik koriste za alokaciju bafera, izračunavanje ofseta ili izvođenje provere dužine, **32-bitno ili 64-bitno preklapanje može pretvoriti naizgled bezopasan parametar u čitanje/pisanje van granica, zaobilaženje logike ili DoS**.
Tipična površina napada:
1. **Numerički parametri zahteva** klasična `id`, `offset` ili `count` polja.
2. **Dužina / veličina zaglavlja** `Content-Length`, dužina WebSocket okvira, HTTP/2 `continuation_len`, itd.
3. **Metadata formata datoteka obrađena na serverskoj ili klijentskoj strani** dimenzije slika, veličine delova, tabele fontova.
4. **Konverzije na nivou jezika** signed↔unsigned konverzije u PHP/Go/Rust FFI, JS `Number``int32` kratki rezovi unutar V8.
5. **Autentifikacija i poslovna logika** vrednost kupona, cena ili proračuni stanja koji tiho prelivaju.
---
## 2. Nedavne ranjivosti iz stvarnog sveta (2023-2025)
| Godina | Komponenta | Osnovni uzrok | Uticaj |
|--------|------------|---------------|--------|
| 2023 | **libwebp CVE-2023-4863** | 32-bitno preklapanje množenja prilikom izračunavanja veličine dekodiranog piksela | Pokrenuo Chrome 0-day (`BLASTPASS` na iOS-u), omogućio *daljinsko izvršavanje koda* unutar sandbox-a renderer-a. |
| 2024 | **V8 CVE-2024-0519** | Kratki rez na 32-bit kada se povećava `JSArray` dovodi do OOB pisanja na podržavajućem skladištu | Daljinsko izvršavanje koda nakon jedne posete. |
| 2025 | **Apollo GraphQL Server** (neobjavljeni zakrpa) | 32-bitni potpisani ceo broj korišćen za `first/last` argumente paginacije; negativne vrednosti se preklapaju u ogromne pozitivne | Zaobilaženje logike i iscrpljivanje memorije (DoS). |
---
## 3. Strategija testiranja
### 3.1 Cheat-sheet za granice vrednosti
Pošaljite **ekstreme potpisane/bez potpisane vrednosti** gde god se očekuje ceo broj:
```
-1, 0, 1,
127, 128, 255, 256,
32767, 32768, 65535, 65536,
2147483647, 2147483648, 4294967295,
9223372036854775807, 9223372036854775808,
0x7fffffff, 0x80000000, 0xffffffff
```
Drugi korisni formati:
* Hex (`0x100`), oktalni (`0377`), naučni (`1e10`), JSON big-int (`9999999999999999999`).
* Veoma dugi nizovi cifara (>1kB) za testiranje prilagođenih parsera.
### 3.2 Burp Intruder šablon
```
§INTEGER§
Payload type: Numbers
From: -10 To: 4294967300 Step: 1
Pad to length: 10, Enable hex prefix 0x
```
### 3.3 Fuzzing biblioteke i runtime-ovi
* **AFL++/Honggfuzz** sa `libFuzzer` okvirom oko parsera (npr., WebP, PNG, protobuf).
* **Fuzzilli** fuzzing svestan o gramatici JavaScript engine-a kako bi se pogodile V8/JSC integer truncations.
* **boofuzz** fuzzing mrežnih protokola (WebSocket, HTTP/2) fokusiran na dužinske polja.
---
## 4. Obrasci eksploatacije
### 4.1 Zaobilaženje logike u kodu sa servera (PHP primer)
```php
$price = (int)$_POST['price']; // expecting cents (0-10000)
$total = $price * 100; // ← 32-bit overflow possible
if($total > 1000000){
die('Too expensive');
}
/* Sending price=21474850 → $total wraps to 2147483648 and check is bypassed */
```
### 4.2 Heap overflow putem dekodera slika (libwebp 0-day)
WebP bezgubitni dekoder pomnoži širinu slike × visinu × 4 (RGBA) unutar 32-bitnog `int`. Prilagođena datoteka sa dimenzijama `16384 × 16384` prelazi granicu množenja, alocira kratki bafer i potom piše **~1GB** dekompresovanih podataka izvan heap-a što dovodi do RCE u svakom Chromium-baziranom pretraživaču pre 116.0.5845.187.
### 4.3 XSS/RCE lanac zasnovan na pretraživaču
1. **Integer overflow** u V8 omogućava proizvoljno čitanje/pisanje.
2. Izbegnite sandbox sa drugom greškom ili pozovite nativne API-je da ispustite payload.
3. Payload zatim injektuje zlonamerni skript u kontekst porekla → pohranjeni XSS.
---
## 5. Odbrambene smernice
1. **Koristite široke tipove ili proverenu matematiku** npr., `size_t`, Rust `checked_add`, Go `math/bits.Add64`.
2. **Validirajte opsege rano**: odbacite svaku vrednost van poslovnog domena pre aritmetike.
3. **Omogućite sanitizatore kompajlera**: `-fsanitize=integer`, UBSan, Go detektor trke.
4. **Usvojite fuzzing u CI/CD** kombinujte povratne informacije o pokrivenosti sa granicama korpusa.
5. **Ostanite ažurirani** greške u integer overflow-u pretraživača često se koriste u napadima unutar nedelja.
---
## Reference
* [NVD CVE-2023-4863 libwebp Heap Buffer Overflow](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
* [Google Project Zero "Razumevanje V8 CVE-2024-0519"](https://googleprojectzero.github.io/)
{{#include ../../banners/hacktricks-training.md}}