※ 경고!! 개인적으로 1분 만에 푼 문제로써.. 되게 쉽습니다....
1. 코드 분석
대충 웹사이트와 코드를 보면 파일 이름(filename)과 노트(note)를 입력하여
서버폴더 내에 notes/ 디렉토리 안에 해당 파일들을 저장하고,
파일이름을 검색하면 다운로드할 수 있도록 되어있다.
즉, 노트를 저장하고 다운로드할 수 있는 서비스인 것이다. (KTX Notes 라는 이름이 KTX 처럼 빠르다는... 추측)
실행된 웹 페이지
홈 페이지, save(post) api, download(get) api 에 대한 코드
여기서 중점은 우리가 타깃으로 하는 flag 파일을 따로 서버파일인 app.py 파일에서는 불러오지 않는 것 같고
따로 도커파일에서도 해당파일 관련 설정은 없다.
그렇기에 파일이름인 notes/ 디렉터리 안에 있는 파일을 가져오는 download 라우터는 flag 파일을 다운로드할 수 없다.
2. os.path.join()의 취약점
하지만 다시 생각해 보면 파일을 가져올 때 사용하는
os.path.join(NOTES_DIR, filename)
💡 코드설명 : "os.path.join()"
파일이나 디렉토리 경로를 올바르게 연결하여 파일의 전체 경로를 생성 하는 함수
이 코드의 문법을 보면 기본적으로 ('기준디렉터리', '파일 이름')이다.
서버 라우터에서 디렉토리로 사용하는 NOTES_DIR을 notes/ 로 지정함
기준 디렉터리를 notes/ 로 지정하였지만 사실은 파일이름(filename) 에도 디렉토리 입력이 가능하다.
즉 상위폴더로 이동하는 ../ 를 입력하고 flag를 입력한다면,
notes ->./ -> flag 이런 식으로 접속할 수 있는 것이다.
3. 공격하기
결국 notes라는 디렉터리를 기준으로 상위로 이동 후 flag 파일을 탈취할 수 있는 아주 간단한 문제이다.
웹사이트에서 download 부분의 filename에 '../flag'를 입력한다면 flag파일을 다운로드할 수 있다.
결국 flag 값은 HACKCAMP {sup3 r_dup3 r_fast_and_c0 nvenient_KTX_bBUShUNGbBASHuNg}가 된다.
방문해 주셔서 감사합니다!