Webtechnieken

Webapplicaties bestaan vaak uit drie delen:

Webserver

Een webserver serveert documenten aan webbrowsers via HTTP, een netwerkprotocol.

Een protocol is een afgesproken manier van praten tussen computers.

HTTP

HTTP gebruikt URLs om webpagina's te vinden. Dit is wat je ziet in de adresbalk bovenin een webbrowser.

https://hackintheclass.nl/index.php?show=Workshops&page=1 Protocol Hostnaam of serveradres (HTTP_HOST) Pad naar het document (SCRIPT_NAME) Variabele Inhoud van 'show' variabele Variabele Waarde Opties voor het verzoek (query) (QUERY_STRING) Verzoek aan de server (request) (REQUEST_URI)

Pad naar het document

Voor het pad /admin/news/index.php, kijkt een webserver in zijn mappen op de schijf:
Eerst vindt het admin in / (de topmap, of root), dan vindt het news in admin, dan vindt het index.php in news. /

Wat gebeurt er als..

Je de webpagina https://bitlair.nl/Workshops bezoekt:

HTTP GET-verzoek

GET-formulieren stoppen data in de URL. Die URL is zichtbaar in de adresbalk, opgeslagen in de browserhistorie en kan ook als favoriet/bladwijzer worden opgeslagen.
GET /logon.php?username=hax0r&password=supersecret123 HTTP/1.1
Host: bitlair.nl
Cookie: PHPSESSID=f1a1d9715b3491bbc2d5203c88ac67fb
Referer: https://bitlair.nl/index.php?action=showloginform
User-Agent: Mozilla/5.0 >--snip--< Chrome/69.0.4453.96

>-- end of request --<
            
Address bar with GET request
Het helpt om de Developer Tools (F12 indrukken) te gebruiken, ga dan naar de netwerk tab om te kijken naar het netwerkverkeer.

HTTP POST-verzoek

POST-formulieren stoppen data onder het verzoek zelf, niet ergens anders zichtbaar.
POST /logon.php HTTP/1.1
Host: bitlair.nl
Cookie: PHPSESSID=f1a1d9715b3491bbc2d5203c88ac67fb
Referer: https://bitlair.nl/index.php?action=showloginform
User-Agent: Mozilla/5.0 >--snip--< Chrome/69.0.4453.96
Content-Type: application/x-www-form-urlencoded
Content-Length: 38

username=hax0r&password=supersecret123
>-- end of request --<
            
Het helpt om de Developer Tools (F12 indrukken) te gebruiken, ga dan naar de netwerk tab om te kijken naar het netwerkverkeer.

Meer informatie over HTTP

Als je meer wilt weten over webservers en het HTTP-protocol, ga dan naar

HTTP: Veelgemaakte fouten

Fout: Geen versleuteling gebruiken
Websites moeten altijd HTTPS (beveiligde HTTP) gebruiken. Als ze geen encryptie gebruiken:
Fout: Informatie lekken

Speel HTTP uitdagingen

Deze worden moeilijker naarmate je hogere levels haalt. Zoek naar versienummers, indexes, backupbestanden of subversion en git werkmappen. Als je vastloopt is dat geen probleem, gewoon verder gaan met deze handleiding en kom hier later op terug.

HTML

Alle layout en inhoud van iedere webpagina wordt aangestuurd door HTML

Ga eens naar een willekeurige webpagina, klik met rechts op de achtergrond en klik dan op "Paginabron bekijken".
View source right mouse click
Dit is ook beschikbaar door Ctrl in te drukken en tegelijk op U te drukken (Ctrl-U)

Simpele HTML

HyperText Markup Language: opmaaktaal met 'tags': <open tag>inhoud</close tag>
    <!doctype html>
    <html>
    <head>
      <title>Voorbeeld HTML website</title>
    </head>
    <body>
      <h1>Hoogste niveau kop</h1>
      <ul>
        <li><a href="http://www.google.nl">Google</a></li>
        <li><a href="https://bitlair.nl>Bitlair</a></li>
      </ul>
    </body>
    </html>
