Workshop deel 2

In dit deel van de workshop wordt een slecht beveiligde website gebruikt om een database aan te vallen aan de hand van SQL-injection (sqli). Dit om het belang van een goede database beveiliging te demonstreren.

Voorbereiding

Voordat dit deel van de workshop kan uitgevoerd worden moet een docker container aangemaakt worden die onze slecht beveiligde applicatie draait. Dit is een simpele methode om vooraf aangemaakte applicaties correct aan te maken.

  1. Ga naar de terminal.
    terminal1
    terminal2
    terminal3

  1. Voer volgende commando’s uit.

    • sudo apt-get update -y

    • sudo apt install curl

    • curl -fsSL https://get.docker.com -o get-docker.sh

    • sudo sh get-docker.sh

    • sudo docker run --rm -it -p 80:80 vulnerables/web-dvwa

Als de terminal vraagt om een wachtwoord gebruik dan Azerty123.
  1. Je docker container draait nu en is te bereiken op localhost in elke browser.

SQL-injection

SQL injection is een aanvalsmethode waarbij een extra payload wordt toegevoegd aan de query die verstuurd wordt vanuit de applicatie of de website. Deze extra payload kan gebruikt worden om extra queries toe te voegen of om database commando’s uit te voeren. De aanval kan gebruikt worden om data uit te lezen waar de eindgebruiker normaal gezien geen toegang tot heeft (wachtwoorden, gebruikers,…​) of om het gebruik van de database te verstoren (tabellen/databases verwijderen, rijen toevoegen,…​)

De enige manier om de website hier tegen te beveiligen is door de input correct te filteren en ervoor te zorgen dat de user input nooit direct uitvoerbaar is.

Damn vulnerable web application (DVWA)

De applicatie die gebruikt wordt voor het uitvoeren van de SQL-injections is damn vulnerable web application (DVWA). Dit is een vrij beschikbare website waar beginnende of geavanceerde security professionals aanvalsmethodes en tools op kunnen uitvoeren zonder enige wetten te overtreden. Deze applicatie draait al op de hosts die ter beschikking zijn gesteld.

  1. Om de applicatie op te starten surf naar http://localhost/login.php

  2. Standaard staan de login credentials ingesteld op admin/password
    login

  3. Na de initiƫle login moet de database opnieuw aangemaakt worden. Ga hiervoor naar Setup DVWA en klik op de knop Create/Reset Database
    initialDBSetup

Normaal zal de pagina automatisch herladen en moet je opnieuw inloggen. Als dit niet gebeurd, surf dan terug naar localhost.
Als de database later moet gereset worden kan de gebruiker altijd naar Setup / Reset DB.
  1. Hierna moet de moeilijkheidsgraad ingesteld worden. Ga hiervoor naar DVWA security, zet de dropdown naar low en klik op submit

SQL-injection (SQLI)

  1. Een eerste verkennende aanval is een foute query in te geven. Een gemakkelijk voorbeeld hiervan is ' , dit karakter wordt vaak gebruikt om te testen op SQLi vulnerabilities. Dit zal als alles goed verloopt een error veroorzaken waardoor duidelijk is dat de database gevoelig is aan SQLi.
    error

  2. Nu dat het duidelijk is dat er een vulnerability is, moet er natuurlijk nog gevonden worden hoe deze uitgebuit moet worden. Er moet een manier worden gevonden waarop een extra payload kan meegegeven worden zonder dat deze een error veroorzaakt. Er moet dus uit de oorspronkelijke query ontsnapt worden en vermeden worden dat de rest van de query na de payload wordt uitgevoerd. Dit gebeurd door de rest van de query in commentaar te plaatsen. Zoek online in de mysql documentatie hoe iets in commentaar kan geplaatst worden en plaats dit op het einde van volgende query 1' OR 1=1.

de query 1' or 1=1 zal een statement genereren die altijd waar is en dus elke record in de tabel toont.

alwaysTrue

  1. Probeer aan de hand van volgende cheat sheet https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md de juiste query te vinden om uit te zoeken hoeveel kolommen de huidige database heeft.

In de gevonden query zal --+ moeten veranderd worden door het eerder gevonden commentaar symbool
  1. Nadat gevonden is hoe er uit de SQL query kan ontsnapt worden kan er begonnen worden met data te verzamelen over de database en het achterliggende systeem. Een belangerijker stap hierbij is het fingerprinten van de database engine. Hiermee kan gevonden worden welk database systeem gebruikt wordt en kunnen specifieke zwakheden gebruikt worden. Voer volgende query uit en zoek de versie 1’union select null, @@version # of 1’union select null, version() #
    De eerste query zal een globale variabele opvragen en de tweede query zal een functie aanroepen die de globale variabele opvraagt

  2. Probeer nu aan de hand van een gelijkaardig commando de hostname en dan de poort waarop te achterhalen. Doe dit door na de @@ in de query de variabele naam waarin mysql deze data opslaat te plaatsen

  3. Probeer nu aan de hand van functies de gebruiker te vinden en de naam van de database. Een handige lijst van functies kan gevonden worden op https://www.w3schools.com/mysql/mysql_ref_functions.asp

  4. Aan de hand van volgende query kan de information_schema worden opgehaald. %' and 1=0 union select null, table_name from information_schema.tables #

De information_schema is een database waarin informatie staat over alle andere databases in de MYSQL server.
  1. Aan de hand van volgende query kan 1' and 1=0 union select null, concat(table_name,0x0a,column_name) from information_schema.columns where table_name = 'guestbook' # De kolommen laten ophalen van guestbook tabel.

  2. Volgende query laat ons toe om elke record in de guestbook tabel te bekijken 1' and 1=0 union select null, concat(comment_id,0x0a,comment,0x0a,name) from guestbook # De inhoud van comments laten bekijken

  3. Voer nu de vorige twee stappen uit op de users tabel. De queries zullen moeten aangepast worden aan de tabelnaam en kolomnamen

Het resultaat van deze query zal de login en het wachtwoord van elke database gebruiker bevatten. De wachtwoorden zijn echter onherkenbaar door een hash. Deze hash kan gekraakt worden aan de hand van decryption tools.
  1. Probeer aan de hand van een variabele te achterhalen op welk besturingssysteem deze database staat.

De meeste besturingssystemen hebben een specifieke folder structuur aan welke deze te herkennen zijn.