Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/02/2013, 15:20
art_rockerd
 
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