HTML tutorial at w3schools

HTML-formulieren

    <form method="POST">
      <table>
        <tr>
          <td>Username:</td>
          <td><input type="text" name="username"></td>
        </tr>
        <tr>
          <td>Password:</td>
          <td><input type="password" name="password"></td>
        </tr>
      </table>
      <input type="submit" value="Log me in">
    </form>
            
Probeer method eens aan te passen van POST naar GET op de Speel met HTML-formulieren dia, klik dan op submit en kijk naar wat er gebeurt
HTML forms tutorial at w3schools

Meer informatie over HTML

Als je meer wilt weten over HTML, ga dan naar

Speel met HTML-formulieren

HTML code - Verander mij
HTTP-informatie

HTML: Veelgemaakte fouten

Fout: Informatie lekken
Fout: Niet encoden van gebruikersinvoer

Speel HTML uitdagingen

Voeg een plaatje in een website in een uitdaging:

Javascript

Javascript is een taal voor programmacode die wordt uitgevoerd in de webbrowser

Javascript: voorbeeld

Dit script vindt het gebruikersnaam invoerveld (input) en stopt dat in de variabele usernameInput.
Het controleert daarna of wat de gebruiker heeft getypt hetzelfde is als wat de gebruiker typte in het wachtwoordveld
    <input type="text" id="username">
    <script type="text/javascript">
        // Dit vindt het HTML invoerveld (input) hierboven en stopt de inhoud in variabele usernameInput
        var usernameInput = document.getElementById("username");

        // Vergelijk wat de gebruiker heeft ingevuld bij username met het wachtwoord invoerveld.
        if (usernameInput.value == passwordInput.value) {
            // Gebruikersnaam en wachtwoord zijn hetzelfde
            ...
        }
    </script>
            

Meer informatie over javascript.

Als je meer wilt weten over Javascript, ga dan naar

Javascript: Veelgemaakte fouten

Omdat javascript in de web browser draait, kunnen web browsers javascript omzeilen of manipuleren. Het gevolg is dat deze fouten veel voorkomen:
Fout: invoer niet controleren
Javascript draait op de client. Gebruikersinvoer uit formulieren controleren in javascript is niet genoeg om de server te beschermen. Alle invoer moet altijd worden gecontroleerd op de server.
Fout: Wachtwoord controleren in JS
Javascript draait op de client. Iedere controle kan worden omzeild of bekeken. Controles als wachtwoordcontroles, toestemmingcontroles (authenticatie, autorisatie) .
Fout: Invoer niet encoden, JS toestaan
Dit is eigenlijk een HTML-fout: Gebruikersinvoer niet encoden
Fout: JS inladen van andere sites
Het inladen van javascript van een server die wordt beheerd door iemand anders (zoals googleapis.com, jquery.org, github.io) is niet verstandig.
Fout: JS niet beperken in frames
Frames gebruiken met inhoud van extern (zoals advertenties) zonder toegang te beperken tot informatie op de pagina (sandboxing), kan de website laten kapen.

Speel Javascript uitdagingen

Injecteer javascript in een website.

Speel simpele Web-uitdagingen

Je kan nu deze uitdagingen doen:

Webapplicatie

Javascript kan programmacode uitvoeren in de webbrowser. Maar de webserver kan ook programmacode uitvoeren. Andere programmeertalen kunnen ook op de server worden uitgevoerd, zoals Python, Java, ASP.NET en zelfs Javascript.

Sessies

Sessiefouten

Fout: Voorspelbare sessie-ID
Als de sessiecookie voor gebruiker ID 1 altijd iets is als sha1(user1) of md5(1) of sessies opeenvolgend als sessionid=10, sessionid=11 worden uitgegeven, dan is het voorspelbaar.

Speel sessie-uitdagingen

