필터링하자!
모두가 잘 알듯이 웹 필터링 방식에는 화이트리스트 필터링, 블랙리스트 필터링이 있다.
화이트리스트 방식은 모든 리스트 목록을 다 차단하고 혀용 할 리스트만 허용하는 방식이다.
블랙리스트 방식은 차단할 리스트 안에만 있으면 차단하는 방식이다.
화이트리스트 방식이 보수적이고 폐쇄적이라서 보안에 강점이 있다.
보안성이 강화될수록 서비스는 더 안전하고 신뢰성이 높아질 것이다.
하지만 보안이 어느 선을 넘어가게 되면 안전한 서비스라는 엄청난 장점을 챙기지만 고객들의 불편함을 초래할 수 있다.
예시를 들어보면, 우리가 어떤 사이트에 로그인을 하려고 하면 일단 아이디와 비밀번호를 입력하는 것이 일반적이다.
하지만 김재균이 만든 사이트는 너무 무서워서 샤워를 하러 간 나머지 보안을 엄청나게 챙기려고 노력했다.
그 결과 로그인 할 때 아이디와 비밀번호를 입력하고 맞으면, 캡챠 인증을 해야 하고, 캡챠 인증이 완료되면 핸드폰 번호 혹은 메일로 본인을 인증한다. 해당 링크를 누르면 해당 링크 안에서 또 인증을 하는 방식으로,,,,,, 벌써부터 머리가 아파오기 시작한다.
이런 상황이 발생할 수 있기 때문에 보안과 편의성이 서로 균형을 맞춰가면서 웹사이트를 개발해야 한다!!
화이트리스트 필터링과 블랙리스트 필터링도 포함된다.
너무 보수적인 나머지 화이트리스트 필터링을 적용해 이미지 파일만 업로드하게 만들면, 동영상이나, ppt자료 등등 여러 중요 자료들을 옮기지 못할 수도 있다. 하지만 너무 풀어진 나머지 블랙리스트 필터링으로 php, html, exe 파일만 리스트에 추가하게 되면 bypass 문제나, 다른 악의적인 파일들을 upload를 할 수 있기 때문에 건전한 이용자 입장에서는 여러 파일을 지원하니 좋지만, 공격자 입장에서는 놀이터가 되는 것이다.
블랙리스트 필터링
extensions = ['php', 'exe']
uploaded_filename = 'example.jpg'
file_extension = uploaded_filename.split('.')[-1].lower()
if file_extension in extensions:
print("Nop!")
else:
print("Yes")
이 코드는 간단히 php나 exe가 파일확장자에 있으면 Nop을 출력하는 간단한 코드이다.
이 코드는 php3, phtml이나 html등 다른 확장자의 웹쉘을 올릴 수 있다. 아님 htaccess설정 파일을 업로드해서 웹쉘을 업로드할 수 있다.
화이트리스트 필터링
extensions = ['png', 'jpg']
uploaded_filename = 'example.jpg'
file_extension = uploaded_filename.split('.')[-1].lower()
if file_extension in extensions:
print("Yes!")
else:
print("Nop")
이 코드도 간단히 png와 jpg만 허용하는 방식이다.
다른 방안들
취약점을 막는 방법에는 여러가지 방법이 있다.
사실 필터링 방식은 잠재적 위험성이 많이 있다.
필터링 방식에서 bypass 상황이 나오고, 현재까지 알려지지 않은 bypass 방식 이외에도 잠재적인 방법들이 많이 숨어있다. 필터링 방식 이외의 다른 여러 가지 방법들도 고려를 해 봐야 한다.
웹 루트 외부에 파일 저장
파일 업로드 공격이 일어났을때 파일에 접근해서 웹 파일들을 다 삭제하는 공격이 일어날 수 있다.
이때 파일이 업로드되는 위치를 웹 루트 아래에 저장하지 말고 다른 루트에 올리는 방법이 있다.
Root
|
----System Dir - |.....|
|
Web Root - | images | settings
|
Uploads - | 230101.png | no.png |
해당 방식으로 Root를 다르게 올려서 접근을 못하게 할 수 도 있다.
디렉터리, 파일명을 숨기기
파일을 업로드한 후 파일 이름을 랜덤으로 바꾸거나 디렉터리를 노출시키지 않게 해서 접근을 어렵게 막는 방법도 있다.
경로 정보 숨기기
?path=img&file=2023.png
path에 img라고 요청을 보낸다. 직접적인 디렉토리의 위치를 입력하지 않는다. 백엔드에서 path=img라고 요청이 왔을 때 내부 로직에서 img에 맞는 디렉터리 위치에 파일을 저장하는 방식으로 작동할 수 있다.
파일 식별번호 사용
url?fileld=142
DB에 파일명과 파일 정보를 저장하는 방식이다.
식별번호를 사용하여 DB에 있는 정보를 사용하는 방식이다. DB를 사용하기 때문에 SQLi취약점도 생각을 해서 권한이 없는 파일에 접근하거나 다운로드를 하지 못하게 검증 절차를 추가해서 문제가 없게 구성해야 한다.
htaccess 설정
.htaccess 파일은 디렉토리 설정 파일로 보통 디렉토리 접근 제어, 디렉토리 설정등의 역할을 한다
php등의 파일을 접근을 제어해, 일반 클라이언트에서 접근을 못하게 막을 수 있다.
혹시 파일이 업로드되더라도 파일에 접근을 제어해 403 에러를 리턴하게 설정할 수 있다.
만약 디렉토리 파일에 접근하게 되면 해당 코드만 노출이 되고 서버 딴에서 실행되지 않는 모습을 볼 수 있다.
물리적 영역 분리
별도의 파일을 저장할 서버를 구축하여 저장하는 방식을 사용할 수 있다.
업로드 파일을 DB에 저장하는 방법이 있는데, 작은 용량의 경우 DB에 저장해서 사용할 수 있다.
이때도 SQLi 취약점에 대해서 신경써야 한다.
악의적 함수 차단
웹쉘에서 악용이 가능한 함수를 차단하는 방식이 있다.
예를 들어서 php딴에서는
exec, shell_exe, system, popen
등등이 있다.
소스코드를 들쳐봐서 함수들을 파싱하고 블랙리스트에 들어가 있으면 함수 자체를 차단하는 방법이 있다.
review
파일업로드 대응방안에 대해서 간단하게 찾아봤는데 여러 방식들을 알았다.
파일업로드 공격에 대해서 더 자세히 공부하면서 여러 방식들을 공부하고 해당 방식이 막히는 조건등을 공부해서 방어하는 법도 더 자세히 공부하고 싶다.
'web hacking' 카테고리의 다른 글
SQL Injection (0) | 2023.09.09 |
---|---|
내 web shell은 어디에... (0) | 2023.09.07 |
HTML/CSS Injection (0) | 2023.07.28 |
정보빼가는 SQLi 와 SQLMAP (0) | 2023.07.24 |
SSTI띠띠리리~~ (0) | 2023.07.21 |