Hacking (CTF)/웹 해킹

[webhacking.kr] old-19번

gapsoo 2023. 9. 19. 01:52

 

문제를 클릭하면 나오는 초기 화면이다.

id칸에 "admin"이 기본값으로 입력되어있다.

 

 

위의 초기 페이지의 소스코드를 살펴보겠다.

 

 

알아낼 수 있는 게 없었다.

 

 

 

처음 화면에서 id 입력 칸에 적힌 "admin" 값을 바꾸지 않고 그대로 제출 버튼을 누르면 나오는 창이다.

 

이 페이지의 소스코드를 살펴보았다.

 

 

여기에서도 알아낼 수 있는 게 없었다.

 

 

 

 

뭘 해야할 지 모르겠어서 id 입력칸에 "123" 이라고 적고 제출했더니 위의 화면으로 넘어갔다.

logout 버튼을 눌러도 초기 화면으로 돌아오지 않는다.

 

이 페이지의 소스코드를 살펴보았다.

 

 

logout 버튼을 눌러도 초기 화면으로 돌아오지 않는 이유는

 

<input type=button value='logout' onclick=location.href='?logout=1'> 에서

사용자가 이 버튼을 클릭하면 location.href를 사용하여 현재 페이지를 새로고침하게 되기 때문이다.

이때, URL 파라미터로 logout=1이 함께 전송된다.

 

 

 

id 입력칸과 제출 버튼이 있었던 초기 화면으로 돌아가고 싶어서

웹해킹.kr 에서 내 계정을 아예 로그아웃 했는데, (19번 문제 안의 로그아웃 버튼을 눌렀다는 뜻 아님)

 

 

계속 이 화면이 나왔다.

 

왜 그런건지 고민해본 결과, 내가 한 활동들이 저장되어있는 걸로 보아

쿠키값과 관련이 있나? 하는 생각이 들었다.

그래서 쿠키값을 확인해보았다.

(쿠키값을 어떻게 확인하는지도 몰라서 여러 기능들을 만져보며 헤맸다.)

 

 

 

 

 

그러다가 이름이 userid 인 쿠키값을 발견했다. (매우 수상)

문제와 연관이 있을 것 같았다.

 

 

 

쿠키값인 "YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWJjODFlNzI4ZDlkNGMyZjYzNmYwNjdmODljYzE0ODYyY2VjY2JjODdlNGI1Y2UyZmUyODMwOGZkOWYyYTdiYWYz" 를 해석해야 문제를 풀 수 있을 것 같다는 생각이 들었다.

 

 

 

일단 저번 문제처럼 Base64 디코딩을 해보았다.

 

 

 

이 정신 없는 문자들은 뭐지...? 혹시나 싶어서 이 결괏값을 한 번 더 Base 64 디코딩해봤다.

 

 

 

 

이 방법이 아닌가보다!

 

 

 

문자 인코딩에 대한 위키백과를 보다가

내가 위에서 보았던 문자깨짐 현상이 왜 일어나는지도 알게 되었다!

 

 

서로 다른 문자의 인코딩 방식을 사용해서 그런 거였다.

그렇다면 Base 64 인코딩 방식이 아닌 다른 방식을 사용하면 문제를 풀 수 있을 것 같다는 생각이 들었다.

 

 

 

 

 

 

 

 

그런데 어떤 인코딩 방식을 사용해야 하는지 모르겠어 찾아보니

파이썬 chardet 라이브러리로 인코딩 종류를 감지할 수 있다고해서 시도해봤는데

어떤 이유에서인지 모르겠으나 실패했다...

 

 

 

더 이상 방법이 떠오르지 않아서 다른 블로그 글을 찾아보았다.

 

원래 값 -> md5 -> base64 -> url encode == 쿠키 값 이라고 한다.

 

이 사실이 맞는지 확인해보도록 하겠다.

 

 

 

 

 

쿠키값을 url 디코딩했는데, 디코딩 이전 값이랑 똑같이 나왔다.

