SQL-trunkeringssårbarhed findes normalt i MySQL-databaser. Denne sårbarhed blev først beskrevet i CVE-2008-4106, som var relateret til WordPress CMS.
Sådan fungerer SQL-trunkeringsangreb
Dette angreb fungerer på grund af trunkering af brugerinput i databaser ved hjælp af funktionerne 'valg' og 'indsættelse'.
- Når input er angivet i formularfeltet, kontrollerer funktionen 'vælg' for redundans svarende til input i databasen.
- Efter kontrol af redundans kontrollerer funktionen 'indsættelse' længden af inputet, og brugerindgangen afkortes, hvis længden overstiger.
Antag at en udvikler opretter tabellen "brugere" via følgende forespørgsel:
Opret tabelbrugere (user_id INT IKKE NULL AUTO_INCREMENT,
brugernavn VARCHAR (20) IKKE NULL,
adgangskode VARCHAR (40) IKKE NULL,
PRIMÆR NØGLE (user_id)
);
Ved hjælp af dette skema, hvis udvikleren opretter en admin-konto med følgende:
user_name = 'admin'adgangskode = “secret_p4ssw0ord”
Disse legitimationsoplysninger er åbenbart ikke offentlige. Der er kun en administratorkonto i databasen, og hvis en angriber forsøger at registrere en anden konto med 'admin' brugernavnet, vil angriberen mislykkes på grund af databundets redundanskontrol. Angriberen kan stadig omgå denne redundanskontrol for at tilføje en anden admin-konto ved at udnytte SQL Truncation-sårbarheden. Antag, at angriberen registrerer en anden konto med følgende input:
Brugernavn = 'adminxxxxxxxxxxxxxxx tilfældigt'(x er mellemrumene)
&
Adgangskode = ”RandomUser”
Databasen vil tage 'brugernavn' (26 tegn) og kontrollere, om dette allerede eksisterer. Derefter afkortes brugernavn-input, og 'admin' ('admin' med plads) vil blive indsat i databasen, hvilket resulterer i to duplikerede admin-brugere.
Angriberen er derefter i stand til at oprette en 'admin' bruger med sin egen adgangskode. Nu har databasen to admin 'brugernavn' poster, men med forskellige adgangskoder. Angriberen kan logge ind med de nyoprettede legitimationsoplysninger for at få et adminpanel, fordi både brugernavn “admin” og “admin” er ens for databaseniveau. Nu vil vi se på et eksempel på et praktisk angreb.
Prøveangreb
I dette eksempel tager vi et scenarie fra hjemmesiden.org. Overthewire-samfundet leverer wargame-CTF'er, som vi kan øve vores sikkerhedskoncepter på. Scenariet med SQL-afkortning forekommer i natas-spil niveau 26-> 27. Vi kan få adgang til niveauet ved hjælp af følgende:
URL: http: // natas27.natas.laboratorier.overtråd.orgBrugernavn: natas27
Adgangskode: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Dette niveau er tilgængeligt på: https: // overthewire.org / wargames / natas / natas27.html. Du får vist en login-side, der er sårbar over for et SQL-trunkeringsangreb.
Efter inspektion af kildekoden vil du se, at længden af brugernavnet er 64, som vist nedenfor.
En bruger ved navn 'natas28' findes allerede. Vores mål er at oprette en anden bruger ved navn 'natas28' ved hjælp af SQL_truncation-angrebet. Så vi vil indtaste natas28 efterfulgt af 57 mellemrum og et tilfældigt alfabet (i vores tilfælde a), brugernavn og enhver adgangskode. Bogstavet 'a' er ikke synligt på skærmbilledet på grund af brugernavnet på 65 tegn. Efter oprettelsen af brugerkontoen vil du kunne se '-en.''
Hvis databasen indeholder sql_truncation-sårbarhed, skal databasen nu have to 'natas28' brugernavne. Et brugernavn indeholder vores adgangskode. Lad os prøve at indtaste legitimationsoplysningerne på login-siden.
Nu er vi logget ind som 'natas28' bruger.
Afbødning
For at afbøde dette angreb bliver vi nødt til at overveje flere faktorer.
- Vi bør ikke tillade duplikering af kritiske identiteter som brugernavnet. Vi bør gøre disse identiteter til primære nøgler.
- Afkortningsfunktionen skal implementeres for alle felter i frontendformularer såvel som backend-kode, så databaser modtager afkortede input.
- Streng tilstand skal aktiveres på databaseniveau. Uden streng tilstand aktiveret giver databaser kun advarsler i backend, men gemmer stadig de duplikerede data. Med streng tilstand giver databaser fejl i tilfælde af dobbeltarbejde og undgår at gemme data.
Lad os for eksempel kontrollere den strenge tilstand ved hjælp af følgende forespørgsel:
mysql> vælg @@ sql_mode
Vi opretter en database og tabellens brugere.''
mysql> Opret DATABASE-testForespørgsel OK, 1 række berørt (0.02 sek)
mysql> Brug test
Database ændret
mysql> Opret TABEL-brugere (brugernavn VARCHAR (10), adgangskode VARCHAR (10));
Forespørgsel OK, 0 rækker berørt (0.05 sek)
Dernæst opretter vi en adminbruger med legitimationsoplysninger ved hjælp af INSERT-forespørgslen.
mysql> INDSÆT I brugerVÆRDIER ('admin', 'password1');Forespørgsel OK, 1 række berørt (0.01 sek)
Vi kan se 'brugernes' tabeloplysninger ved hjælp af 'vælg * fra brugerne'.
Brugernavnets længde er 10 tegn. Nu prøver vi SQL-trunkeringsangrebet.
Når vi prøver at indtaste følgende:
Brugernavn = 'adminxxxxxa'(x er mellemrumene)
&
Adgangskode = 'pass2'
Vi får en fejl, hvilket betyder, at streng tilstand er helt effektiv.
mysql> INDSÆT I brugerværdier ('admin a', 'pass2')FEJL 1406 (22001): Data er for lange til kolonne 'brugernavn' i række 1
Uden streng tilstand aktiveret udsender databasen advarsler, men indsætter stadig dataene i tabellen.
Konklusion
Angribere kan få adgang til konti med højt privilegium, hvis sårbarheden sql_trunction findes i din applikation. Angriberen kan nemt få oplysninger om et brugernavn og dets databaselængde ved hjælp af de kritiske felter og derefter oprette det samme brugernavn efterfulgt af mellemrum og tilfældigt alfabet efter minimumlængden, hvilket resulterer i oprettelse af flere konti med højt privilegium. Denne sårbarhed er kritisk, men det kan undgås, hvis du tager nogle sikkerhedsforanstaltninger, såsom at aktivere streng tilstand for brugerindgange og gøre det følsomme felt til den primære nøgle i databasen.