웹/모의해킹 스터디 복습
모의해킹 스터디 15주차(2): 파일 업로드 공격 대응 방안
whydontyoushovel
2025. 2. 12. 04:39
목차
- 파일 업로드 대응 방안
1) 파일 이름 난독화
2) 확장자 화이트리스트 기반 필터링
3) DB에 파일을 저장
4) NAS 서버
- 파일 다운로드 취약점
File Upload
공격자가 원하는 임의의 파일을 서버에 업로드할 수 있는 공격
웹쉘은 대표적인 File Upload 공격 시나리오 중 하나
File Upload 대응 방안
실행 파일이 실행되지 않게 하기!
- 파일 이름 난독화
- 확장자 화이트리스트 기반 필터링
- DB에 파일 저장
- NAS 서버에 파일 저장
1) 파일 이름 난독화
경로와 파일 이름, 확장자를 난독화시켜서 요청하기 어렵게 만듦
- 내가 만든 조잡 서버
(**왜 png 파일이 웹쉘로 실행되는지 궁금하시면 이 블로그의 "이미지 웹쉘의 실체" 게시글을 추천드립니다.)
파일명과 저장된 디렉토리가 그대로 보이고 있음 |
이미지 태그 소스를 사용하면 경로가 노출되기 쉽지만 파일명까지 그대로 사용하면 공격자가 업로드한 악성 파일을 특정하기 쉬워지고 파일을 요청하면 파일 내의 악성 스크립트가 실행될 수 있음 |
(+ 이미지 태그 없이 이미지를 출력하는 방법도 많은가 봄)
- 파일 이름 난독화
https://example.com/download.php?boardId=qw23%awega%uh35dgaw353a
위와 같이 파일에 ID를 부여해서 해당 식별값을 기준으로 DB 조회 색출한 파일의 저장 경로를 토대로 파일 다운로드 진행 |
- 파일 이름 난독화의 장점과 단점
장점 | 1) 공격자가 자신이 업로드한 파일을 특정하기 어려움 2) 비교적 ... 품삯이 덜 드는 느낌 |
단점 | 1) SQL Injection 등의 다른 취약점이 발견되면 파일 경로를 알아낼 수 있음 |
- 파일 이름을 난독화하면 공격자는 자신이 업로드한 파일이 무엇인지 몰라 실행하기 어려워짐
- 하지만 다른 취약점을 통해 경로가 노출될 우려가 있으므로 추천하는 방법은 아님
2) 확장자 화이트리스트 기반 필터링
.jpg / .pdf / .txt 이런 것만 통과시킴
(자바스크립트 및 php 필터링 코드 업데이트할 예정)
- 확장자 화이트리스트 기반 필터링의 장점과 단점
장점 | 1) 업로드 자체를 막을 수 있음 2) 얘도 품삯이 비교적 덜... |
단점 | 1) 필터링은 우회의 여지가 있음 2) 시스템 환경에 따라 널 바이트 인젝션으로 우회할 위험이 있음 |
- 확장자를 화이트리스트 기반으로 필터링하면 업로드 자체를 제한할 수 있음
- 하지만 언제나 그렇듯 필터링은 우회 가능성이 존재함
3) DB에 파일 저장
파일을 바이너리째로 DB에 저장
- 근본적인 대응 방법임
(BLOB/ CLOB 자료형으로 DB에 저장하기 실습 추가할 예정)
- DB에 파일을 저장하는 방법의 장점과 단점
장점 | 1) 파일을 읽으려면 백엔드에서 바이너리 파일을 다른 형식으로 변환해야하므로 url로 접근할 수 없음 2) 파일이 서버에 저장될 때와 달리 php 엔진이 실행될 여지가 없음 -> 즉, 웹쉘 등의 코드가 실행될 여지가 전혀 없음 |
단점 | 1) DB 환경에 따라 파일을 바이너리로 저장하기 부담스러울 수 있음 |
- DB에 파일을 바이너리 형태로 직접 저장하는 방식은 사용자가 파일에 직접 접근할 가능성을 차단함
- 하지만 DB 서버에 부하가 발생할 수 있고 속도가 감소할 수 있음
4) NAS 서버에 파일 저장
php 등을 실행시키지 못하는 서버를 파일 저장 경로로 설정
- 파일만 저장하는 외부 서버를 둠
- 해당 서버에선 php 등 서버측 스크립트 엔진을 설치하지 않음
장점 | 1) 뭘 올리든 NAS 서버에 서버측 스크립트가 설치되어있지 않은 이상 실행시킬 수 없음 |
단점 | 1) 서버 유지 비용..? |
- 사용자가 업로드한 파일을 외부 서버에 저장하고 스크립트 엔진을 설치하지 않아 악성 코드가 실행될 염려가 없음
이 서버에 대한 보안도 더해야하는 거 아닌가..? 침투테스트 관점에서 보기에 어떨지 모르겠음
NAS 서버에 대한 정보를 더 찾아봐야겟음
File Download 취약점
파일 업로드랑 아아아주 유사
대응 방안도 또이또이
- 관련 코드
<?php
$filepath = "./uploads";
$filename = $_GET['filePath'];
$realFile = $filepath . $filename;
//$realFile 경로에서 파일 가져와서 다운로드
?>
- 위와 같이 파일 경로를 GET 방식으로 받을 경우 공격자는 서버에 있는 임의의 파일을 다운로드할 수 있음
예시 | download.php?fileName=/../../../../../../../../etc/passwd 로 서버측 passwd 파일을 다운받을 수 있다는 뜻 |
장점 | 서버의 소스코드를 다운받을 수 있으며 이를 통해 추가 취약점을 발견할 수도 있음 |
단점 | 웹쉘이나 파일 인클루드 취약점 등과 달리 소스코드를 실행시킬 수는 없음 |
- 다운로드 취약점이 있다는 건 파일 업로드 취약점에서 완전히 자유롭진 않다는 뜻인 것 같음
▷ POC
1) 리눅스:
/etc/passwd
2) windows:
\boot.ini
\winnt\win.win