Ga naar hoofdinhoud

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.

Laden...

Probeer al je eerdere bypasses. Geen enkele zal nog werken.

3. ✓ Wat moest je zien?

Controle
  • 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_numeric en explode(".") 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.