Command Injection — High
De ontwikkelaar heeft ons wéér door. Nu worden vrijwel alle injectie-tekens systematisch gefilterd!
1. Predict (Voorspel)
De code van de beveiliging ziet er als volgt uit. Bekijk de lijst met verboden tekens (aan de linkerkant van de pijltjes in de array).
Vraag: Zie je een cruciaal foutje dat de ontwikkelaar hier heeft gemaakt bij het instellen van de filters?
Tip
Kijk heel nauwkeurig naar het filter van de enkele pipe (|). Wat staat daar nét achter?
Antwoord
Er staat '| ' => ''. Let op de extra spatie na het pipe-teken! Dit betekent dat de webserver specifiek op zoek is naar een pipe-symbool waarna een spatie volgt. Als hij dat tegenkomt, haalt hij het weg.
Maar... wat als we een pipe gebruiken zónder spatie? Dan wordt het niet herkend door dit rammelende filter!
2. Run & Investigate
- Start
DVWAen ga naar de challengeCommand Injection. Zorg dat jeDVWA Securityop high hebt staan. (Vergeten hoe dit moet? Cheatsheet). - Probeer de injection van het Medium-level (
127.0.0.1 | ls). Deze wordt nu afgevangen door het filter! - Jouw taak is om uit te zoeken hoe je het falende filter (de typefout) kunt misbruiken.
3. Modify & Make
Pas je commando aan zodat je de slordige typefout in de back-end code omzeilt.
Tip
Haal de spatie weg die direct nà het pipe-teken komt in jouw payload.
Antwoord
Vul in: 127.0.0.1|ls (zonder spatie achter de pipe). Doordat de exact match in het filter niet meer klopt, laat de firewall het commando er gewoon doorheen glippen!
Het resultaat van een succesvolle poging zie je hieronder:
4. ✓ Wat moest je zien?
- Met
127.0.0.1|ls(zonder spatie!) glipt je payload langs het filter en zie je alsnog de map-inhoud verschijnen. - Met
127.0.0.1 | ls(mét spatie) krijg je niets bruikbaars — dat patroon is wél geblokkeerd. - Het verschil tussen die twee payloads is letterlijk één spatie: dat is precies de slordigheid van de blacklist.
Werkt 127.0.0.1|ls niet? Plak hem opnieuw zonder enige spatie tussen IP, pipe en commando — de browser plakt soms ongemerkt een spatie aan het einde.
5. Er gaat iets mis...
Je hack is gelukt op High! Maar waarom lossen de ontwikkelaars dit niet gewoon op door álle speciale karakters er uit te slopen in het Impossible-level?
Dat klinkt logisch, maar de praktijk is weerbarstig. Dit noemen we de "Blacklisting Fallacy". Telkens als je een nieuw trucje leert en toevoegt aan de verboden lijst (blacklist), verzinnen hackers (of de gigantische Linux/Windows community) wel weer een obscure manier om een commando uit te voeren met leestekens die je nóg niet geblokkeerd hebt. De énige echte oplossing is Whitelisting: niet op zoek gaan naar slechte tekens, maar enkel en alleen letters en cijfers toestaan die exact passen in het profiel van een IP-adres.
Oefen met de terminal
In deze terminal worden bijna alle operators gefilterd. Maar let goed op: de programmeur filtert "| " (pipe + spatie), niet "|" (pipe zonder spatie). Kun je dit misbruiken?