Steel de cookie van admin met Cross Site Scripting, log daarna in met de cookie van admin:

PHP

PHP is een programmeertaal om HTML-pagina's op te bouwen. Andere programmeertalen kunnen ook op de server worden uitgevoerd, zoals Python, Java, ASP.NET en zelfs Javascript.

Webapplicaties: Veelgemaakte fouten

Fout: Standaardwachtwoorden gebruiken

Veel applicaties en apparaten worden geleverd met standaardwachtwoorden. Dit is niet slim. Het is beter om de gebruiker een wachtwoord te laten kiezen bij eerste gebruik.

Fout: Zwakke of gelekte wachtwoorden toestaan

Fout: Loginpogingen niet beperken

Ons lab zal geen brute force-uitdagingen hebben, maar zal wel uitdagingen hebben waar de meest gebruikte wachtwoorden in voorkomen, zie standaardgebruikersnamen/-wachtwoorden

Fout: Webbrowser vertrouwen met geheimen

Sommige webapplicaties gebruiken geen sessies, maar slaan gebruikersnaam en wachtwoord op in de cookies

Fout: Voorspelbare interacties

Fout: Componenten niet updaten

Fout: Zwakke toestemmingencontrole

Speel webapplicatie-uitdagingen

Probeer van de guest-gebruiker een beheerder (admin) te maken met Cross Site Request Forgery.

Data

Data wordt opgeslagen:

Database

Een dataopslag die data aan andere applicaties serveert. Er zijn veel types, maar de meest voorkomende zijn:

Data opvragen

De meeste webapplicaties gebruiken SQL-databases als dataopslag

SQL commentaar - MySQL

            SELECT password     # Wachtwoordveld
            FROM users          # Gebruikerstabel
            WHERE id=1 OR id=2  # Gebruiker ID 1 of 2
            ORDER BY id ASC     # Sorteer op id, oplopend
            LIMIT 2             # Laat maar 2 records zien
            ;                   # Einde van de query            

SQL data wordt opgeslagen in tabellen

Tabel "users":

userid username password email
1 synnack Supersecret123! synnack@example.com
2 admin Adm1ns3cr3t! admin@example.com


* PS: Het is fout om wachtwoorden onversleuteld op te slaan, gebruik een wachtwoordgebaseerde sleutelafleidingsfunctie als PBKDF2 of bcrypt.

Speel met SQL

SQL: Veelgemaakte fouten

SQL-databases hebben diverse potentiële kwetsbaarheden
Enumeratie
Als data wordt opgevraagd als /page.php?id=1, kunnen we dan ook pagina 2, 3, 4 en 5 opvragen?

id page
1 AMERSFOORT Today we witnessed a...
2 AMSTERDAM It was an historic even...
3 Unpublished - Top secret files leaked...

SQL-injectie
Probeer SQL-injectie
Veel voorkomende patronen (probeer eens bij Speel met SQL): Bestudeer de Pentestmonkey cheatsheet voor inspiratie over wat je kunt typen achter UNION SELECT, zoals het vinden van tabelnamen en veldnamen in een bepaalde tabel.

Speel SQL-injectie uitdagingen 1 en 2
Open de Pentestmonkey cheatsheet en The play around slide in nieuwe tabs en open ook de levels in een nieuwe tab.
Speel SQL-injectie uitdaging 3
Voor dit level moet je ook dingen weten over HTTP-verzoeken, zie het web server hoofdstuk

Bestandssysteem

Bestanden worden soms ingevoegd uit het bestandssysteem. Dit ziet er meestal uit als ?page=home.html of download.php?file=pentest-report.pdf in de adresbalk

Invoegen van bestandssysteem: veelgemaakte fouten

Pad aflopen
download.php?file=pentest-report.pdf
Speel pad aflopen-uitdagingen 1 en 2
Speel pad aflopen-uitdaging 3

Speel combineer vaardigheden-uitdagingen

Hack in the Class

Web technologies

Click here to start.