SQL Injection이란 ?
SQL Injection (SQL 삽입)은 웹 해킹을 접한다면 가장 먼저 배우는 공격 기법인 만큼 간단하지만 아주 강력한 공격이다 이름처럼 데이터베이스에서 임의의 SQL문을 실행할 수 있도록 명령어를 삽입하는 공격 유형이다. 응용프로그램의 보안상의 허점을 이용해 데이터베이스를 비정상적으로 조작하며, 이로 인해 기록이 삭제되거나 데이터가 유출될 수 있다.
1.SQL 삽입 공격은 보통 사용자가 input form에 직접 무언가 작성하는 상황에서 발생한다.
예를 들어 로그인을 한다면 웹사이트에 로그인할 대 입력한 아이디 값과 패스워드 값을 이용해 바로 데이터베이스에 접근한다 만약 클라이언트가 kimkoding이라는 아이디 값을 보낸다면 대략적인 코드는 다음과 같을 것이다
SELECT *
FROM users
WHERE auth='admin'
AND id='kimcoding';
2. 공격자는 input form에 일반 텍스트(아이디 및 패스워드)가 아닌 SQL문을 작성한다 입력받은 아이디와 패스워드를 통해 데이터베이스를 조회하는데, 패스워드에 'OR '1' = '1'을 넣어 보낸다
SELECT *
FROM users
WHERE auth='admin'
AND id='' OR '1'='1';
3.WHERE절에서 or는 and보다 연산 순위가 낮기 때문에 or절인 '1'='1' (항상 참)이 가장 나중에 실행되어 결국 로그인에 성공한다. 혹은 아래의 코드처럼 input form에 SQL문을 마무리하는 키워드인 ; 와함께 주요 테이블을 삭제하는 SQL(e. '; DROP TABLES users;--')을 작성한다면 데이터가 모두 삭제되는 큰 피해를 입을 수 있다.
SELECT *
FROM users
WHERE auth='admin'
AND id='';DROP TABLES users;--';
SQL injection 대응방안
- 입력(요청) 값 검증
SQL문은 사람이 사용하는 자연어와 비슷하기 때문에 키워드를 막기엔 한계가 있다. 따라서 블랙리스크가 아닌 화이트리스트 방식으로 해당 키워드가 들어오면 다른 값으로 치환하여 SQL Injection에 대응할 수 있다.
※화이트리스트란 기본 정책이 모두 차단인 상황에서 예외적으로 접근이 가능한 대상을 지정하는 방식 또는 그 지정된 대상들을 말함. - Prepared Statement 구문 사용
Prepared Statement 구문을 사용하면 사용자의 입력이 SQL문으로부터 분리되어 SQL Inejction을 방어할 수 있다 사용자의 입력 값이 전달되기 전에 데이터베이스가 미리 컴파일하여 SQL을 바로 실행하지 않고 대기하며, 사용자의 입력값을 단순 텍스트로 인식한다. 따라서 입력값이 SQL문이 아닌 단순 텍스트로 적용되며 공격에 실패하게 된다. - Error Message 노출 금지
공격자는 데이터베이스의 Error Message를 통해 테이블이나 칼럼 등 데이터베이스의 정보를 얻을 수 있다. 에러가 발생한 SQL문과 에러 내용이 클라이언트에 노출되지 않도록 별도의 에러 핸들링이 필요하다.
CSRF란?
Cross-Site Request Forgery로 주소가 다른 사이트에서 유저가 보내는 요청을 조작한다는 의미이다.
CSRF공격을 하기 위한 조건
- 쿠키를 사용한 로그인 : 유저가 로그인 햇을 때, 쿠키로 어떤 유저인지 알 수 있어야 함
- 예측할 수 있는 요청/parameter를 가지고 있어야함 : request에 해커가 모를수있는 정보가 담겨있으면 안됨
CSRF 공격하는 방법
- 사용자가 정상 접속 및 로그인된 상태
- 해커가 피싱문자를 보내, 링크를 클릭하게 유도
- 링크를 클릭하면 사용자의 웹사이트에서 패스워드를 자동으로 변경하게 만듦
- 해커는 사용자의 아이디와 변경된 패스워드로 웹사이트에 접속
CSRF공격을 막는 방법
- CSRF 토큰 사용하기
서버측에서 CSRF 공격에 보호하기 위한 문자열을 유저의 브라우저와 웹 앱에만 제공 - -Same-site cookie사용하기
같은 도메인에서만 세션/쿠키를 사용할 수 있다. (피싱에 있는 사이트로 들어간경우 같은 도메인이 아니므로 쿠키가 전송이 되지 않음)
'TIL' 카테고리의 다른 글
[Spring Security][인증 구성요소 이해] (0) | 2022.11.21 |
---|---|
[Spring Security][Web요청 처리 흐름] (0) | 2022.11.20 |
[인증/보안][Session] (0) | 2022.11.19 |
[인증/보안][Cookie] (0) | 2022.11.19 |
[Spring Security][기본구조] (0) | 2022.11.19 |