5.3 KiB
Raw Blame History

Tam Sayı Taşması (Web Uygulamaları)

{{#include ../../banners/hacktricks-training.md}}

Bu sayfa, tam sayı taşmalarının/kesimlerinin web uygulamalarında ve tarayıcılarda nasıl kötüye kullanılabileceğine odaklanmaktadır. Yerel ikili dosyalar içindeki istismar ilkeleri için özel sayfayı okumaya devam edebilirsiniz:

{{#ref}}

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


1. Neden tam sayı matematiği web'de hala önemlidir

Modern yığınlardaki çoğu iş mantığı bellek güvenli dillerde yazılmış olsa da, temel çalışma zamanı (veya üçüncü taraf kütüphaneler) nihayetinde C/C++ ile uygulanmaktadır. Kullanıcı kontrolündeki sayılar tamponları ayırmak, ofsetleri hesaplamak veya uzunluk kontrolleri yapmak için kullanıldığında, 32-bit veya 64-bit sarılması, görünüşte zararsız bir parametreyi sınır dışı okuma/yazma, mantık atlaması veya DoS'a dönüştürebilir.

Tipik saldırı yüzeyi:

  1. Sayısal istek parametreleri klasik id, ofset veya sayı alanları.
  2. Uzunluk / boyut başlıkları Content-Length, WebSocket çerçeve uzunluğu, HTTP/2 continuation_len, vb.
  3. Sunucu tarafında veya istemci tarafında ayrıştırılan dosya formatı meta verileri resim boyutları, parça boyutları, yazı tipi tabloları.
  4. Dil düzeyinde dönüşümler PHP/Go/Rust FFI'de işaretli↔işaretsiz dönüşümler, V8 içinde JS Number → int32 kesimleri.
  5. Kimlik doğrulama ve iş mantığı sessizce taşan kupon değeri, fiyat veya bakiye hesaplamaları.

2. Son zamanlardaki gerçek dünya zafiyetleri (2023-2025)

Yıl Bileşen Temel neden Etki
2023 libwebp CVE-2023-4863 Çözülmüş piksel boyutunu hesaplarken 32-bit çarpma taşması Chrome 0-günü tetikledi (iOS'ta BLASTPASS), uzaktan kod yürütme izni verdi.
2024 V8 CVE-2024-0519 JSArray büyütülürken 32-bit'e kesilme, destekleyici depoda OOB yazmaya yol açar Tek bir ziyaret sonrası uzaktan kod yürütme.
2025 Apollo GraphQL Server (yayınlanmamış yamanın) İlk/son sayfalama argümanları için kullanılan 32-bit işaretli tam sayı; negatif değerler büyük pozitiflere sarılır Mantık atlaması ve bellek tükenmesi (DoS).

3. Test stratejisi

3.1 Sınır değeri ipucu sayfası

Bir tam sayı beklenirken ırı işaretli/işaretsiz değerler gönderin:

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

Diğer yararlı formatlar:

  • Hex (0x100), sekizli (0377), bilimsel (1e10), JSON büyük-tamsayı (9999999999999999999).
  • Özel ayrıştırıcılara ulaşmak için çok uzun rakam dizileri (>1kB).

3.2 Burp Intruder şablonu

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

3.3 Fuzzing kütüphaneleri ve çalışma zamanları

  • AFL++/Honggfuzz ile parser etrafında libFuzzer harness (örn., WebP, PNG, protobuf).
  • Fuzzilli JavaScript motorlarının dil bilgisi farkındalığı ile fuzzing'i, V8/JSC tam sayı kesmelerine ulaşmak için.
  • boofuzz uzunluk alanlarına odaklanan ağ protokolü fuzzing'i (WebSocket, HTTP/2).

4. Sömürü desenleri

4.1 Sunucu tarafı kodunda mantık atlatma (PHP örneği)

$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 Görüntü kodlayıcı aracılığıyla yığın taşması (libwebp 0-günü)

WebP kayıpsız kodlayıcı, 32-bit int içinde görüntü genişliğini × yüksekliğini × 4 (RGBA) ile çarpar. 16384 × 16384 boyutlarına sahip bir dosya, çarpımı taşır, kısa bir tampon ayırır ve ardından yığının ötesine ~1GB sıkıştırılmamış veri yazar bu da 116.0.5845.187 öncesindeki her Chromium tabanlı tarayıcıda RCE'ye yol açar.

4.3 Tarayıcı tabanlı XSS/RCE zinciri

  1. V8'deki tamsayı taşması, keyfi okuma/yazma sağlar.
  2. İkinci bir hata ile kum havuzunu aşın veya bir yük bırakmak için yerel API'leri çağırın.
  3. Yük, ardından köken bağlamına kötü niyetli bir betik enjekte eder → saklanan XSS.

5. Savunma yönergeleri

  1. Geniş türler veya kontrol edilen matematik kullanın örneğin, size_t, Rust checked_add, Go math/bits.Add64.
  2. Aralıkları erken doğrulayın: aritmetik işlemden önce iş alanının dışındaki herhangi bir değeri reddedin.
  3. Derleyici sanitizasyonlarını etkinleştirin: -fsanitize=integer, UBSan, Go yarış dedektörü.
  4. CI/CD'de fuzzing benimseyin kapsama geri bildirimini sınır verileri ile birleştirin.
  5. Yaman kalın tarayıcı tamsayı taşması hataları genellikle haftalar içinde silahlandırılır.

Referanslar