Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] AYUDA-Inyección de Código SQL.

Estas en el tema de AYUDA-Inyección de Código SQL. en el foro de PHP en Foros del Web. Hola colegas, buen día, necesito de su ayuda para este tema, resulta que el proyecto web que estoy desarrollando, el cliente hizo que lo atacaran ...
  #1 (permalink)  
Antiguo 07/02/2013, 15:20
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Pregunta AYUDA-Inyección de Código SQL.

Hola colegas, buen día, necesito de su ayuda para este tema, resulta que el proyecto web que estoy desarrollando, el cliente hizo que lo atacaran para poder ver la vulnerabilidad de este, para los resultados me dijeron que mi script ajax_loging.php era vulnerable a inyección de código... Yo nose mucho sobre eso, pero leyendo lo que yo habia hecho era "sanitizar" las variables recibidas en el input en una función y ya devolverlas "limpias" a mi script para que enviara la query a BDD... y tambien tengo una validacion del lado del cliente con JS , pero bueno se que JS es mas facil de burlar que las validaciones a nivel Servidor... les comparto cual es mi script y la funcion que uso para sanitizar las variables.

ajax_login.php
Código PHP:
Ver original
  1. <?php session_start();
  2. //EN ESTE ARCHIVO TENGO MIS FUNCIONES PARA SANITIZAR LAS VARIABLES
  3. include "security.php";
  4. if (isset($_POST['bandera'])){
  5. function verificar_login($username,$password)
  6. {
  7.     $consulta= "SELECT id_user,id_profile,username,pass,id_canal,clave_suc,logeado FROM users WHERE username='$username' and pass='$password'";
  8.     include "conexion.php";
  9.     $ejecuta = mysql_query($consulta,$conexion);
  10.     $idprofile="";
  11.     $iduser="";
  12.     if(mysql_num_rows($ejecuta)<1)
  13.         {
  14.     $accion="FALLO INICIO DE SESION";
  15.     $origen=$_SERVER['REMOTE_ADDR'];
  16.     generaLogs($username,$accion,$origen);
  17.         echo "Usuario no Encontrado";
  18.         }else{
  19.         while ($row = mysql_fetch_array($ejecuta))
  20.             {
  21.                 $logeado=$row['logeado'];
  22.                 if ($logeado=="1"){
  23.                     //header("Location:yaestalogeado.html");   // rediriges al index
  24.                     echo "logeado";
  25.                     $accion="USUARIO YA TENIA UNA SESION ABIERTA";
  26.                     $origen=$_SERVER['REMOTE_ADDR'];
  27.                     generaLogs($username,$accion,$origen);
  28.                 }else {
  29.                     //Actualizar tabla de users poniendo el estado de logeado en verdadero
  30.                     $consulta2= "UPDATE users SET logeado=true WHERE username='$username'";
  31.                     include "conexion.php";
  32.                     $ejecuta2 = mysql_query($consulta2,$conexion);
  33.                         $accion="USUARIO INICIA SESION EN EL SISTEMA";
  34.                         $origen=$_SERVER['REMOTE_ADDR'];
  35.                         generaLogs($username,$accion,$origen);
  36.                     //recupera el usuario
  37.                     $nameUser=$row['username'];
  38.                     //RECUPERAr columna id_ perfil
  39.                     $idprofile=$row['id_profile'];
  40.                    
  41.                     //GUARDAMOS DATOS NECESARIOS EN VARIABLES DE SESION
  42.                     //ESTO PARA QUE PUEDAN SER UTILIZADOS EN CUALQUIER MOMENTO DURANTE LA SESION
  43.                     $_SESSION["id_user"] =$iduser;
  44.                     $_SESSION["u_name"] =$nameUser;
  45.                    
  46.                     echo $idprofile;
  47.                 }//end usuario no logeado
  48.             }//end while
  49.         }//END else usuario encontrado
  50.         //mysql_close();
  51. }//termina function verifica_login
  52.  
  53. if(trim($_POST["user_name"])!= ""&& trim($_POST["password"])!= "") 
  54. {
  55.         //recibo las variables y las sanitizo con la funcin Securityu
  56.         $user = strtoupper(trim(Security($_POST["user_name"])));  
  57.         $pass = trim(Security($_POST["password"]));
  58.         //$pwd=$_POST['password'];
  59.         //$pwd=hash('sha256', $pass);
  60.         $pwd=sha1($_POST['password']);
  61. //LO QUE HAGO AQUI ES ENVIAR LAS VARIABLES CACHADAS POR POST A MI
  62. //FUNCION QUE "SANITIZA" LAS VARIABLES PARA EVITAR INYECCION DE CODIGO //SQL   
  63. verificar_login($user,$pwd);
  64. }else{
  65.     echo "no";
  66. }    
  67.   }else{
  68.         header("Location:error.php");   // rediriges al index
  69.   }
  70. ?>

