Integer Overflow (Web Applications)

Reading time: 5 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Diese Seite konzentriert sich darauf, wie integer overflows/truncations in Webanwendungen und Browsern missbraucht werden können. Für exploitation primitives innerhalb nativer Binaries kannst du die dedizierte Seite weiterlesen:

{{#ref}}

../../binary-exploitation/integer-overflow-and-underflow.md {{#endref}}


1. Why integer math still matters on the web

Auch wenn die meiste Business-Logic in modernen Stacks in memory-safe Sprachen geschrieben ist, wird die zugrundeliegende Laufzeit (oder Drittanbieter-Bibliotheken) letztlich in C/C++ implementiert. Wann immer benutzerkontrollierte Zahlen zum Allokieren von Buffern, Berechnen von Offsets oder zur Längenprüfung verwendet werden, kann ein 32-Bit- oder 64-Bit-Wrap-around einen scheinbar harmlosen Parameter in einen Out-of-Bounds-Lese-/Schreibzugriff, eine Logik-Umgehung oder einen DoS verwandeln.

Typische Angriffsflächen:

  1. Numeric request parameters – klassische id-, offset- oder count-Felder.
  2. Length / size headers – Content-Length, WebSocket frame length, HTTP/2 continuation_len, etc.
  3. File-format metadata parsed server-side or client-side – Bilddimensionen, Chunk-Größen, Font-Tabellen.
  4. Language-level conversions – signed↔unsigned casts in PHP/Go/Rust FFI, JS Number → int32 truncations inside V8.
  5. Authentication & business logic – coupon value, price, oder balance-Berechnungen, die still überlaufen.

2. Recent real-world vulnerabilities (2023-2025)

YearComponentRoot causeImpact
2023libwebp – CVE-2023-486332-bit multiplication overflow when computing decoded pixel sizeTriggered a Chrome 0-day (BLASTPASS on iOS), allowed remote code execution inside the renderer sandbox.
2024V8 – CVE-2024-0519Truncation to 32-bit when growing a JSArray leads to OOB write on the backing storeRemote code execution after a single visit.
2025Apollo GraphQL Server (unreleased patch)32-bit signed integer used for first/last pagination args; negative values wrap to huge positivesLogik-Umgehung & Speicherauslastung (DoS).

3. Testing strategy

3.1 Boundary-value cheat-sheet

Sende extreme signed/unsigned values überall dort, wo eine Integer erwartet wird:

-1, 0, 1,
127, 128, 255, 256,
32767, 32768, 65535, 65536,
2147483647, 2147483648, 4294967295,
9223372036854775807, 9223372036854775808,
0x7fffffff, 0x80000000, 0xffffffff

Weitere nützliche Formate:

  • Hex (0x100), octal (0377), scientific (1e10), JSON big-int (9999999999999999999).
  • Sehr lange Ziffernfolgen (>1kB), um benutzerdefinierte Parser auszulösen.

3.2 Burp Intruder-Vorlage

§INTEGER§
Payload type: Numbers
From: -10 To: 4294967300 Step: 1
Pad to length: 10, Enable hex prefix 0x

3.3 Fuzzing-Bibliotheken & Laufzeitumgebungen

  • AFL++/Honggfuzz mit libFuzzer-Harness rund um den Parser (z. B. WebP, PNG, protobuf).
  • Fuzzilli – grammatikbasiertes fuzzing von JavaScript-Engines, um Integer-Abschneidungen in V8/JSC auszulösen.
  • boofuzz – fuzzing von Netzwerkprotokollen (WebSocket, HTTP/2) mit Fokus auf Längenfelder.

4. Exploitation patterns

4.1 Logic bypass in server-side code (PHP example)

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 via image decoder (libwebp 0-day)

Der WebP lossless-Decoder multiplizierte Bildbreite × Bildhöhe × 4 (RGBA) innerhalb eines 32-Bit-Ints. Eine manipulierte Datei mit den Abmessungen 16384 × 16384 überläuft die Multiplikation, allokiert einen zu kurzen Puffer und schreibt anschließend ~1GB dekomprimierter Daten über das Heap hinaus – was zu RCE in jedem Chromium-basierten Browser vor 116.0.5845.187 führt.

4.3 Browser-basierte XSS/RCE chain

  1. Integer overflow in V8 ermöglicht arbitrary read/write.
  2. Escape the sandbox mit einem zweiten bug oder rufe native APIs auf, um eine payload abzulegen.
  3. Die payload injiziert dann ein bösartiges Script in den origin context → stored XSS.

5. Verteidigungsrichtlinien

  1. Breitere Typen oder checked math verwenden – z. B. size_t, Rust checked_add, Go math/bits.Add64.
  2. Bereiche frühzeitig validieren: Werte außerhalb des Business-Domain vor arithmetischen Operationen ablehnen.
  3. Compiler-Sanitizer aktivieren: -fsanitize=integer, UBSan, Go race detector.
  4. Fuzzing in CI/CD integrieren – Coverage-Feedback mit Boundary-Corpora kombinieren.
  5. Auf dem aktuellen Stand bleiben – Browser-Integer-Overflow-Bugs werden häufig innerhalb weniger Wochen ausgenutzt.

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks