File Download 취약점
이번에는 파일 다운로드 취약점에 대해서 살펴보도록 하겠습니다.
말 그대로 허용된 파일 외의 파일이 다운로드가 가능한 취약점입니다. 웹 애플리케이션에서 파일명을 필터링하지 못했을 경우 발생합니다.
파일 다운로드 취약점 패턴은 다음과 같습니다.
1. 다운로드 가능한 파일이 올려져 있다.
2. 해당 파일-우클릭-속성-주소에 상대경로와 패스명이 나온다. (이를 이용하여 파일 다운을 받을 수 있습니다.)
아래는 예시입니다.
보통 ../을 7개~10개정도 입력하면 대부분 커버가 가능합니다.
(http://server/link.php?file=../../../../../../../../etc/passwd)
(http://server/link.php?file=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd) -> URL인코딩
(http://server/link.php?file=Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==) -> BASE64인코딩
Tip이 있습니다.
윈도우는 대소문자를 구분하지 않지만, 리눅스는 대소문자를 구분합니다.
이것을 구분하여 이 서버가 윈도우 기반인지 리눅스 기반인지 알 수 있습니다.
대문자로 바꿔도 그대로 다운이 받아진다면 윈도우라고 쉽게 알 수 있습니다.
또한, jsp나 php이면 리눅스일 가능성이 높습니다.
실습해보도록 하겠습니다.
직접 구글에서 파일 다운로드 사이트를 검색하여 취약점을 찾아봅시다.
① 파일 다운로드 사이트 검색
② 파일 다운로드 여부 확인
검색된 사이트에서 직접 파일 다운로드가 가능한지 살펴봅니다.
③ 다운로드 경로를 복원
검색된 결과의 패턴은 아래와 같습니다. 보안상 캡처하지는 않았습니다.
홈페이지 명에서 우클릭-속성을 클릭하여 url을 복사합니다.
홈페이지 명 URL 설명 |
이것을 디코딩합니다. 보안상 가렸습니다.
실제로 다운로드가 되는지 확인해봅니다.
http://~~~~~/~~~/download.php?path=../../../../../../../../../../etc/passwd
대응책
아래의 코드처럼 특수문자 필터링을 합니다.
1 2 3 4 5 6 | if(strstr($filename,"../")||strstr($filename,"..\\")) { echo "<script>alert('Access Denied!!')</script>"; echo "<script>location.href('/index.html')</script>"; exit(); } | cs |
직접 적용해보니 필터링이 잘 되는 것을 확인할 수 있습니다.