Command Injection — Impossible
Hoe voorkom je dat een hacker ooit nog een systeem-commando door je webapplicatie heen smokkelt?
1. Predict (Voorspel)
De ontwikkelaar stapt compleet af van het filteren van "gevaarlijke" tekens (Blacklisting) en kiest voor het tegenovergestelde: Whitelisting.
$target = stripslashes( $target );
// Splits het IP adres op in 4 losse stukken
$octet = explode( ".", $target );
// Controleer of elk stuk daadwerkelijk een getal is
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) )
&& ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) )
&& ( sizeof( $octet ) == 4 ) ) {
$target = $octet[0] . "." . $octet[1] . "." . $octet[2] . "." . $octet[3];
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
Vraag: Waarom is het onmogelijk om hier nog een ; cat /etc/passwd of | whoami achter te plakken?
Antwoord
De server splitst de invoer op de punten (.) en controleert of elk van de vier stukken een puur getal is (is_numeric). De string 127.0.0.1; cat /etc/passwd zou worden opgesplitst in ["127", "0", "0", "1; cat /etc/passwd"]. Het vierde deel (1; cat /etc/passwd) is géén getal, dus de hele operatie wordt direct afgebroken!
Bovendien bouwt de server het IP-adres zélf opnieuw op uit de vier losse getallen, waardoor eventuele rommel nooit in het uiteindelijke commando terechtkomt.
2. Run & Investigate
Start het lab.
Probeer al je eerdere bypasses. Geen enkele zal nog werken.
3. ✓ Wat moest je zien?
- Bij een geldig IP (zoals
127.0.0.1) zie je nog steeds de normale ping-output verschijnen. - Bij élke payload met
;,&&,|of andere injectie krijg je alléén de melding "ERROR: You have entered an invalid IP." — geen ping, geen extra commando, geen output. - In de broncode (knop Bekijk broncode) zie je
is_numericenexplode(".")terugkomen — dat is whitelisting in actie.
Krijg je toch output van je injectie? Controleer dat het level rechtsboven op Impossible staat — anders gebruik je per ongeluk nog Low/Medium/High.
Wat heb je geleerd?
- Blacklisting faalt altijd: Er zijn te veel manieren om tekens te coderen of te nestelen. Je kunt nooit álles voorzien.
- Whitelisting is de gouden standaard: Definieer precies welke invoer je verwacht (4 getallen, gescheiden door punten) en weiger alles wat daar niet aan voldoet.
- Herbouw de input: Door de invoer zelf opnieuw samen te stellen uit gevalideerde delen, elimineer je alle restjes kwaadaardige code.