¿Es posible una inyección SQL con parámetros GET ocultos?

1

Mi amigo me pidió que jugara con el nuevo sitio web de su familia e informara sobre cualquier error que pudiera encontrar. Al pasar por las páginas, noté que parece que es muy propenso a la inyección de SQL. No tengo acceso al código fuente ya que está alojado en una empresa local de diseño de sitios web.

http://website.tld/product/1234/a-beautiful-vase

Después de jugar con la URL, pude obtener exactamente la misma página con:

http://website.tld/product.php/id=1234

Reemplazé 1234 con 1234' y el sitio web arrojó el siguiente error:

  

Advertencia: mysql_num_rows() espera que el parámetro 1 sea un recurso, booleano dado en /home/shop/public_html/product.php en la línea 34

     

Advertencia: mysql_fetch_array() espera que el parámetro 1 sea un recurso, booleano dado en /home/shop/public_html/product.php en la línea 40

     

Tienes un error en tu sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de '' 1234 '' 'en la línea 1

También intenté reemplazar id=1234 con id=1234 AND 1=1 (codificado automáticamente por el navegador en id=1234%20AND%201=1 ) y id=1234 AND 1=2 (codificado automáticamente por el navegador en id=1234%20AND%201=2 ). Con ambos intentos, la página web logra cargar la página del producto con dos errores adicionales:

  

Advertencia: mysql_num_rows() espera que el parámetro 1 sea un recurso, booleano dado en /home/shop/public_html/product.php en la línea 205

     

Advertencia: mysql_fetch_array() espera que el parámetro 1 sea un recurso, booleano dado en /home/shop/public_html/product.php en la línea 217

La página del producto se ve normal con la información del producto, el peso, el precio y la imagen correctamente rellenados. No hay error de sintaxis SQL Y ahí es donde me confundí un poco.

También probé un montón de otras variaciones:

  • id='1234%20AND%201=2 produjo ...to use near '1234%20AND%201'' at line 1
  • id=1234'%20AND%201=2 produjo ...to use near ''' at line 1
  • id='1234'%20AND%201=2 produjo ...to use near '1234'%20AND%201'' at line 1
  • id=1234%20AND%20'1'=2 produjo ...to use near '1''' at line 1

Sin embargo, id=1234%20AND%201='2 también muestra la página correcta del producto con las dos advertencias de PHP iguales a las anteriores:

  

Advertencia: mysql_num_rows() espera que el parámetro 1 sea un recurso, booleano dado en /home/shop/public_html/product.php en la línea 205

     

Advertencia: mysql_fetch_array() espera que el parámetro 1 sea un recurso, booleano dado en /home/shop/public_html/product.php en la línea 217

Supongo que mis preguntas son:

  1. ¿Es posible, en este caso, realizar una inyección SQL? Encontré extensos tutoriales en línea que explican cómo inyectar parámetros GET normales. Sin embargo, si no estoy muy equivocado, .htaccess se usa para volver a escribir la URL, ¿eso evitaría (o cambiaría) el procedimiento?
  2. En segundo lugar, dado que el navegador codifica caracteres especiales (por ejemplo, espacios a %20 ), ¿no significa eso que MySQL obtendrá algo como WHERE id='1234%20AND%201=1 y causará un error de sintaxis?
  3. ¿Por qué produjo el mismo resultado incluso cuando intenté agregar AND 1=1 y AND 1=2 al final del parámetro id?
  4. ¿Por qué id=1234%20AND%20'1'=2 rindió ...to use near '1''' at line 1 ? Solo coloco una cita alrededor del 1, pero el error parece indicar que hay dos comillas simples adicionales después de 1?
  5. El navegador web (estoy usando Google Chrome) no parece codificar el signo = , pero cambiarlo manualmente a %3D no parece hacer una diferencia en el resultado. ¿Por qué es eso?

Dos puntos adicionales que me gustaría señalar:

  • Las advertencias de PHP se emiten cuando hay un error de sintaxis SQL y cuando no hay diferencias, simplemente observe los números de línea. Supongo que las líneas 205 y 217 son consultas utilizadas para encontrar productos relacionados, mientras que la consulta principal que extrae el producto id = 1234 se encuentra alrededor de la línea 34-40.
  • id=1234%20-- hace que la página del producto sea perfecta sin ningún error o advertencia.
pregunta user1316560 09.02.2017 - 09:28
fuente

1 respuesta

1

Intentaré responder una pregunta a la vez,

  
  1. ¿Es posible, en este caso, realizar una inyección SQL? encontré   extensos tutoriales en línea que explican cómo inyectar GET normal   parámetros Sin embargo, si no me equivoco mucho, .htaccess se utiliza para   reescriba la URL para que eso impida (o cambie) el procedimiento?
  2.   

Sí, es posible. Dado que la consulta espera devolver un resultado, puede forzar a la consulta actual a que no devuelva resultados (ver el punto 3) y luego hacer una unión con otra tabla (por ejemplo, la tabla de usuarios) y devolver una sola fila a la vez.

  
  1. En segundo lugar, ya que el navegador codifica caracteres especiales (por ejemplo,   espacios a% 20), eso no significa que MySQL obtendrá algo como   ¿DONDE id = '1234% 20AND% 201 = 1 y causa un error de sintaxis?
  2.   

No, los caracteres solo están codificados en la url, cuando el String llega al servidor será como si no estuviera codificado.

  
  1. ¿Por qué produjo el mismo resultado incluso cuando intenté agregar AND 1 = 1?   y AND 1 = 2 al final del parámetro id?
  2.   

Recibes ese error porque la consulta está devolviendo falso, tal vez porque la forma en que se construye la consulta y no se está inyectando correctamente. Por ejemplo, cuando dice que AND 1=2 está haciendo que la condición sea falsa y no se devuelven filas. Pero mejor lea this para entender mejor.

Intenta poner, después, como id=1234 OR 1=1 -- , para intentar evitar ese error.

  
  1. ¿Por qué id = 1234% 20AND% 20'1 '= 2 rendimiento ... para usar cerca de' 1 '' 'en la línea 1?   Solo pongo una cita alrededor del 1 pero el error parece indicar   hay dos comillas simples adicionales después de 1?
  2.   

Puede ser el formato para que la base de datos devuelva los errores, si observa que, en los otros errores, también se agrega '' al final.

  
  1. El navegador web (estoy usando Google Chrome) no parece codificar el   = signo, pero cambiarlo manualmente a% 3D no parece hacer una diferencia en el resultado. ¿Por qué es eso?
  2.   

Mira el punto 2. Cuando la cadena llegue al servidor, será un = en cualquier caso.

    
respondido por el RageAgainstTheMachine 09.02.2017 - 10:31
fuente

Lea otras preguntas en las etiquetas