SQL Injection Tutorial: Sådan lærer du med eksempel
Hvad er en SQL-injektion?
SQL Injection er et angreb, der forgifter dynamiske SQL-sætninger for at kommentere visse dele af sætningen eller tilføje en betingelse, der altid vil være sand. Det udnytter designfejlene i dårligt designede webapplikationer til at udnytte SQL-sætninger til at udføre ondsindet SQL-kode.
Data er en af de mest vitale komponenter i informationssystemer. Databasedrevne webapplikationer bruges af organisationen til at få data fra kunder. SQL er akronymet for Structured Query Language. Det bruges til at hente og manipulere data i databasen.
Hvordan virker SQL Injection Attack?
De typer angreb, der kan udføres ved hjælp af SQL-injektion, varierer afhængigt af typen af databasemotor. Angrebet virker på dynamiske SQL-sætninger. En dynamisk sætning er en sætning, der genereres under kørsel ved hjælp af parameteradgangskode fra en webformular eller URI-forespørgselsstreng.
SQL-injektionseksempel
Lad os overveje en simpel webapplikation med en loginformular. Koden til HTML-formularen er vist nedenfor.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
HER,
- Ovenstående formular accepterer e-mailadressen, og adgangskoden sender dem derefter til en PHP fil med navnet index.php.
- Den har mulighed for at gemme login-sessionen i en cookie. Vi har udledt dette fra afkrydsningsfeltet husk_mig. Den bruger postmetoden til at indsende data. Det betyder, at værdierne ikke vises i URL'en.
Lad os antage, at erklæringen i backend til kontrol af bruger-id er som følger
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
HER,
- Ovenstående erklæring bruger værdierne af
$_POST[]
array direkte uden at rense dem. - Adgangskoden er krypteret ved hjælp af MD5-algoritmen.
Vi vil illustrere SQL-injektionsangreb ved hjælp af sqlfiddle. Åbn URL'en http://sqlfiddle.com/ i din webbrowser. Du får følgende vindue.
Bemærk: du bliver nødt til at skrive SQL-sætningerne
Trin 1) Indtast denne kode i venstre rude
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Trin 2) Klik på Byg skema
Trin 3) Indtast denne kode i højre rude
select * from users;
Trin 4) Klik på Kør SQL. Du vil se følgende resultat
Antag brugerforsyninger admin@admin.sys og 1234 som adgangskode. Den erklæring, der skal udføres mod databasen, ville være
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Ovenstående kode kan udnyttes ved at kommentere adgangskodedelen og tilføje en betingelse, der altid vil være sand. Lad os antage, at en angriber giver følgende input i e-mail-adressefeltet.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx for adgangskoden.
Den genererede dynamiske erklæring vil være som følger.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
HER,
- xxx@xxx.xxx slutter med et enkelt citat, som fuldender strengcitatet
OR 1 = 1
LIMIT 1 er en betingelse, der altid vil være sand og begrænser de returnerede resultater til kun én post.- — ' AND ... er en SQL-kommentar, der eliminerer adgangskodedelen.
Kopier ovenstående SQL-sætning og indsæt den SQL FiddleKør SQL-tekstboks som vist nedenfor
Hackingaktivitet: SQL Inject a Web Application
Vi har en simpel webapplikation på http://www.techpanda.org/ som kun er sårbar over for SQL Injection-angreb til demonstrationsformål. HTML-formularkoden ovenfor er taget fra login-siden. Applikationen giver grundlæggende sikkerhed såsom at rense e-mail-feltet. Det betyder, at vores ovenstående kode ikke kan bruges til at omgå login.
For at komme uden om det kan vi i stedet udnytte adgangskodefeltet. Diagrammet nedenfor viser de trin, du skal følge
Lad os antage, at en angriber giver følgende input
- Trin 1: Indtast xxx@xxx.xxx som e-mailadresse
- Trin 2: Indtast xxx') ELLER 1 = 1 — ]
- Klik på knappen Send
- Du vil blive dirigeret til dashboardet
Den genererede SQL-sætning vil være som følger
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Diagrammet nedenfor illustrerer, at erklæringen er blevet genereret.
HER,
- Udsagnet forudsætter intelligent, at md5-kryptering er brugt
- Fuldfører enkelt citat og afsluttende parentes
- Føjer en betingelse til udsagnet, som altid vil være sand
Generelt forsøger et vellykket SQL Injection-angreb en række forskellige teknikker, såsom dem, der er vist ovenfor, for at udføre et vellykket angreb.
Andre SQL-injektionsangrebstyper
SQL-injektioner kan gøre mere skade end blot ved at videregive login-algoritmerne. Nogle af angrebene omfatter
- Sletning af data
- Opdaterer data
- Indsættelse af data
- Udførelse af kommandoer på serveren, der kan downloade og installere ondsindede programmer såsom trojanske heste
- Eksport af værdifulde data såsom kreditkortoplysninger, e-mail og adgangskoder til angriberens fjernserver
- Få brugerloginoplysninger osv
- SQL-injektion baseret på cookies
- Fejlbaseret SQL-injektion
- Blind SQL-injektion
Ovenstående liste er ikke udtømmende; det giver dig bare en idé om, hvad SQL Injection
Automatiseringsværktøjer til SQL-injektion
I ovenstående eksempel brugte vi manuelle angrebsteknikker baseret på vores store viden om SQL. Der er automatiserede værktøjer, der kan hjælpe dig med at udføre angrebene mere effektivt og inden for den kortest mulige tid. Disse værktøjer omfatter
- SQLMap – http://sqlmap.org/
- JSQL-injektion – https://tools.kali.org/vulnerability-analysis/jsql
Sådan forebygger du SQL-injektionsangreb
En organisation kan vedtage følgende politik for at beskytte sig selv mod SQL Injection-angreb.
- Brugerinput bør aldrig stole på – Det skal altid renses, før det bruges i dynamiske SQL-sætninger.
- Lagrede procedurer – disse kan indkapsle SQL-sætningerne og behandle alt input som parametre.
- Udarbejdede udtalelser – forberedte sætninger til at fungere ved først at oprette SQL-sætningen og derefter behandle alle indsendte brugerdata som parametre. Dette har ingen indflydelse på syntaksen af SQL-sætningen.
- Regulære udtryk – disse kan bruges til at opdage potentiel skadelig kode og fjerne den, før SQL-sætningerne udføres.
- Brugeradgangsrettigheder til databaseforbindelse – kun nødvendige adgangsrettigheder bør gives til konti, der er brugt til oprette forbindelse til databasen. Dette kan hjælpe med at reducere, hvad SQL-sætningerne kan udføre på serveren.
- Fejlmeddelelser – disse bør ikke afsløre følsomme oplysninger, og hvor der præcist opstod en fejl. Simple brugerdefinerede fejlmeddelelser såsom "Beklager, vi oplever tekniske fejl. Det tekniske team er blevet kontaktet. Prøv venligst igen senere" kan bruges i stedet for at vise de SQL-sætninger, der forårsagede fejlen.
Hackingaktivitet: Brug Havij til SQL Injection
I dette praktiske scenarie vil vi bruge Havij Advanced SQL Injection-programmet til at scanne et websted for sårbarheder.
Bemærk: din antivirusprogram kan markere det på grund af dets natur. Du bør tilføje den til undtagelseslisten eller sætte din antivirussoftware på pause.
Billedet nedenfor viser hovedvinduet for Havij
Ovenstående værktøj kan bruges til at vurdere sårbarheden af et websted/en applikation.
Resumé
- SQL Injection er en angrebstype, der udnytter dårlige SQL-sætninger
- SQL-injektion kan bruges til at omgå login-algoritmer, hente, indsætte og opdatere og slette data.
- SQL-injektionsværktøjer inkluderer SQLMap, SQLPing og SQLSmack osv.
- En god sikkerhedspolitik, når du skriver SQL-sætning, kan hjælpe med at reducere SQL-injektionsangreb.