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

This commit is contained in:
Translator 2025-07-24 16:27:10 +00:00
parent 83b7c86b6d
commit 66e4e848d3

View File

@ -1,11 +1,104 @@
# Przepełnienie całkowite
# Przepełnienie całkowite (Aplikacje internetowe)
{{#include ../../banners/hacktricks-training.md}}
Sprawdź:
> Ta strona koncentruje się na tym, jak **przepełnienia/truncacje całkowite mogą być wykorzystywane w aplikacjach internetowych i przeglądarkach**. Aby uzyskać informacje o prymitywach eksploatacyjnych w natywnych binariach, możesz kontynuować czytanie dedykowanej strony:
>
> {{#ref}}
> ../../binary-exploitation/integer-overflow.md
> {{#endref}}
{{#ref}}
../../binary-exploitation/integer-overflow.md
{{#endref}}
---
## 1. Dlaczego matematyka całkowita wciąż ma znaczenie w sieci
Mimo że większość logiki biznesowej w nowoczesnych stosach jest pisana w *bezpiecznych pamięciowo* językach, podstawowy runtime (lub biblioteki stron trzecich) jest ostatecznie zaimplementowany w C/C++. Kiedy liczby kontrolowane przez użytkownika są używane do alokacji buforów, obliczania przesunięć lub wykonywania kontroli długości, **przepełnienie 32-bitowe lub 64-bitowe może przekształcić pozornie nieszkodliwy parametr w odczyt/zapis poza zakresem, obejście logiki lub DoS**.
Typowa powierzchnia ataku:
1. **Numeryczne parametry żądania** klasyczne pola `id`, `offset` lub `count`.
2. **Nagłówki długości/rozmiaru** `Content-Length`, długość ramki WebSocket, HTTP/2 `continuation_len` itp.
3. **Metadane formatu pliku analizowane po stronie serwera lub klienta** wymiary obrazu, rozmiary kawałków, tabele czcionek.
4. **Konwersje na poziomie języka** rzutowania signed↔unsigned w PHP/Go/Rust FFI, truncacje JS `Number``int32` wewnątrz V8.
5. **Uwierzytelnianie i logika biznesowa** wartość kuponu, obliczenia cen lub sald, które cicho przepełniają.
---
## 2. Ostatnie luki w zabezpieczeniach w rzeczywistych zastosowaniach (2023-2025)
| Rok | Komponent | Przyczyna | Wpływ |
|-----|-----------|-----------|-------|
| 2023 | **libwebp CVE-2023-4863** | Przepełnienie mnożenia 32-bitowego podczas obliczania rozmiaru odkodowanego piksela | Wywołało 0-dniową lukę w Chrome (`BLASTPASS` na iOS), umożliwiło *zdalne wykonanie kodu* wewnątrz piaskownicy renderera. |
| 2024 | **V8 CVE-2024-0519** | Truncacja do 32-bitów podczas powiększania `JSArray` prowadzi do zapisu OOB na zapleczu | Zdalne wykonanie kodu po jednej wizycie. |
| 2025 | **Apollo GraphQL Server** (nieopublikowana poprawka) | 32-bitowa liczba całkowita ze znakiem używana do argumentów paginacji `first/last`; wartości ujemne przepełniają do ogromnych dodatnich | Obejście logiki i wyczerpanie pamięci (DoS). |
---
## 3. Strategia testowania
### 3.1 Arkusz oszustw wartości granicznych
Wyślij **ekstremalne wartości signed/unsigned** wszędzie tam, gdzie oczekiwana jest liczba całkowita:
```
-1, 0, 1,
127, 128, 255, 256,
32767, 32768, 65535, 65536,
2147483647, 2147483648, 4294967295,
9223372036854775807, 9223372036854775808,
0x7fffffff, 0x80000000, 0xffffffff
```
Inne przydatne formaty:
* Hex (`0x100`), ósemkowy (`0377`), naukowy (`1e10`), JSON big-int (`9999999999999999999`).
* Bardzo długie ciągi cyfr (>1kB) do trafienia w niestandardowe parsery.
### 3.2 Szablon Burp Intruder
```
§INTEGER§
Payload type: Numbers
From: -10 To: 4294967300 Step: 1
Pad to length: 10, Enable hex prefix 0x
```
### 3.3 Fuzzing biblioteki i środowiska uruchomieniowe
* **AFL++/Honggfuzz** z `libFuzzer` wokół parsera (np. WebP, PNG, protobuf).
* **Fuzzilli** fuzzing z uwzględnieniem gramatyki silników JavaScript, aby trafić w obcinanie liczb całkowitych V8/JSC.
* **boofuzz** fuzzing protokołów sieciowych (WebSocket, HTTP/2) koncentrujący się na polach długości.
---
## 4. Wzorce eksploatacji
### 4.1 Ominięcie logiki w kodzie po stronie serwera (przykład PHP)
```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 Przepełnienie sterty za pomocą dekodera obrazów (libwebp 0-day)
Dekoder WebP bezstratny pomnożył szerokość obrazu × wysokość × 4 (RGBA) wewnątrz 32-bitowego `int`. Opracowany plik o wymiarach `16384 × 16384` przepełnia mnożenie, alokuje krótki bufor i następnie zapisuje **~1GB** zdekompresowanych danych poza stertą prowadząc do RCE w każdej przeglądarce opartej na Chromium przed wersją 116.0.5845.187.
### 4.3 Łańcuch XSS/RCE oparty na przeglądarce
1. **Przepełnienie całkowite** w V8 daje dowolne odczyty/zapisy.
2. Ucieczka z piaskownicy za pomocą drugiego błędu lub wywołanie natywnych API w celu zrzucenia ładunku.
3. Ładunek następnie wstrzykuje złośliwy skrypt do kontekstu źródłowego → przechowywane XSS.
---
## 5. Wytyczne obronne
1. **Używaj szerokich typów lub sprawdzanej matematyki** np. `size_t`, Rust `checked_add`, Go `math/bits.Add64`.
2. **Waliduj zakresy wcześnie**: odrzucaj wszelkie wartości poza domeną biznesową przed arytmetyką.
3. **Włącz sanitizery kompilatora**: `-fsanitize=integer`, UBSan, detektor wyścigów Go.
4. **Przyjmij fuzzing w CI/CD** połącz informacje zwrotne o pokryciu z granicznymi zbiorami.
5. **Bądź na bieżąco z łatkami** błędy przepełnienia całkowitego w przeglądarkach są często wykorzystywane w ciągu kilku tygodni.
---
## References
* [NVD CVE-2023-4863 libwebp Heap Buffer Overflow](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
* [Google Project Zero "Understanding V8 CVE-2024-0519"](https://googleprojectzero.github.io/)
{{#include ../../banners/hacktricks-training.md}}