hacktricks/pentesting-web/integer-overflow.md
2024-02-11 01:46:25 +00:00

5.1 KiB

Przepełnienie liczby całkowitej

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

{% tabs %} {% tab title="Rust" %}

fn main() {

let mut quantity = 2147483647;

let (mul_result, _) = i32::overflowing_mul(32767, quantity);
let (add_result, _) = i32::overflowing_add(1, quantity);

println!("{}", mul_result);
println!("{}", add_result);
}

{% tab title="C" %}

Przepełnienie liczby całkowitej

Przepełnienie liczby całkowitej występuje, gdy wartość liczby przekracza maksymalną wartość, jaką może przechować dany typ liczby całkowitej. W przypadku przepełnienia, wartość liczby jest "zawijana" do minimalnej wartości dla danego typu liczby całkowitej.

Przepełnienie liczby całkowitej może prowadzić do poważnych problemów w aplikacjach internetowych. Przykładowo, jeśli aplikacja używa zmiennej całkowitej do przechowywania liczby produktów w koszyku, a użytkownik próbuje dodać więcej produktów niż jest możliwe do przechowania w zmiennej, może dojść do przepełnienia liczby całkowitej. W rezultacie, aplikacja może działać nieprawidłowo lub nawet ulec awarii.

Aby wykorzystać przepełnienie liczby całkowitej w celach hakerskich, atakujący może próbować wprowadzić wartość, która przekroczy maksymalną wartość dla danego typu liczby całkowitej. Może to prowadzić do nieprawidłowego działania aplikacji lub nawet do wykonania nieautoryzowanych operacji.

Przepełnienie liczby całkowitej jest często wykorzystywane w atakach na aplikacje internetowe, takie jak ataki na bufor, ataki na formatowanie łańcucha znaków i ataki na przekazanie parametrów. Aby zabezpieczyć aplikację przed tym rodzajem ataków, ważne jest, aby odpowiednio sprawdzać i walidować dane wejściowe oraz używać odpowiednich typów danych do przechowywania liczb całkowitych.

Przykład

Poniżej przedstawiono przykład kodu w języku C, który demonstruje problem przepełnienia liczby całkowitej:

#include <stdio.h>

int main() {
    int a = 2147483647; // maksymalna wartość dla typu int
    a = a + 1; // przepełnienie liczby całkowitej
    printf("%d\n", a);
    return 0;
}

W powyższym przykładzie, zmienna a jest inicjalizowana maksymalną wartością dla typu int. Następnie, wartość zmiennej a jest zwiększana o 1, co powoduje przepełnienie liczby całkowitej. W rezultacie, wartość zmiennej a zostaje "zawinięta" do minimalnej wartości dla typu int, czyli -2147483648.

#include <stdio.h>
#include <limits.h>

int main() {
int a = INT_MAX;
int b = 0;
int c = 0;

b = a * 100;
c = a + 1;

printf("%d\n", INT_MAX);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}

{% endtab %} {% endtabs %}

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!