간단한 웹해킹 문제이다.
문제페이지 주소와 소스코드가 주어진다.
반응형
문제페이지에 접속하면
까만 화면에 이렇게 하얀 글씨가 써있다.
이거 외엔 별다른 기능이 없어서 소스코드를 바로 열어봤다.
# run via `uvicorn app:app --port 6000`
import os
SECRET_SITE = b"flag.local"
FLAG = os.environ['FLAG']
async def app(scope, receive, send):
assert scope['type'] == 'http'
headers = scope['headers']
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
[b'content-type', b'text/plain'],
],
})
# IDK malformed requests or something
num_hosts = 0
for name, value in headers:
if name == b"host":
num_hosts += 1
if num_hosts == 1:
for name, value in headers:
if name == b"host" and value == SECRET_SITE:
await send({
'type': 'http.response.body',
'body': FLAG.encode(),
})
return
await send({
'type': 'http.response.body',
'body': b'Welcome to the _tunnel_. Watch your step!!',
})
소스코드를 살펴보니
HTTP 요청 패킷의 헤더를 가지고 장난을 치는것 같았다.
for name, value in headers:
if name == b"host":
num_hosts += 1
헤더 목록을 가져와서
헤더 중 이름이 host 인게 있다면
num_hosts 를 +1 해주고
if num_hosts == 1:
for name, value in headers:
if name == b"host" and value == SECRET_SITE:
await send({
'type': 'http.response.body',
'body': FLAG.encode(),
})
return
host 헤더의 값이
SECRET_SITE 라면
FLAG 를 리턴하게 되는 구조이다.
SECRET_SITE = b"flag.local"
SECRET_SITE 는
flag.local 로 맨 위에 정의되어 있다.
Burp Suite 를 이용해
문제페이지 접속할때의 요청 패킷을 캡쳐하면
host 헤더부분에
현재 웹 서버의 주소가 그대로 찍히게 된다.
이 부분을 SECRET_SITE 에 정의되어 있는
flag.local 로 바꿔서 요청 패킷을 보내주면
응답 패킷에서 플래그를 찾을 수 있다.
반응형
'CTF > 웹해킹' 카테고리의 다른 글
[angstromCTF] shortcircuit - 웹해킹 / Javascript (68) | 2023.05.17 |
---|---|
[angstromCTF] directory - 웹해킹 / Dirbuster (77) | 2023.05.16 |
[angstromCTF] Celeste Speedrunning Association - 웹해킹 / Python (72) | 2023.05.14 |
[Space Heroes CTF] Sanity Check In Space - 웹해킹 (68) | 2023.05.05 |
[Space Heroes CTF] Bynary Encoding - 암호학 / Binary / HxD (80) | 2023.05.03 |