Ahora les comprato la funcion que utilizo para sanitizarlas.
security.php
Código PHP:
Ver original
  1. <?php
  2. // Modificamos las variables pasadas por URL
  3. foreach( $_GET as $variable => $valor ){
  4. $_GET [ $variable ] = str_replace ( "'" , "'" , $_GET [ $variable ]);
  5. }
  6. // Modificamos las variables de formularios
  7. foreach( $_POST as $variable => $valor ){
  8. $_POST [ $variable ] = str_replace ( "'" , "'" , $_POST [ $variable ]);
  9. }
  10. // Modificamos las variables pasadas por URL
  11. function Security($_Cadena) {  
  12.     $_Cadena = trim(addslashes(stripslashes(strip_tags($_Cadena))));  
  13.     $_Cadena = str_replace(chr(160),'',$_Cadena);  
  14.     //falta agregar * si es necesario
  15.     $nopermitidos = array("'",'´','~','¨',' ','/','@','#','&','$','!','¡','?','¿','=','(',')','\\','[',']','{','}','_','-','%','<','>','+','|',';',"\"");
  16.     $_Cadena = str_replace($nopermitidos,"", $_Cadena);
  17.     //return mysql_real_escape_string($_Cadena);
  18.     return mysql_real_escape_string($_Cadena);  
  19. }
  20. ?>

Segun lo que lei con eso se puede evitar la inyección de codigo, aunque como les digo, la verdad no se como lo hacen o por donde lo hacen,yo supongo que es atraves de los inputs del formulario y de la URL... se supone que Security.php sanitiza tanto las variables pasadas por URL(_GET) como las que van por el input (_POST)

Podrian decirme si esto no srive, o cual es la mejor forma de evitar la inyeccion de codigo a nivel servidor??.... Estoy migrando mi API de MYSQL a MySQLI, y ahi incluyho esta instruccion
Código PHP:
Ver original
  1. $username = $mysqli->real_escape_string($username);
  2.     $password = $mysqli->real_escape_string($password);

Esto apenas lo estoy desarrollando por que estoy aprendiendo MySQLI ( cuando me entere que MYSQL de PHP estaba deprecada )

Gracias de antemano por sus comentarios. Saludos!

Última edición por art_rockerd; 07/02/2013 a las 15:22 Razón: correccion
  #2 (permalink)  
Antiguo 07/02/2013, 15:48
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: AYUDA-Inyección de Código SQL.

Las funciones que tienes y haces están de más, no hacen falta si usas real_escape_string() de MySQLi.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 07/02/2013, 16:21
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por pateketrueke Ver Mensaje
Las funciones que tienes y haces están de más, no hacen falta si usas real_escape_string() de MySQLi.
Si pero lo que se me hace raro es que segun ellos mi codigo sigue siendo vulnerable, entonces no sirven las funciones? Gracias!
  #4 (permalink)  
Antiguo 07/02/2013, 16:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por art_rockerd Ver Mensaje
Si pero lo que se me hace raro es que segun ellos mi codigo sigue siendo vulnerable, entonces no sirven las funciones? Gracias!
¿Según quienes?

Todo código es vulnerable, es más, podrías tener miles de funciones de seguridad pero si no las usas en los momentos adecuados entonces no sirven de nada.

Quizá esa es la parte que estás olvidando, posiblemente no sabes usar la seguridad que ya tienes.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 07/02/2013, 16:43
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Según quienes?

Todo código es vulnerable, es más, podrías tener miles de funciones de seguridad pero si no las usas en los momentos adecuados entonces no sirven de nada.

