File Download 취약점이 존재하는 웹 서비스입니다.
flag.py를 다운로드 받으면 플래그를 획득할 수 있습니다.
Filename과 Content를 입력해서 Upload 하면, 메인화면 리스트에 추가되고 아래처럼 내용을 볼 수 있다.
위 화면을 통해 {Filename+Memo}가 리스트에서 선택한 파일의 제목이 되고 Content 안에는 입력한 Content값이 그대로 들어가는 것을 확인할 수 있다.
문제에서 flag.py를 다운받으라고 했으니 flag.py 파일을 만들면 된다.
리스트에서 보여지는 화면이 다운로드라고 생각하면 된다.
추가로 이 문제는 파일 다운로드 취약점을 이용하는 것이니 filename=flag.py 가 아니라 디렉토리 이동이 필수적일 것이다.
if filename.find('..') != -1:
return render_template('upload_result.html', data='bad characters,,')
하지만 위 코드로 인해 성립되지 않는다.
파일 경로와 파일명 필터링 미흡하여 ../를 이용해 상위 디렉터리에 접근 가능하다.
그래서 URL을 이용해야 한다.
Filename값이 URL의 name 파라미터에 그대로 노출된다.
name 파라미터 값에 ../flag.py 를 넣어주었다.