다른 방어법 중 하나인 확장자 검증이다.
파일 확장자에 따라 업로드를 허용할지 차단할지를 결정하며 필터링과 유사하게 확장자를 블랙 리스트나 화이트 리스트로 검증할 수 있고 장단 역시 유사하다.
당연히 화이트 리스트 방식이 블랙 리스트 방식보다 훨씬 안전하고 심지어 더 편하며 블랙 리스트 방식을 사용하면 많은 확장자들을 일일이 필터링해주어야 하고, 대소문자를 섞는 것도 방지해주어야 하기 때문에(.php를 .pHp로 바꾸는 등) 굳이 사용해야 할 이유가 없다.
$allow_list = ['jpg', 'jpeg', 'png', 'pdf', 'xlsx'];
if(in_array($extension, $allow_list)) {
//허용된 확장자일 경우
}else{
//허용하지 않은 확장자일 경우
}
화이트 리스트로 허용해줄 확장자들을 작성하고, 업로드된 파일의 확장자와 비교하여 허용하는 확장자면 업로드를 해주고, 허용하지 않으면 차단하는 방식이다.
나중에 허용해주어야 할 확장자가 생기면 리스트에 더 추가해주고, 빼고 싶은 확장자가 있으면 리스트에서 제외하면 되니 굉장히 심플하다!
허용하지 않고 있는 텍스트 파일을 업로드해보자.
입구컷 시원하게 당했다.
그럼 이번엔 악의적인 one-line webshell 파일을 우회하여 올려보자.
우회하는 방법은 저번 MIME 타입 우회와 동일하다. 프록시를 이용하여 중간에 파일 확장자를 살짝 변경해 줄 것이다.
이렇게 파일 확장자를 변경해주고 업로드하면
업로드가 정상적으로 됬다!! 그럼 우회 성공?!?!
??? : 님아 이게 무슨 우회 성공임. 물론 php는 허용해주지 않기 때문에 웹 셸 파일을 jpg 확장자로 바꿔 올렸다지만 그 때문에 이제 웹 셸 파일을 이미지 파일로 해석할 텐데 그러면 php 코드가 실행되지 않잖슴~~~ 이런건 컴맹도 알겠음
틀린 말이 아니다. 이제 저 웹 셸은 php 코드를 내포한 단지 이미지 파일이 되버렸다.
아무리 올라간 웹 셸 이미지 파일에 cmd 파라미터로 명령을 주어도 조용한 모습.
뭐야 이러면 솔직히 bypass에 성공했다고 하지도 못하겠고 확장자 검증만 해놓으면 쉽게 막히겠구나!!
는 아주 단편적인 생각. 컴퓨터엔 다양한 기능을 가진 프로그램이 존재하고 다양한 취약점도 존재한다. 취약점을 이용해 다른 취약점을 이용할 수도 있지만 기능을 이용하여 취약점을 위협적이게 변모시킬 수도 있다.
다음에 공부할 .htaccess 파일은 이 이미지 파일을 공격 파일로 바꿀 수 있다.
'File Upload' 카테고리의 다른 글
그 외의 설정들 + 대응 방안 (1) | 2024.08.18 |
---|---|
파일 시그니처 검증 (0) | 2024.08.15 |
.htaccess를 이용한 파일 오버라이드 (0) | 2024.08.14 |
MIME 타입 / Content-type 검증 + bypass (0) | 2024.08.08 |
파일 업로드 취약점 (0) | 2024.08.07 |