반응형
SMALL
■ file vulnerability를 통한 공격을 위한 드림핵 file-download-1 풀이
■ file vulnerability (파일 취약점) 이란?
- 파일을 업로드 하거나 다운로드 하는 과정에서 발생하는 취약점, 업로드와 다운로드 취약점 으로 구분된다.
■ upload vulnerability ( 업로드 취약점 ) : 파일을 업로드를 하는 과정 발생하는 취약점, GCI ( Common GateWay Interface ) 로 실행되는 파일을 업로드해 시스템의 임의 명령어를 실행하거나, HTML 파일을 업로드하며 xxr ( cross-site-scripting) 공격을 수행할 수 있음,
또한 path traversal 취약점 과 연계하여 폴더에서 벗어난 루트에 공격을 실행할 수 있다.
■ download vulnerability ( 다운로드 취약점 ) : 다운로드 과정에서 발생하는 취약점, filepath 롤 통하여 path traversal 을 발생 시키고 이를 통하여 시스템 내부의 정보를 해킹 할 수 있다.
path traversal : 지정되지 않은 경로를 탐색하는 행위
CGI ( common gateway interface ) : 웹 서버와 외부 프로그램 간의 통신을 위한 표준 방법
■ 문제
File Download 취약점이 존재하는 웹 서비스입니다.
flag.py를 다운로드 받으면 플래그를 획득할 수 있습니다.
■ 웹사이트 생김새
1. index.html
- 보낸 파일을 목록화 하여 보여주는 사이트 인 것 같다.
2. update.html
- 파일을 직접 작성하여 업로드 할 수 있는 페이지로 보인다.
- 아무거나 작성해서 보내보면 파일업로드 및 index로 리다이렉트 되고 방금 보낸 파일 목록을 볼 수 있다.
3. read.html
- 목록을 누르면 내가 방금 작성한 파일의 내용을 읽을 수 있다.
■ 소스분석
- deamhack 에서 제공해준 app.py 파일을 분석해보자
- app.py
# file save dir
UPLOAD_DIR = 'uploads'
@APP.route('/')
def index():
files = os.listdir(UPLOAD_DIR)
return render_template('index.html', files=files)
파일이 존재하는 지정 경로를 읽어 html 템플릿으로 띄워주는 역할 인 것같다.
@APP.route('/upload', methods=['GET', 'POST'])
def upload_memo():
if request.method == 'POST':
filename = request.form.get('filename')
content = request.form.get('content').encode('utf-8')
if filename.find('..') != -1:
return render_template('upload_result.html', data='bad characters,,')
with open(f'{UPLOAD_DIR}/{filename}', 'wb') as f:
f.write(content)
return redirect('/')
return render_template('upload.html')
■ 파일을 업로드해주는 함수가 동작하는 것 같다.
■ filename.find 에서 " .. " 이 존재하면 에러 페이지로 강제 이동 아니라면 파일을 " 지정디렉토리/파일이름 " 으로 저장해주는 것 같다.
■ .. 을 제어하는 것을 보니 flag 는 바로 상위 디렉토리에 있는 것 으로 유추해 볼 수 있을 것 같다.
■ 해당 함수에서는 path traversal 이 불가능 할 것 같다 .
■ 취약점 발견
@APP.route('/read')
def read_memo():
error = False
data = b''
filename = request.args.get('name', '')
try:
with open(f'{UPLOAD_DIR}/{filename}', 'rb') as f:
data = f.read()
except (IsADirectoryError, FileNotFoundError):
error = True
return render_template('read.html',
filename=filename,
content=data.decode('utf-8'),
error=error)
■ 해당함수에는 파일 목록을 눌렀을 때 파일을 인코딩해주고 내용을 보여주는 것 같다.
■ 해당 함수는 따로 파일 경로 및 파일 이름에 대하여 필터 해주는 값이 없다. 이 점을 활용해야할 것 같다.
- 다시 read 하는 쪽으로 가보니 url에 현재 파일이름을 담아서 보내주는 것 같다 .
■ Url 에 아까 못가게 막아두었던 .. 과 flag.py 를 적으면 어떻게 될까?
풀었다! 초급문제지만 해킹은 참 재미있다 .
혹시 몰라서 웹셸을 넣어서 CGI 도 시도 해봤는데 그건 안되더라 ..
LIST
'Programming > python' 카테고리의 다른 글
[ Python ] Django auth 모듈을 사용해서 로그인, 로그아웃, 회원가입 구현 (2) | 2024.07.04 |
---|---|
[ Python ] FastApi 로그 처리 (2) | 2024.06.13 |
[ Python ] FastApi 라우터 설정 및 범죄데이터 json 으로 return 하기 (0) | 2024.05.23 |
[ Python ] pandas, pdfplumber 를 사용한 범죄통계 PDF 데이터 전처리 (0) | 2024.05.22 |
[ Python ] Mac에서 Pycharm, Conda 사용해서 FastApi 설치 및 테스트 (0) | 2024.05.20 |