🔥 웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩
위아래 1줄씩 띄우고 중요한 부분은 볼드 효과
📍 파일 업로드 취약점이란?
👉🏻 File Upload Vulnerability: 서버 사이드 스크립트에 적힌 코드가 비정상적인 파일을 업로드하여 사용자를 공격함
👉🏻 해당 공격을 당하게 되면 OS Command 공격처럼 서버에 명령어를 실행할 수 있게 됨
👉🏻 파일 업로드나 다운로드의 경우 웹 사이트에서 반드시 필요한 필수 기능에 속하기 때문에 많은 사용자가 해당 위험에 노출될 수 있음
👉🏻 방화벽이나 웹 쉘 솔루션을 통해 방어 가능
📍 공격 원리 분석
👉🏻 1) 파일 경로 + 파일 이름으로 이루어진 경로 파악
👉🏻 2) 파일 출력(File Output)
👉🏻 3) 웹 쉘 접근 및 실행을 하게 됨
📍 웹쉘이란 무엇인가?
👉🏻 Web(월드 와이드 웹) + Shell(사용자와 커널 간의 대화를 하기 위한 인터페이스)
👉🏻 즉, 웹 페이지상에서 원격지 서버의 시스템 명령어를 실행할 수 있는 도구이며 시스템 명령뿐 아니라 파일 업/다운로드, 조회 및 수정도 가능함
언어별 시스템 함수
언어 | 함수 |
PHP | passthru, system, `(백 쿼터), excl, popen, escapeshellcmd, eval, shell_exec, assert ... |
JSP | Runtime.getRuntime().exec("").processBuilder("") |
ASP | CreateObject("wscript.shell").exec("cmd/c"&cmd), eval, Execute ... |
ASPX | WinExec(), ShellExecute() ... |
📍 검증 로직 구현
👉🏻 확장자 검증
👉🏻 이미지 검증
👉🏻 파일 사이즈 검증
📍 확장자 검증 로직에 대한 이해
// ____ 확장자로 확인하여 업로드 불가한 확장자를 등록해 놓음
webshell.jsp
방식 | 장점 | 단점 | 알맞은 기능 |
블랙 리스트 방식 : 허용하지 않은 확장자만 막음 |
다양한 파일 업로드 가능 | 다양한 우회 가능성 존재 | 다수 파일 업로드 (예: 자료실) |
화이트 리스트 방식 (추천) : 허용한 확장자만 업로드 가능 |
우회 가능성이 제한적 | 다양한 파일 업로드 불가능 | 특정 파일 업로드 (예: 이미지 업로드) |
👉🏻 업로드(운동화.jsp) > 확장자 파싱 (.jsp) > 검증 (jsp가 업로드 가능한가?) > 통과/return
📍 대응 방안
👉🏻 파일명에 대한 검증
1) 확장자 검증
2) 서버 측에서 파일명 생성
crehacktive.png 라는 파일명이 있으면 > 시간-밀리세컨드나 랜덤 문자열로 서버에서 파일명 따로 생성하여 저장함!
위와 같이 진행하게 되면 사용자가 파일명 변조 불가능하여 아래 관점에 대해서 안전해짐
1) 보안적 관점
2) 예외상황 관점
👉🏻 올바른 업로드 경로(서브 사이드 스크립트가 실행되지 않는 경로) 설정
1) 웹 디렉터리 이외의 경로 - WEB-INF의 경우 서브 사이드 스크립트가 실행되지 않는 경로이므로 해당 경로로 설정하면 좋음
2) 스크립트 실행 권한 제거
...
String gubun = request.getParameter("gubun");
// \(역 슬래시) 문자를 /(슬래시) 문자로 치환
gubun = gubun.replace("\\", "/");
// gubun 변수에 대해 /, .. 문자 존재 시 경고창 출력 및 어플리케이션 종료
if(gubun.indexOf("/") != -1 || gubun.indexOf("..") != -1) {
out.println("<script>alert('허용되지 않은 문자 존재함'); history.back(-1);</script>");
return;
}
// 업로드 로직 진행
...