Quizá esa es la parte que estás olvidando, posiblemente no sabes usar la seguridad que ya tienes.
Sip, es por eso que pido apoyo aqui posteando el codigo jejejee, segun las personas que hicieron el ataque para detectar vulnerabilidades, se puede hacer inyección de código. Entonces queria saber si lo que tengo en mi codigo no sirve para evitar inyección de código. O de que manera se puede evitar. Gracias!
  #6 (permalink)  
Antiguo 07/02/2013, 16:57
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: AYUDA-Inyección de Código SQL.

Como te he dicho antes, el contenido de security.php no sirve de nada, lo que muestras después si pero debes usarlo siempre que necesites escapar variables.

Dicho script que tienes es un placebo y nada más, probablemente ni usas las funciones que tienes ahí, ¿entonces que caso tiene usarlo?

O mejor dicho aún, ¿sabes que es lo que hace?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 07/02/2013, 17:10
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por pateketrueke Ver Mensaje
Como te he dicho antes, el contenido de security.php no sirve de nada, lo que muestras después si pero debes usarlo siempre que necesites escapar variables.

Dicho script que tienes es un placebo y nada más, probablemente ni usas las funciones que tienes ahí, ¿entonces que caso tiene usarlo?

O mejor dicho aún, ¿sabes que es lo que hace?
Pss segun yo si las uso, cuando recibo las variables por POST antes de enviarlas a la funcion que hace la consulta, invoco la funcion que esta en security para que me retorne la variable ya sanitizada, ya despues de eso, la mando a la funcion que hace la consulta a bdd.. ahi utilizo esas variables que soy usser y password.
  #8 (permalink)  
Antiguo 07/02/2013, 17:13
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: AYUDA-Inyección de Código SQL.

Entonces estás haciendo dos veces las cosas, lo que si me queda claro es que tu función Security() no sirve y ni hablar.

Lo único que debes usar es las funciones propias del motor de la base de datos para dicho efecto, no más.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 07/02/2013, 17:49
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por pateketrueke Ver Mensaje
Entonces estás haciendo dos veces las cosas, lo que si me queda claro es que tu función Security() no sirve y ni hablar.

Lo único que debes usar es las funciones propias del motor de la base de datos para dicho efecto, no más.
Ahorita termine de migrar a Mysqli y uso el mysql_escape_string, cres q con eso sea suficiente? Gracias!
  #10 (permalink)  
Antiguo 07/02/2013, 17:59
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: AYUDA-Inyección de Código SQL.

Si, creo que si.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 07/02/2013, 18:13
Avatar de rottenp4nx  
Fecha de Ingreso: octubre-2012
Ubicación: Santiago
Mensajes: 417
Antigüedad: 11 años, 6 meses
Puntos: 36
Respuesta: AYUDA-Inyección de Código SQL.

También consultas parametrizadas

Saludos
  #12 (permalink)  
Antiguo 07/02/2013, 18:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: AYUDA-Inyección de Código SQL.

Bueno si usa la parametrizadas no hay necesidad de usar el *_real_escape, así que puedes escoger cualquiera de los dos, yo prefiero la de parametrizadas.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 07/02/2013, 18:25
Avatar de rottenp4nx  
Fecha de Ingreso: octubre-2012
Ubicación: Santiago
Mensajes: 417
Antigüedad: 11 años, 6 meses
Puntos: 36
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por abimaelrc Ver Mensaje
Bueno si usa la parametrizadas no hay necesidad de usar el *_real_escape, así que puedes escoger cualquiera de los dos, yo prefiero la de parametrizadas.
No sabía eso, pero si se usa un string como parametro, la función limpia la variable ?

Saludos
  #14 (permalink)  
Antiguo 07/02/2013, 18:46
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: AYUDA-Inyección de Código SQL.

La idea no es limpiar sino evitar inyección sql. Con tan solo usar las parametrizadas evitas first order injection http://download.oracle.com/oll/tutor...tm_attacks.htm
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #15 (permalink)  
Antiguo 08/02/2013, 07:26
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: AYUDA-Inyección de Código SQL.

al ser parametrizada como ustedes dicen se evita que se concatene y evitando asi inyecion , si me equivoco corrijan.

un test basico es introducir en todos tus formularios comillas y demas segun el manual de seguridad mysql

