Hola, estaba haciendo una pagina recopilando ejercicios de SQL Injection, hasta el momento solo he subido dos http://www.dijkstraeasteregg.com.ar/. Ahora, el problema es que el hosting me limpia automaticamente la cadena es decir si le paso ' OR ''=', en realidad le pasa \' OR \'\'=\'.
No estoy seguro, ¿pero esto puede modificarse cambiando el juego de caracteres de la base de datos?. La verdad que lo único que se me ocurre es que sea algo de el hosting, pero no se en que parte tocar para quitarle esta protección. Por cierto el hosting que uso es awardspace, y usa phpMyAdmin para administrar las bases de datos.
Desde ya gracias por detenerse a leer.
Muchas gracias.
no creo que sea el hosting..
podras poner el codigo.?
Okaz, disculpa por no hablerlo puesto antes, no me di cuenta.
//conectar1.php
<?php
$usuario=$_POST['user'];
$password=$_POST['pass'];
/*Conectamos*/
$conexion = mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("xxx", $conexion);
/*Hacemos la consulta*/
$consulta_test = "SELECT NOMBRE, PASSWORD FROM USUARIO WHERE (NOMBRE = '".$usuario."') AND (PASSWORD = '".$password."')";
echo "$consulta_test<br>";
/*Obtenemos la respuesta*/
$respuesta_consulta = mysql_query($consulta_test, $conexion) or die(mysql_error());
/*Numero total de filas, para hacer las iteraciones de manera correcta*/
$total_filas = mysql_num_rows($respuesta_consulta);
if ($total_filas > 0) {
echo " Well Done!";
} else {
/*ERROR*/
echo " Fallaste!";
}
/* Respuesta:' OR ''='*/
?>
//conectar2.php
<?php
$us=$_POST['usuario'];
$pas=$_POST['pass'];
if($_GET['usuario'] || $_GET['pass']){
die("Hack Attempt");
}
/*Conectamos*/
$conexion = mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("xxx", $conexion);
$sql="SELECT PASSWORD FROM USUARIO WHERE USUARIO.NOMBRE = '$us'";
echo "$sql<br>";
$resp = mysql_query($sql, $conexion) or die(mysql_error());
if($fila = mysql_fetch_array($resp)){
if($fila['PASSWORD']==$pas){
echo "Inicio de sesión exitoso"; // Esto fue modificado
}else{
echo "el password ".$pas." es incorrecto";
}
} //' UNION SELECT MIN(Password),2,3,4,5 FROM USUARIO WHERE NOMBRE = 'zanahoria
?>
//index.php
<html>
<head>
<title>Ejercicios de SQL Injection</title>
</head>
<body>
<br>Primer Ejercicio. De por sentado que existe un usuario llamado Marcelo.</br>
<form action="conectar1.php" method="POST" >
Nombre de usuario: <br><input type="text" name="user" align="right" /><br>
Contraseña: <br><input type="password" name="pass" align="right" /><br>
<input type="submit" value="Iniciar Sesion" />
</form>
<form action="respuesta1.txt" method="post">
Ver respuesta: <input type="submit" value="Spoilerr!"/></br>
</form>
<br>Segundo ejercicio. Unidos estamos de pie.</br>
<form action="conectar2.php" method="POST" >
Nombre de usuario: <br><input type="text" name="usuario" align="right" /><br>
Contraseña: <br><input type="password" name="pass" align="right" /><br>
<input type="submit" value="Iniciar Sesion" />
</form>
<form action="respuesta2.txt" method="post">
Ver respuesta: <input type="submit" value="Spoilerr!"/></br>
</form>
</body>
</html>
Igualmente ahora que lo pienso, lo probé en un localhost, así que no tendría que haber diferencia.
al parecer es por la configuración del php.ini
las magic_quotes_gpc <- si tu versión de php es menor que la 6 (creo.) o verifica mejor.. esta opción esta activada...
pero la puedes .. am. la puedes desactivar con un script php o con un archivo de apache
si quieres desde un .htaccess es así:
php_flag magic_quotes_gpc off
en google me encontré esta función que te ayuda a evitar esto:
if ( get_magic_quotes_gpc () ){
function traverse ( &$arr ){
if ( !is_array ( $arr ) ) return;
foreach ( $arr as $key => $val )
is_array ( $arr[$key] ) ? traverse ( $arr[$key] ) : ( $arr[$key] = stripslashes ( $arr[$key] ));
}
$gpc = array ( &$_GET, &$_POST, &$_COOKIE, &$_REQUEST );
traverse ( $gpc );
}
perdona por la tardada respuesta, espero te ayude.
Uh buenisimo! Muchas gracias.
Es un poco frustrante hacer una pagina de ejercicios de SQL injection y que el mismo server te proteja de los ejercicios XD
Saludos!