웹 개발을 위해 꼭 알아야 하는 보안 공격들
SQL Injection
: 서버에서 실행되는 SQL을 악의적으로 이용하는 공격
: 기존 SQL에 악의적인 SQL 구문을 삽입하여 데이터를 탈취하거나 삭제
- 메커니즘
: 클라이언트로부터 받은 파라미터를 서버에서 SQL 문에 그대로 쓸 경우 WHERE 절에 1=1과 같은 TRUE가 들어가는 파라미터만 보내줘도 쉽게 수행가능
- 해결 방법
: \n, \t, |, #, --, &과 같이 문제가 될 수 있는 문자열을 필터링 및 이스케이프 수행
: DB 쿼리 후 PlaceHolder에 해당하는 데이터만 응답하거나 DB에 보냄
: 파라미터 밸리데이션
※ PlaceHolder
: 사용자가 어떤 정보를 입력해야하고 어떤 액션을 취해야하는지 안내하는 힌트메시지
Error based SQL Injection
: 일부러 SQL 에러를 발생시켜서 원하는 정보를 취득하는 공격 기법
: SQL 오류를 통해 단편적인 DB 정보를 얻을 수 있다는 점을 이용
- 해결 방법
: SQL 오류 메시지가 노출되지 않도록 가공된 오류 메시지를 응답해야한다
Blind SQL Injection
: 쿼리 결과의 참/거짓 정보를 보고 원하는 정보가 존재하는지 추론
: DB, 테이블, 컬럼명을 파악할 수 있음
- 해결 방법
: 파라미터 밸리데이션
Union SQL Injection
: Union 명령을 통해 다른 테이블의 정보까지 취득
- 해결 방법
: 파라미터 밸리데이션
Cross-Site Scription (XSS) (Stored XSS)
: 웹 페이지에 악성 자바스크립트를 삽입하는 공격
: 사용자가 정보를 입력할 수 있는 게시판 같은 페이지에 JS 코드를 입력
: 브라우저에서 쿠키를 조작하여 해커가 원하는 곳으로 정보를 보낼 수 있다
- 해결 방법
: DB에 데이터를 저장할 때 HTML 필터링 후 저장 (<, >, script, style, &, / 등)
: 파라미터 밸리데이션
: 프론트엔드에서의 필터링
Reflected XSS
: 입력을 그대로 브라우저에 출력
: 입력창에 <script> ... </script> 와 같은 스크립트 태그를 입력
- 해결 방법
: 서버의 파라미터 밸리데이션 및 프론트엔드 필터링
: HTML 문자를 특수문자 코드로 변경하고 리다이렉션을 수행 (최근에는 브라우저에서 방어)
DOM Based XSS
: 서비스의 스크립트를 이용하여 DOM에 악의적인 스크립트가 노출
: 서버를 타지 않고 DOM을 조작하기 때문에 문제를 찾기 어렵다
- 해결 방법
: 프론트엔드에서 필터링 (React나 Vue에서 어느 정도 XSS가 방어가 되나 개발자의 실수로 취약점이 드러날 수 있음)
CSRF Attack (Cross-Site Request Forgery)
: 공격자가 서비스 사용자를 이용하여 요청을 보내는 공격
: UI가 동일한 피싱사이트를 통해 정보를 탈취하고 서버로 부터 정상적으로 정보를 탈취
- 해결 방법
1) Referer Check
: HTTP Referer를 확인하여 허용된 Referer의 요청만 허락하도록 설정
: HTTP 변조를 통해 쉽게 뚫을 수 있음
2) CSRF Token
: 모든 요청에 토큰을 발급하여 서버에서 검증
3) CAPTCHA
: 사람이 요청한 것이 맞는지 이미지 등을 통해 검증
Command Injection
: 쉘을 실행시키는 로직을 이용한 공격
: 시스템 권한이 탈취되는 것과 동일
: Java의 System.runtime(), 자바스크립트의 process.exec() 등 쉘 명령을 실행시키는 함수를 이용
- 해결 방법
: 쉘 명령을 실행 시키는 시스템 함수를 사용하지 않기 (사용 하더라도 파라미터를 통해 직접 실행이 불가하게 할 것)
: 꼭 사용해야한다면 |, &, ;, <, >과 같은 민감한 문자 필터링
File Upload Attack
: 공격 스크립트가 담긴 파일을 서버로 업로드
: WebShell이 가능한 코드가 담긴 파일을 업로드 하고 해커가 URL을 통해 접근이 가능해지면 실행
- 해결 방법
: 확장자와 파일 타입을 검사하여 허락된 타입만 저장
: 해커자 파일을 찾을 수 없도록 업로드 파일의 이름과 확장자를 난수화하여 저장
: 특수 문자가 포함된 경우 업로드 차단 (Null Byte Injection 방지)
JavaScript Injection
: 브라우저에 자바스크립트를 삽입 시키는 공격
: 클라이언트 사이드에 민담한 데이터를 넣었을때 가능
: 브라우저에서 제공하는 Console을 통해 조작 가능
- 해결 방법
: 클라이언트에 민감한 데이터를 Plain하게 저장하지 않는다
: 데이터 유효성 검사가 필요하면 서버에서 처리하도록 한다
: 클라이언트에서 로직을 결정하지 못하게 한다
DDos (Distributed Denial of Service)
: 분산된 시스템을 이용하여 서버에 비정상적으로 많은 트래픽을 보내 마비 시키는 방법
- 해결 방법
: 서버가 죽지 않도록 확장 가능한 부산 시스템을 설계
: 공격 IP를 필터링
: 서비스 지역 외 IP 차단
: DDos를 막아주는 전문 업체의 솔루션 구매
Dictionary Attack
: 미리 데이터베이스에 등록해놓은 수많은 문자열을 암호로 대입하는 공격 (브루트 포스의 일종)
- 해결 방법
: 의미가 있는 간단한 단어에 대해 비밀번호로 등록할 수 없도록 서버에서 검증
Rainbow Table
: 평문을 해시 함수로 만든 문자열을 모두 저장시켜놓은 표
: 계정 데이터 탈취 후 원문을 알아낼때 사용
- 해결 방법
: Salt 사용
: Key Stretching
: PBKDF2, BCrypt 등 암호화 알고리즘 사용 (Salt와 Key Stretching도 됨)
Reference