Gå til hovedsiden

4 eksempler på SQL-injeksjoner

Vi gir deg noen eksempler på manuelle SQL-injeksjoner mot web applikasjoner, samt et eksempel på angrep mot en REST api. I tillegg vil du få en liste over verktøy for automatiserte SQL-injeksjoner.

SQL-injeksjoner eksempler
SQL-injeksjoner eksempler

SQL-injeksjonsangrep består av innsetting eller “injeksjon” av SQL-spørring via inngangsdataene fra klienten til applikasjonen. En vellykket SQL-injeksjonsutnyttelse kan lese sensitive data fra databasen, endre databasedata, utføre administrasjonsoperasjoner på databasen, gjenopprette innholdet i en gitt fil som er tilstede på DBMS-filen systemet, og i noen tilfeller gi kommandoer til operativsystemet.

Jeg har installert en virtuell lab på min PC med Oracle VM VirtualBox som kjører Kali Linux og OWASP BWA.

1. Å unngå login-skjermen

Jeg fylte inn () i feltet brukernavn i Mutillidae II fra OWASP BWA. 

Mutillidae II fra OWASP BWA

Ved dette skjer det et exception og applikasjonen viser hele error informasjonen som type av database (MySQL) og query. Dette er dårlig design prinsipp. Databasen burde ikke tillate direkte kommunikasjon med brukeren. 

Error Message Eksempel

La oss prøve å skrive inn ‘ or 1=1– og se om vi kan unngå authentication. Legg merke til at for MySQL trenger du å ha ‘ or 1=1–, etterfulgt av mellomrom eller en annen (). Ellers vil du få opp en feilmelding. ‘ or 1=1– –. Se Figur 3:

Eksempel på brukernavn

Vi har blitt godkjent og logget inn som administrator:

OWASP innlogging

Les mer: SQL-injeksjoner: Hvorfor er det hackernes favorittvalg?

2. Tekstområdet til skjema på blogg

Igjen så skrev jeg inn () i tekstområdet til bloggskjemaet. Se Figur 5:

Eksempel på tekstområde i skjema

Applikasjonen spytter ut mye brukbar informasjon i error beskjeden. Se Figur 6:

Informasjon i error beskjed

Ved å bruke ‘INSERT INTO’ query som viste seg i error beskjeden, i tillegg til informasjonen som kom opp på ‘Current Blog Entries’ tabellen på Figur 5, fylte jeg inn ting i database. Se Figur 7 og Figur 8.

Eksempel på endring i error beskjed

Eksempel på endring i error beskjed

3. Manipulerer URL’en for å få tilgang

På startskjermen til Peruggia (Figur 9) kan vi prøve å få tilgang (unauthenticated) til kommentar seksjonen.

Startskjermen til Peruggia

Ved å klikke på kommentaren på dette bildet får vi opp dette:

Kommentar

Vi får da opp et ‘pic_id’ parameter i sidens URL som vi vil forsøke å manipulere.

Om vi forandrer den til en ikke eksisterende ID, som for eksempel 0123456789, viser det ett tomt bilde men ikke en error melding. Se Figur 11.

Manipulasjon

La oss så prøve å skrive inn 0123456789 OR 1=1  i URL’en som pic_id parameteren. Se Figur 12.

Pic_id parameter manipulasjon

Med 0123456789 OR 1=1 i ‘pic_id’, viser applikasjonen bildet av ID 1 og ingen error melding.

La oss nå forsøke å få informasjon fra database.

Vi skriver inn i URL’en 0123456789 UNION SELECT 1,2,3, og forsøker å gjette nummerene i parameterene i den underliggende SQL query’en. Den kommer fortsatt tilbake med tomt bilde (Se Figur 13):

Tomt bilde eksempel

Jeg legger til et mer argument med 0123456789 UNION SELECT 1,2,3,4: Se Figur 14:

Ved dette steget vet vi at det underliggende query har fire argumenter, og at det fjerde argumentet korresponderer med ‘Upload By’ verdi (Se Figur 14).

Vi kan bruke dette query’et til å trekke ut all den informasjon vi vil ha. La oss prøve å få tak I passordet til ‘admin’.

Vi vil bruke 0123456789 UNION SELECT 1,2,username,password FROM users WHERE username=’admin’  for å få opp passordet for ‘admin’ kontoen etter ‘Uploaded By:’. Se Figur 15:

Hash admin passord på add comment

Vi kunne så klart ha brukt det samme feltet for å vise informasjonen vi har allerede sett så langt, slik som passordet for root MySQL kontoen, database system versjonen, eller hvilket som helst av dataene som tilhører andre tabeller.

5. SQL-injeksjon via REST api

Ved å bruke Postman, la jeg inn ‘ or 1=1 — i forespørselen som lar deg se alle biler med sylinder V12. Og jeg får se alle biler, ikke bare de med V12 sylinder. Se Figur 16:

SQL-injeksjon via REST api

Du kan prøve å unngå authentication på en REST api som authenticates via token. Her er et eksempel:

GET /CarsByCylinders?Cylinders=V12?format=json&token=fdedb7fa-6ea7-d5dfe31af1ed  HTTP/1.1

Erstatt requesten ovenfor med og si hva skjer:

GET /CarsByCylinders?Cylinders=V12?format=json&token=invalid_token’+or+’1’=’1  HTTP/1.1

6. Verktøy for SQL-injeksjoner

Det er mange verktøy for testing og utføring av SQL-injeksjoner, de fleste av dem er open source. Dette er noen:

  • SoapUI
  • Burp Suite
  • SQLmap
  • OWASP ZAP
  • SQLninja

7. Konklusjon

Dette var noe eksempler om hvordan vi kan utføre manuell SQL-injeksjon. I mitt neste innlegg skal jeg utforske hvordan man kan forebygge SQL-injeksjoner med defensive løsninger. Jeg skal også demonstrere testing av SQL-injeksjoner ved help av SQLmap og OWASP ZAP.

Guide: Slik utfører du sikkerhetstesting gjennom utviklingsløpet

Vil du lære mer om sikkerhet og sikkerhetstesting? I denne guiden gjennomgår sikkerhetsekspert Even Lysen hvordan du kan utføre sikkerhetstesting gjennom hele utviklingsløpet.

Last ned guiden