풀이일 : 2023/05/25
문제 접속 링크에 접속하면 Home 페이지에 지금까지 업로드 한 메모를 확인할 수 있고, Upload My Memo 페이지로 이동하면 새로운 메모를 업로드할 수 있다.
이번에는 문제의 소스 코드를 함께 살펴보자.
문제의 소스코드는 app.py 파일에는 세 가지의 페이지가 존재하는 것을 확인할 수 있다.
첫 번째는 Home 페이지
업로드된 메모 파일들의 리스트를 화면에 보여준다.
두 번째는 upload 페이지
사용자로부터 filename과 content를 받아오는 것을 확인할 수 있다.
만약 filename에서 '..'이라는 문자열이 나오면 'bad characters,,'라는 결과를 화면에 출력한다.
filename에 문제가 없는 경우 content를 UPLOAD_DIR에 write하는 것을 확인할 수 있다.
-> 파일명에 '..'가 포함되면 'bad characters,,'가 출력된다.
마지막으로 read 페이지가 있다.
filename을 받아 해당되는 파일을 UPLOAD_DIR에서 찾아 읽는 방식이다. 파일이 존재하지 않는 경우 에러 메시지를 출력한다. 이 때 주목해야 할 점은 read를 위해 파일을 다운 받을 때에는 filename을 필터링 하지 않는다는 점이다.
이전에 업로드 한 read?flag.py라는 제목의 메모를 읽어보자.
메모의 이름을 클릭하면 메모의 내용과 함께 read 페이지에 파일명이 전달되는 방식을 확인할 수 있다.
/read?name=파일명 의 방식이다.
문제에서 플래그는 flag.py에 존재한다는 것을 알 수 있다. 위의 방식을 이용하여 직접적으로 flag.py에 접근해 보자.
UPLOAD_DIR에는 flag.py가 없다.
그렇다면 상위 디렉토리에 접근해 본다.
flag.py 다운로드에 성공하였다!
플래그는 DH{uploading_webshell_in_python_program_is_my_dream}