INYECCIÓN SQLi - Medio - AvanzadoAntes de comenzarEste escrito esta pensado como una continuación directa a mi anterior lectura de inyecciones sqli en donde se explican de manera un poco más general las bases de esta vulnerabilidad , por lo que si no estas al tanto de ella te recomiendo que primero le des un repaso antes de empezar esta lectura, ya que este escrito será un poco más avanzado. Inyecciones sqli en diferentes bases de datosVamos a empezar aclarando que una inyección sql no es igual en todas las bases de datos, si bien pueden ser un poco parecidas no son del todo igual, esto se debe a que cada base de datos tiene su propia sintaxis. Para dar un ejemplo de esto voy a tomar 3 bases de datos diferentes y trataré de mostrar las diferencias por separado, las bases de datos que vamos a ver son:
La informacion que vamos a recopilar será la siguiente:
MySQLBases de datos por defecto
Version de base de datos
Credenciales por defectoEn este caso la base de datos de MySQL tiene por defecto las credenciales en una tabla llamada:
Para ser mas exactos en las columnas: Base de datos actual
Server Hostname
MySSQLBases de datos por defecto.
Version de base de datos
Credenciales por defectoEn este caso la base de datos de MySSQL tiene por defecto las credenciales en 2 tablas llamadas:
Para ser mas exactos en las columnas: Base de datos actual
Server Hostname
OracleBases de datos por defecto.
Version de base de datos
Credenciales por defectoEn este caso la base de datos de MySQL tiene por defecto las credenciales en una tabla llamada:
Para ser mas exactos en las columnas:
Base de datos actual
Server Hostname
Tipos de payloadsBoolean-based blindBoolean-based blind significa que la vulnerabilidad se basa en valores booleanos (true or false) y se dice que es ciega por que no muetra alguna señal de que hay un error en la página. Error-basedError-based significa que la inyeccion se basa en los mensajes de error que el servidor responde y asi conocer un poco mas sobre la estructura de la base de datos que se esta usando. Union query-basedUnion query-based significa que estamos aprovechando que el operador UNION de sql puede ser usado, gracias a esto podemos combinar declaraciones que serán visualizadas como parte de la respuesta del servidor. Stacked queriesStacked queries significa que la vulneravilidad se basa en añadir mas consultas sql en serie, de esta manera mandar una consulta normal y al mismo tiempo mandar la consulta del atacante, todo esto solo dividiendo las consultas con un ";". Time-based blindTime-based blind es cuando la vulnerabilidad se basa en el tiempo, lo que significa que un atacante enviará una consulta sql obligano a la base de datos a esperar una cierta cantidad de tiempo, si el tiempo de respuesta del servidor es el mismo tiempo que el atacante declaró en la sentencia, esto significa que es vulnerable. Inline queriesInline queries consiste en unir una query sql dentro de otra y asi sucesivamente para ver si la sentencia es ejecutada. CodificaciónesUnos de los métodos más importantes que tenemos que tomar en cuenta al momento de hacer un testeo en una inyección sqli son las codificaciónes, las cuales nos ayudarán a que un payload pueda ser filtrado por algunos waf. Codificación con comentariosEste tipo de codificacion, como dice su nombre es usar la sintaxis para comentarios de sql, la cual es la siguiente:
Ejemplo:
Codificación URLLa codificación URL reemplaza los espacios con un signo “+”, y algunos caracteres ASCII con un signo “%” seguido por su equivalente en hexadecimal.
Ejemplo:
Mayusculas y minusculasTambién podemos utilizár el método de mezclar mayusculas y minusculas para ver si podemos podemos evadir algunos filtros. Ejemplo:
Codificación HexEsto se basa en codificar el método de comentarios que vimos antes en codigo hex:
Ejemplo:
Crear payloads codificadosEn esta parte me gustaría dar un ejemplo de como crear un payload codificado. Primero vamos a definir el payload que queremos codificar:
En este caso estamos usando el payload sin ningun tipo de codificacion, pero tenemos mas maneras de declarar el payload, esto cambiando su sintaxis y añadiendo otras cosas aun sin codificar, por ejemplo:
Para empezar a codificar vamos a utilizar primero el método de comentarios:
Ahora ya lo tenemos codificado con comentarios, pero podemos mezclar codificaciones, por ejemplo con el método de URL:
De esta manera podemos evadir filtros y jugar con diferentes codificaciones y mezclas. Haciendo uso de funciones sql para obtener informaciónEl lenguaje SQL tiene funciones incorporadas para hacer cálculos sobre los datos. Claro ese el uso "Oficial" de ellas, pero estamos en un escrito de inyecciones sql asi que vamos a darles un uso para este caso. Para este ejemplo utilizarémos las siguientes funciones:
RPADVamos a empezar con la funcion RPAD la cual devuelve la expr1 rellena por la derecha con la secuencia de caracteres de expr2 y con n caracteres de longitud. Esta función es útil para dar formato a la salida de una consulta. su sintaxis es Un ejemplo de su uso en una inyección sql:
SOUNDS LIKEEsta función puede ser usada para remplazar el simbolo = Ejemplo:
UPPERSintaxis: Ejemplo:
REVERSESintaxis: Ejemplo:
NOTA: se utiliza doble reversa para que la información quede de manera entendible RIGHTsintaxis: Ejemplo:
ELTSintaxis: Ejemplo:
HEXSintaxis: Ejemplo:
HUNEXSintaxis: Ejemplo: CASEEjemplo: IFEjemplo: EXTRACTVALUESintaxis: Ejemplo: Con esto en mente, podemos mezclar entre funciones, diferentes tipos de codificacion y diferente sintaxis en las secuencias de sql para crear payloads cada vez más personalizados. Pasando de Inyección sql a otras vulnerabilidadesDe Sqli a XSSCuando tenemos una página vulnerable a inyección sql esta también es vulnerable a inyecciones sql,lo cual puede ser desde el parametro vulnerable pero en este caso vamos a aprobechar la inyección sql para inyectar xss, esto puede ser de 2 maneras: XSS reflectivoEn la columna vulnerable vamos a inyectar el payload xss que queramos. "IMPORTANTE" lo tenemos que pasar a hex. Para el ejemplo vamos a usar este payload:
Ahora en HEX:
Ejemplo:
De esta manera estamos haciendo un xss reflectivo. XSS persistentePara un xss persistente necesitamos tener permisos de escritura, todo va bien y la página vulnerable nos da permisos tenemos que hacer lo siguiente: Haciendo uso de la funcion INTO OUTFILE vamos a escribir un archivo en la raiz de la página. Ejemplo:
Y con eso vamos a crear un archivo .html con nuestro XSS persistente. De Sqli a LFRSql tambien tiene una funcion que nos permite cargar archivos locales y con eso podemos leer archivos a los que normalmente no deberiamos tener acceso Ejemplo: De Sqli a RCEUsando el mismo metodo con el que hicimos un xss persistente vamos a hacer lo siguiente: Vamos a inyectar codigo php con el cual vamos a generar una shell con la que vamos a poder ejecutar comandos dentro del servidor vulnerable Codigo: Lo vamos a inyectar usando un: INTO+OUTFILE+'ruta/nombre.php' Ejemplo:
Por ultimo, para usarlo vamos a la siguiente ruta:
Como pueden ver, estamos haciendo uso de la shell que inyectamos para ejecutar los comandos.
https://github.com/Y000o/Sql_injection_medium-advanced.md/blob/main/Sql_injection_medium-advanced.md |