¿Esto vale para algo?

Iniciado por dimitrix, 8 Marzo 2012, 20:54 PM

0 Miembros y 1 Visitante están viendo este tema.

dimitrix

Código (php) [Seleccionar]
$texto='cadena con ataque';

$texto=stripslashes($texto);
$texto=mysql_real_escape_string($texto);

mysql_query("SELECT * FROM Usuarios WHERE Nombre='$texto'");


Pues me gustaría saber dos cosas:

1º Si el mysql_real_escape_string en este caso vale para algo.

2º Como podriamos atacar este ejemplo.


1000 gracias.




WHK

#1
en el caso de que $texto valga:
' union select database(),2,3,4,5,6 -- -
con mysql_real_escape_string te evita la inyección, sin el mysql real escape string te retorna una inyección sql con el nombre de la base de datos, si agregas un from tabla te debuelve los campos de la tabla, por ejemplo el password del usuario admin con un where id = x.


Lee un poco los tutoriales sobre inyección sql que andan por el foro.
Dale un vistazo a estos enlaces:

http://cl.php.net/manual/es/security.database.sql-injection.php (importante!)
CitarEncierre entre comillas cada valor no-numérico provisto por el usuario que sea pasado a la base de datos filtrado con la función de cadena específica de la base de datos (Ej. mysql_real_escape_string(), sqlite_escape_string(), etc.). Si una función de escape (o de filtrado) de cadena específica de la base de datos, o un mecanismo similar no está disponible, las funciones addslashes() y str_replace() podrían ser útiles (dependiendo del tipo de la base de datos). Vea el primer ejemplo. Como lo muestra el ejemplo, agregar comillas a la parte estática de la consulta no es suficiente, lo que hace que esta consulta sea facilmente vulnerada.
No muestre ninguna información específica de la base de datos, especialmente sobre el esquema, por su correcto significado es como jugar sucio contra usted mismo. Vea también Reporte de errores y Manejo de errores y funciones de registro.
Podría utilizar procedimientos almacenados y previamente cursores definidos, para abstraer el acceso a datos para que los usuarios no tengan acceso directo a las tablas o vistas, para que esta solución tenga otros impactos.

http://foro.elhacker.net/nivel_web/gran_tutorial_sobre_inyecciones_sql_en_mysql-t247535.15.html

http://cl.php.net/mysql%20real%20escape%20string

CitarEscapa caracteres especiales en la cadena no escapada, teniendo en cuenta el conjunto de caracteres actual de la conexión para que sea seguro usarla en mysql_query(). Si se van a insertar datos binarios, esta función debe ser usada.

mysql_real_escape_string() llama la función de la libreria de MySQL mysql_real_escape_string, la cual antepone backslashes a los siguientes caracteres: \x00, \n, \r, \, ', " y \x1a.

Esta función siempre debe (con pocas excepciones) ser usada para hacer los datos seguros, antes de enviar una consulta a MySQL.

Kase

stripslashes que hace??  por su nombre me suena a  que    quita   \   o  que las escapa  \\

pero si


Citarmysql_real_escape_string() llama la función de la libreria de MySQL mysql_real_escape_string, la cual antepone backslashes a los siguientes caracteres: \x00, \n, \r, \, ', " y \x1a.
tambien escapa  \ 

siginfica que si metes la cadena    \'  or 1=1  --

y esperabas que solo escapara la  '   no funcionara ....  en teoria:   \\' or 1=1 --   \ agregada escape con la otra diagonal, y se haga la injeccion a pesar del escape 

pero como escapa tambien diagonales...  quedaria realmente asi
\\\' or 1=1 --

Citar
$texto='cadena con ataque';

$texto=mysql_real_escape_string($texto);

mysql_query("SELECT * FROM Usuarios WHERE Nombre='$texto'");

no me parece un codigo rompible... 

WHK

no no no, stripslashses los quita antes de parsear mysql real escape string, el strip slash se lo ponen generalmente para evitar los magic quotes del apache, por ejemplo si ingresas un texto con comillas le agrega solito el servicod unos slashses, con esa función se quita, el problema es que si el servidor no tiene habilitado magic quotes entonces le vas a comer los slashes reales que ha ingresado el usuario, por eso se debe detectar primero si está habilitado magic quotes y después procesar con stripslashses.

Después que está limpio lo procesa mysql real escape string, pero ojo, el motor mysql te va a dar error si tratas de hacer eso en un campo con valor int, para eso se utiliza (int)$valor dependiendo del tipo de campo y en ese caso no se le ponen comillas. Lo he explicado como 500 veces:
http://foro.elhacker.net/nivel_web/como_evitar_la_inyeccion_sql-t252384.0.html