여기서 혼란스러웠는데... 내가 입력한 값이 "123" 이라는 숫자여서

마지막 부분에 %3D가 안 붙어있을 수밖에 없었고

결과적으로 쿠키값을 url 디코딩한 이전과 이후의 값이 같았다.

 

 

다른 블로그 글을 보면 쿠키값 마지막에 %3D가 붙어있어서

url 디코딩하여 %3D를 =으로 바꿔주었고

마지막 부분에 =를 넣는 암호화 방식은 Base64 임을 알고 있으므로 Base64 디코딩을 하는 순서를 거쳐

마지막에 MD5 해쉬 함수를 사용한다는 사실까지 알아냈다.

 

 

 

아무튼 다음은 쿠키값을 url 디코딩을 한 값을(나의 경우에는 이전 이후 차이가 없다.)

다시 Base 64 디코딩한 결과값이다.

 

 

 

c4ca4238a0b923820dcc509a6f75849bc81e728d9d4c2f636f067f89cc14862ceccbc87e4b5ce2fe28308fd9f2a7baf3

 

이 값은 96 byte로, 내가 "123"을 대입했기 때문에

한 글자당 32 byte * 3 = 96byte 가 나왔음을 알 수 있다.

32자리 문자열은 흔히 MD5 해쉬 함수에 의해 나온다고 한다.

 

 

 

그래서 "123"에서 "1", "2", "3" 각각의 MD5값을 확인해보았다.

 

 

 

위의 결과를 합치면 

c4ca4238a0b923820dcc509a6f75849bc81e728d9d4c2f636f067f89cc14862ceccbc87e4b5ce2fe28308fd9f2a7baf3

 

가 나오므로 결국

 

원래 값 -> md5 -> base64 -> url encode == 쿠키 값 

 

이 과정으로 암호화한 것이 맞다는 것을 확인할 수 있었다.

 

 

 

 

정리를 해보자면 각각 문자열에 대한 md5값을 얻은 다음 문자열을 합치고 base64인코딩한 값을 쿠키값으로 넣는 것이다.

 

 

 

그러므로 "admin" 각각의 문자열에 대한 md5값을 얻으면 아래와 같다.

 

a = 0cc175b9c0f1b6a831c399e269772661

d = 8277e0910d750195b448797616e091ad

m = 6f8f57715090da2632453988d9a1501b

i = 865c0c0b4ab0e063e5caa3387c1a8741

n = 7b8b965ad4bca0e41ab51de7b31363a1

 

 

 

다음으로, 위에서 얻은 각각의 md5 값을 합치면 아래와 같다.

 

 

0cc175b9c0f1b6a831c399e2697726618277e0910d750195b448797616e091ad6f8f57715090da2632453988d9a1501b865c0c0b4ab0e063e5caa3387c1a87417b8b965ad4bca0e41ab51de7b31363a1

 

 

 

위의 값을 Base 64 인코딩한 값은 다음과 같다.

 

 

 

url 인코딩하기 위해 뒤에 '==' 만 '%3d%3d'로 바꿔주면 끝!

 

 

MGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjE4Mjc3ZTA5MTBkNzUwMTk1YjQ0ODc5NzYxNmUwOTFhZDZmOGY1NzcxNTA5MGRhMjYzMjQ1Mzk4OGQ5YTE1MDFiODY1YzBjMGI0YWIwZTA2M2U1Y2FhMzM4N2MxYTg3NDE3YjhiOTY1YWQ0YmNhMGU0MWFiNTFkZTdiMzEzNjNhMQ%3d%3d

 

 

를 쿠키에 넣어주고 새로고침하면 정답!

 

 

 

'Hacking (CTF) > 웹 해킹' 카테고리의 다른 글

[webhacking.kr] old-12번  (0) 2023.09.27
[Root Me] Javascript - Webpack  (0) 2023.09.26
[Root Me] Javascript - Authentication 2  (0) 2023.09.23
[Root Me] HTTP - COOKIES  (0) 2023.09.23
[webhacking.kr] old-42번  (0) 2023.09.18