파일 다운로드 취약점이란?
•
다운로드 권한이 없는 파일에 대해서 다운로드가 가능한 취약점
다운로드 권한이 없는파일
- 웹 서버 내부 설정파일(민감정보가 포함된 파일)
- 웹 페이지 소스코드 (asp, jsp, php 등)
- OS 파일
이 취약점은 어떤 부분에서 존재하는가?
•
다운로드 받을 수 있는 기능이 존재하는 웹 페이지
ex)
리눅스 웹 서버의 기본 디렉터리 : /var/www/html/
리눅스의 중요한 설정파일
-> /etc/shadow
-> /etc/passwd <br>
웹 서비스의 파일 다운로드 기능 권한 : 웹 서버 권한
-> /etc/shadow (400) -r-------- (웹 서버가 접근할 수 없음)
-> /etc/passwd (644) -rw-r--r-- (웹서버가 접근할 수 있는 권한이 존재)
파일 다운로드 취약점이 존재한다면 기본 디렉터리에서 벗어나 /etc/passwd와 같은 설정파일을 다운로드 받을 수 있다
CF) Spring/전자정부 Framework 인 경우에는 웹서버 내부 민감정보 파일의 경로 및 파일명이 동일
•
/WEB-INF/web.xml
•
/server.xml
파일 다운로드 취약점은 왜 발생하는가?
•
다운로드 경로가 상대경로로 되어있는 경우 ../ 를 사용하여 타고 넘어갈 수 있다
•
경로 순회 문자 (.. / \\)를 필터링하고 있지 않으며, 다운로드 기능을 가진 웹 페이지 제작 시, 첨부파일의 경로를 상대경로로 지정해둔 경우 파일 다운로드 취약점이 발생할 수 있음
점검 시 사용하는 경로 순회 문자
-> ../ ..\ <br>
필터링이 걸려있는 경우
-> 인코딩해서 사용
--> %2E%2E%2F (../), %2E%2E%5C (..\\)
실제 공격
•
다운로드 실행 시 보통 파일명, 해당 파일의 위치가 함께 파라미터 값으로 전송됨
→ 파일명 = [abc.txt]&경로 = (upload_file)
→ 해당 파라미터 값을 웹서버가 넘으면 웹서버는 다음과 같이 파일을 찾음
/기본 디렉터리/~ ~/upload_file/[abc.txt] -> 이 위에 있는 파일을 사용자에게 전송
•
파일명에 경로순회 문자를 같이 넣어서 전송, 원래 지정위치를 벗어나 다른경로에 있는 파일을 다운로드 받을 수 있다
→ 파일명 = [../../../../abc.txt]&경로 = (upload_file)
→ 해당 파라미터 값을 웹서버가 넘으면 웹서버는 다음과 같이 파일을 찾음<br>
/기본 디렉터리/~ ~/upload_file/[../../../../abc.txt]
→ upload_file 보다 상위에 위치한 디렉터리의 파일을 사용자가 다운로드
왜 위험할까?
⇒ /demoshop/shop_board/~ ~ ~/upload_file/webshell.jpeg.asp
⇒ /demoshop/shop_board/upload_file/~ ~ ~/webshell.jpeg.asp
위와 같은 경로로 파일이 업로드 되었을 때 해당 경로를 유추하는 것은 불가 (공격 불가)
그러나 경로 순회문자를 여러번 사용하면 원하는 디렉터리로 이동 가능
•
실제 upload_file의 위치가 다음과 같을 때
/demoshop/shop_board/~ ~ ~/@@@/###/$$$/upload_file/webshell.jpeg.asp
해당 위치에 다운로드 취약점이 존재한다면
⇒ 파일명 = [../../../../../../../../../../../../../../etc/passwd]&경로 = (upload_file)
위와 같이 경로 순회문자를 여러번 사용하여 최상위 디렉터리로 이동한 후 원하는 위치로 이동하여 다운로드 시도
+) 웹 페이스 소스코드 자체를 다운로드하려는 시도도 많다
•
게시글에서 다운로드를 하기위해 첨부파일을 클릭했을 때 전송되는 Request를 Burp suite 로 잡아보면 다음과 같은 경로가 노출
나중에 확인해서 적어야함
→ shop_download.asp 해당 소스코드 파일을 다운로드 할 수 있다면 다운로드와 관련된 로직을 전부 알아낼 수 있음
•
공격 시도
⇒ 파일명 = [shop_download.asp]&경로 = (upload_file)
⇒ 파일명 = [../shop_download.asp]&경로 = (upload_file)
⇒ 파일명 = [../../shop_download.asp]&경로 = (upload_file)
파일 다운로드 취약점 실습
대응방안
•
경로 순회 문자 필터링(.. / \\)
◦
replace();
→ replace는 우회 가능 (..../)
→ 따라서 .. , / 이런식으로 나눠서 replace 하는것이 좋다