Intente introducir comillas simples y dobles (''' y '"') en todos sus formularios web. Si obtiene cualquier clase de error MySQL, investigue el problema sin demora.

aqui la guia
http://dev.mysql.com/doc/refman/5.0/...uidelines.html
  #16 (permalink)  
Antiguo 08/02/2013, 10:22
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por abimaelrc Ver Mensaje
La idea no es limpiar sino evitar inyección sql. Con tan solo usar las parametrizadas evitas first order injection http://download.oracle.com/oll/tutor...tm_attacks.htm
Interesante, no se nada de consultas parametrizadas, estoy buscando información sobre eso.
  #17 (permalink)  
Antiguo 08/02/2013, 10:36
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por abimaelrc Ver Mensaje
Bueno si usa la parametrizadas no hay necesidad de usar el *_real_escape, así que puedes escoger cualquiera de los dos, yo prefiero la de parametrizadas.
Encontre esto...:

PHP

En el caso de PHP puede ser interesante hacer uso de PHP Data Objects (PDO) y las consultas parametrizadas (bindParam())

A continuación se presenta un ejemplo de sentencia SQL que devuelve los usuarios de la tabla TablaUsuarios cuyo valor de la columna Nombre coincide con el texto “Flu”:
Código PHP:
    $sql‘SELECT FROM TablaUsuarios WHERE Nombre= :name’;

    
$query$conn->prepare($sql);

    
$query->bindParam(:name’‘Flu’);

    
$query->execute(); 
Fuente: http://www.flu-project.com/protegien...2ee-y-net.html
Es una de las formas que encontre de parametrizar las consultas, y usan PDO, aunque estoy termiado de migrar todo a MYSQLi (uu') usando real_escape_string, creen que sea mejor esta forma que les posteo aqui?

Gracias por sus comentarios.
  #18 (permalink)  
Antiguo 08/02/2013, 10:36
Avatar de rottenp4nx  
Fecha de Ingreso: octubre-2012
Ubicación: Santiago
Mensajes: 417
Antigüedad: 11 años, 6 meses
Puntos: 36
Respuesta: AYUDA-Inyección de Código SQL.

http://www.php.net/manual/es/mysqli....statements.php

Saludos
  #19 (permalink)  
Antiguo 08/02/2013, 10:43
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Pregunta Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por art_rockerd Ver Mensaje
Encontre esto...:

PHP

En el caso de PHP puede ser interesante hacer uso de PHP Data Objects (PDO) y las consultas parametrizadas (bindParam())

A continuación se presenta un ejemplo de sentencia SQL que devuelve los usuarios de la tabla TablaUsuarios cuyo valor de la columna Nombre coincide con el texto “Flu”:
Código PHP:
    $sql‘SELECT FROM TablaUsuarios WHERE Nombre= :name’;

    
$query$conn->prepare($sql);

    
$query->bindParam(:name’‘Flu’);

    
$query->execute(); 
Fuente: http://www.flu-project.com/protegien...2ee-y-net.html
Es una de las formas que encontre de parametrizar las consultas, y usan PDO, aunque estoy termiado de migrar todo a MYSQLi (uu') usando real_escape_string, creen que sea mejor esta forma que les posteo aqui?

Gracias por sus comentarios.


Ese código es lo mismo que:

Código PHP:
    $sql‘SELECT FROM TablaUsuarios WHERE Nombre= :name’;

    
$query$conn->prepare($sql);

    
$query->execute(array(':name'=>'Flu')); 
cierto¿?
  #20 (permalink)  
Antiguo 08/02/2013, 11:52
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Perfecto para MSQLi :), bueno entonces usare las sentencias preparadas, y teoricamente con eso puedo evitar inyeccion de código cierto? Muchas gracias por su ayuda.
  #21 (permalink)  
Antiguo 08/02/2013, 13:46
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: AYUDA-Inyección de Código SQL.

Repito solo es para first order injection lean el enlace que comenté. Como quiera recomiendo que depures la insersión de html y otras cosas, si es que no quieres tener eso en la base de datos.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #22 (permalink)  
Antiguo 13/02/2013, 17:18
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Hola amigos, la empresa que testeo mi aplicacion me envio esta informacion, me comentan que estos son los parametros de etrada que utilizan para inyectar codigo SQL a mi base de datos...

Adicionalmente enviamos los parámetros utilizados para generar el SQL injection para la validación de datos de entrada

Place: POST
Parameter: user_name
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: user_name=test' AND 1604=1604 AND 'ZKgm'='ZKgm&password=test&rand=0
.9940696898259294

Type: UNION query
Title: MySQL UNION query (NULL) - 6 columns
Payload: user_name=test' UNION ALL SELECT NULL,CONCAT(0x3a73676b3a,0x704c656
a4c734a4e586d,0x3a6579633a),NULL,NULL,NULL,NULL#&p assword=test&rand=0.9940696898
259294

Type: AND/OR time-based blind
Title: MySQL > 5.0.11 AND time-based blind
Payload: user_name=test' AND SLEEP(5) AND 'Nbsf'='Nbsf&password=test&rand=0.
9940696898259294
  #23 (permalink)  
Antiguo 13/02/2013, 20:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: AYUDA-Inyección de Código SQL.

Se supone que si usaste lo que te indicamos no hayas tenido problemas. ¿Lo tuviste?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #24 (permalink)  
Antiguo 14/02/2013, 13:45
 
Fecha de Ingreso: febrero-2013
Ubicación: Monterrey
Mensajes: 1
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: AYUDA-Inyección de Código SQL.

El error esta en que envias el contenido de la variable que no has sanitizado. Saludos

//recibo las variables y las sanitizo con la funcin Securityu
$user = strtoupper(trim(Security($_POST["user_name"])));
$pass = trim(Security($_POST["password"])); // <--Esto estra sanitizado - OK
//$pwd=$_POST['password'];
//$pwd=hash('sha256', $pass);
$pwd=sha1($pass); // <--- esto NO ESTA sanitizado - Error!
//LO QUE HAGO AQUI ES ENVIAR LAS VARIABLES CACHADAS POR POST A MI
//FUNCION QUE "SANITIZA" LAS VARIABLES PARA EVITAR INYECCION DE CODIGO //SQL
verificar_login($user,$pwd); // <--Estas enviando el contenido de la variable que no esta sanitizada
  #25 (permalink)  
Antiguo 14/02/2013, 15:36
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por abimaelrc Ver Mensaje
Se supone que si usaste lo que te indicamos no hayas tenido problemas. ¿Lo tuviste?
Hola, pues no he podido implementar consultas parametrizadas, lo he intentado de muchas maneras con Mysqli, pero solamente no me funciona... asi que no he podido implementar las consultas parametrizadas...
Código PHP:
Ver original
  1. function login($user,$pwd){
  2.    
  3.         // CONEXION A BDD
  4.         $host="localhost";
  5.         $user="root";
  6.         $pass="";
  7.         $schema="pruebas";
  8.             $mysqli = new mysqli($host,$user,$pass,$schema);
  9.             if (mysqli_connect_errno()) {
  10.                 printf("Fallo la conexion a la base de datos: ", mysqli_connect_error());
  11.             }
  12.                
  13.             //PREPARAMOS LA CONSULTA
  14.     $consulta = "SELECT username,pass FROM users WHERE username=? and pass=?";
  15.  
  16.         if ($sentencia = $mysqli->prepare($consulta)) {
  17.             $sentencia->bind_param('ss', $user, $pwd);     
  18.             /* ejecutar la sentencia */
  19.             $sentencia->execute();
  20.        
  21.             /* vincular las variables de resultados */
  22.             $sentencia->bind_result($username, $pass);
  23.        
  24.             /* obtener los valores */
  25.             while ($sentencia->fetch()) {
  26.                
  27.                 printf ("%s (%s)\n", $username, $pass);
  28.             }
  29.        
  30.             /* cerrar la sentencia */
  31.             $sentencia->close();
  32.         }
  33.  
  34.  
  35. }

realmente ya no se que hacer :S intente todo lo de la documentacion pero no logro obtener resultados... estoy intentando en ese script probar las sentencias preparadas, solo quiero imprimr usuario y passord que coincida con los parametros introducidos por el usuario, pero nada..en firebug pude ver que simplemente no obtengo ninguna respuesta. Me pueden ayudar a implementar las consultas parametrizadas?

http://www.php.net/manual/es/mysqli....statements.php
http://php.net/manual/es/mysqli-stmt.bind-param.php
http://www.php.net/manual/es/mysqli-...ind-result.php
http://www.php.net/manual/es/mysqli-stmt.fetch.php
http://www.php.net/manual/es/mysqli-stmt.bind-param.php
  #26 (permalink)  
Antiguo 14/02/2013, 15:37
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Cita:
Iniciado por Astro96 Ver Mensaje
El error esta en que envias el contenido de la variable que no has sanitizado. Saludos

//recibo las variables y las sanitizo con la funcin Securityu
$user = strtoupper(trim(Security($_POST["user_name"])));
$pass = trim(Security($_POST["password"])); // <--Esto estra sanitizado - OK
//$pwd=$_POST['password'];
//$pwd=hash('sha256', $pass);
$pwd=sha1($pass); // <--- esto NO ESTA sanitizado - Error!
//LO QUE HAGO AQUI ES ENVIAR LAS VARIABLES CACHADAS POR POST A MI
//FUNCION QUE "SANITIZA" LAS VARIABLES PARA EVITAR INYECCION DE CODIGO //SQL
verificar_login($user,$pwd); // <--Estas enviando el contenido de la variable que no esta sanitizada
Si muchas gracias, me percate de eso, pero aun asi pudieron hacer inyeccion.. :S ahorita estoy intentando implementar las consultas parametrizadas, pero no tengo exito.
  #27 (permalink)  
Antiguo 15/02/2013, 16:29
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: AYUDA-Inyección de Código SQL.

Mi código quedo como sigue :
Código PHP:
Ver original
  1. <?php
  2. //FUNCION RECIBE PARAMETROS DE ENTRADA
  3. function login($user,$pwd){
  4.    
  5.         // CONEXION A BDD
  6.         $host="localhost";
  7.         $userbd="root";
  8.         $pass="";
  9.         $schema="pruebas";
  10.             $mysqli = new mysqli($host,$userbd,$pass,$schema);
  11.             if (mysqli_connect_errno()) {
  12.                 printf("Fallo la conexion a la base de datos: ", mysqli_connect_error());
  13.             }
  14.                
  15.            
  16.         $consulta = "SELECT username,pass FROM users WHERE username=? and pass=?";
  17.         //PREPARAMOS LA CONSULTA
  18.         if ($sentencia = $mysqli->prepare($consulta)) {
  19.         //ENVIAMOS LOS PARAMETROS
  20.         $sentencia->bind_param('ss', $usuario, $pasword);
  21.         //ESCAPAMOS
  22.         $usuario = $mysqli->real_escape_string($user);
  23.         $pasword = $mysqli->real_escape_string($pwd);
  24.             /* ejecutar la sentencia */
  25.             $sentencia->execute();
  26.              if ($sentencia->errno) {
  27.                   echo "FAILURE!!! " . $sentencia->error();
  28.         }
  29.             /* vincular las variables de resultados */
  30.                                    
  31.             //**************************RESULTADOS EN ARRAY ASOCIATIVO*******************************/
  32.             $result = $sentencia->get_result();
  33.             if($result->num_rows <1) {echo "no se encontro usuario";
  34.                echo "<a href='logingInyection.html'>Regresar</a>";}
  35.              //fetch_assoc retorna un array asociativo con la siguiente estructura array('campo base datos'=>'valor')
  36.              /* obtener los valores */
  37.                        while($row = $result->fetch_assoc()) {
  38.                        $nameUser=$row['username'];
  39.                         $idprofile=$row['pass'];
  40.                         echo "$nameUser";
  41.                         echo "<a href='logingInyection.html'>Regresar</a>";
  42.                        }
  43.             /**************************************************************************************/                       
  44.             /* cerrar la sentencia */
  45.             $sentencia->close();
  46.         }else{
  47.                //inyeccion
  48.        }
  49.        mysqli_close($mysqli);//cerramos la conexion
  50. }
  51.  
  52.  
  53. //recibimos parametros
  54. if(trim($_POST["username"])!= ""&& trim($_POST["pass"])!= "")  
  55.     {
  56.         //recibo las variables y las sanitizo con la funcin Securityu
  57.         $user = $_POST["username"];  
  58.         $pass = $_POST["pass"];
  59.         $pwd=sha1($pass);
  60.         login($user,$pwd);
  61.     }else{
  62.         echo "Algun campo esta vacio<br>
  63.         <a href='logingInyection.html'>Regresar</a>";
  64.     }  
  65.  
  66.  
  67. ?>

Etiquetas: inyección, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:44.