Wireshark analiza el paquete de tráfico de inyección ciega booleana sql


0x001 tema

Inserte la descripción de la imagen aquí

0x002 Ver declaración de inyección

Importar el paquete de tráfico se Wireshark
Inserte la descripción de la imagen aquí
ve muy complicado. Ingrese urlel protocolo utilizado por la solicitud del navegador http, por lo que filtramos directamente los httppaquetes de datos del protocolo.

Filtre el httppaquete de datos solicitado. La
Inserte la descripción de la imagen aquí
declaración de inyección es la siguiente:

http://localhost:81/?id=1' and ascii(substring((select keyid from flag limit 0,1),1,1))=32#

Esto muestra que el atacante usa la inyección ciega booleana para la inyección SQL.

Acerca de la verificación de notas ciegas booleanas: https://blog.csdn.net/weixin_44032232/article/details/109358571

0x003 Observe el paquete de respuesta

Aquí pensamos que los paquetes de datos devueltos por la declaración de inyección deben ser diferentes para el éxito y el fracaso.

Observe el sqlpaquete de respuesta inyectado.

Inyectar contenido de respuesta de falla:
Inserte la descripción de la imagen aquí
Inyectar contenido de respuesta exitosa:
Inserte la descripción de la imagen aquí

A partir de esto, podemos pensar si es posible filtrar primero el paquete de respuesta exitoso inyectado. ? ? Entonces, ¿qué reglas deberíamos usar para el filtrado, o qué características de los paquetes de respuesta deberían usarse para el filtrado? ? ?

Las condiciones del filtro en las que pienso:

  • RESUMEN La respuesta filtrada tiene 文章内容todos los paquetes de respuesta
  • Filtrar según la longitud del paquete de respuesta

Longitud del paquete de respuesta para inyección fallida: Longitud
Inserte la descripción de la imagen aquí
del paquete de respuesta para inyección exitosa:
Inserte la descripción de la imagen aquí

Para la Wiresharksintaxis no está muy familiarizado, no cómo encontrar la sintaxis de filtrado de contenido, así que estoy aquí por la longitud del filtrado de paquetes de respuesta.

Reglas de filtrado http de Wireshark:

http.host==magentonotes.com
http.host contains magentonotes.com
//过滤经过指定域名的http数据包,这里的host值不一定是请求中的域名

http.response.code==302
//过滤http响应状态码为302的数据包

http.response==1
//过滤所有的http响应包

http.request==1
//过滤所有的http请求,貌似也可以使用http.request

http.request.method==POST
//wireshark过滤所有请求方式为POST的http请求包,注意POST为大写

http.cookie contains guid
//过滤含有指定cookie的http数据包

http.request.uri==/online/setpoint”
//过滤请求的uri,取值是域名后的部分

http.request.full_uri==” http://task.browser.360.cn/online/setpoint”
//过滤含域名的整个url则需要使用http.request.full_uri

http.server contains “nginx”
//过滤http头中server字段含有nginx字符的数据包

http.content_type == “text/html”
//过滤content_type是text/html的http响应、post包,即根据文件类型过滤http数据包

http.content_encoding == “gzip”
//过滤content_encoding是gzip的http包

http.transfer_encoding == “chunked”
//根据transfer_encoding过滤

http.content_length == 279
http.content_length_header ==279//根据content_length的数值过滤

http.server
//过滤所有含有http头中含有server字段的数据包

http.request.version == “HTTP/1.1//过滤HTTP/1.1版本的http包,包括请求和响应

http.response.phrase == “OK”
//过滤http响应中的phrase

content-LengthFiltrar por longitud La sintaxis del filtro es http.content_length == 366
Inserte la descripción de la imagen aquí
Todas las declaraciones inyectadas correctamente también se pueden ver desde el paquete de respuesta.

http://localhost:81/?id=1' and ascii(substring((select keyid from flag limit 0,1),1,1))=102#

El significado de esta declaración sql: el código ASCII del primer carácter es102

>>> print(chr(102))  # 将ASCII码转换为字符
>>> f

¿Cómo puedo verificar el valor ASCII del carácter cuando la inyección es exitosa uno por uno?

Escritura de script 0x004

Exporte
Inserte la descripción de la imagen aquí
los resultados filtrados arriba y use el filtrado regular para filtrar los códigos ASCII correspondientes a las oraciones y caracteres inyectados

import re

number = []
with open("aa.txt","r",encoding="utf-8") as f:
    for i in f.readlines():
        flag_number = re.findall(r"\[Request URI: .*?=(\d+)%23\]",i,re.S) # 字符对应的ASCII码
        url_list = re.findall(r"\[Request URI: (.*?)\]",i,re.S)  # 注入的url
        if flag_number:
            print(url_list)
            number.append(flag_number[0])

Inserte la descripción de la imagen aquí
Aquí preste atención a la secuencia de declaraciones de inyección exitosas, es decir, los lugares encerrados en un círculo en la figura anterior están ordenados (desde el primer carácter hasta 38 caracteres), que es el flujo de ejecución de la inyección exitosa.

Conozca el código ASCII correspondiente al carácter y luego obtenga el carácter correspondiente a través del código ASCII.

Finalmente se agotóflag

import re

number = []
with open("aa.txt","r",encoding="utf-8") as f:
    for i in f.readlines():
        flag_number = re.findall(r"\[Request URI: .*?=(\d+)%23\]",i,re.S)
        url_list = re.findall(r"\[Request URI: (.*?)\]",i,re.S)
        if flag_number:
            print(url_list)
            number.append(flag_number[0])

print(number)
flag = ''
for i in number:
    flag +=chr(int(i))
print(flag)

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44032232/article/details/114297460
Recomendado
Clasificación