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 34Advertencia:
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 40Tienes 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 205Advertencia:
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 205Advertencia:
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:
- ¿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?
- En segundo lugar, dado que el navegador codifica caracteres especiales (por ejemplo, espacios a
%20
), ¿no significa eso que MySQL obtendrá algo comoWHERE id='1234%20AND%201=1
y causará un error de sintaxis? - ¿Por qué produjo el mismo resultado incluso cuando intenté agregar
AND 1=1
yAND 1=2
al final del parámetro id? - ¿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? - 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.