일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 멀티스레드
- trunc(date)
- Servlet
- queue
- ArrayList
- cpu
- 프로세스 종료
- RAM
- Git
- desc
- 이진탐색트리
- HashMap
- 오라클 버림 함수
- 정렬
- web
- url
- ssd
- maven
- MAP
- trunc(sysdate)
- 스케줄 삭제
- trunc()
- stack
- 오라클 trunc()
- 스레드
- netstat
- null
- git push
- heap
- HDD
- Today
- Total
無테고리 인생살이
[Web 보안] XSS, CSRF, SQL Injection 본문
XSS (Cross Site Scripting)란?
: 웹 사이트에 악성 스크립트를 삽입해 사용자의 개인정보(쿠키, 세션) 등을 빼돌리는 해킹 기법이다. 사용자로부터 입력받은 값을 제대로 검증하지 않는 웹 사이트가 대상이 된다. 아래 그림을 예로 들자면, 해커는 악성 자바스크립트 코드를 포함한 게시글을 업로드하고 해당 게시글을 조회한 사용자들은 개인정보를 탈취당하게 된다. 게시글을 조회할 때, 해커가 심어놓은 스크립트가 실행되기 때문이다. 스크립트 공격을 통해 사용자의 정보를 빼내오는 것 뿐만 아니라, 특정 웹 사이트로 리다이렉션하게 할 수도 있다.
해커의 공격 과정
- 스크립트 삽입에 취약한 웹 사이트를 찾는다.
- 취약한 웹 사이트에 사용자의 쿠키를 탈취하는 스크립트를 삽입한다.
- 사용자가 웹 사이트를 방문할 때마다, 해커가 심은 스크립트를 통해 쿠키가 해커에게 전달된다.
웹 서비스에서 사용자 정의 스크립트의 실행을 막는 것이 XSS 공격 예방의 핵심이다.
그렇다면, 어떻게 웹 브라우저에서 스크립트가 실행되지 못하게 할까?
- 이스케이프(escape) 처리 : `<, >, / , &` 등과 같은 특수 문자들을 `<, >`와 같은 텍스트 형태로 변환해 스트립트 실행을 막는다. 특수 문자를 다른 형태로 변환하는 것을 이스케이프 처리 또는 이스케이핑이라고 한다. 이렇게 변환된 문자열들은 웹 브라우저가 읽어와 렌더링하더라도 더 이상 스크립트로 처리하지 않기 때문에 해커가 삽입한 스크립트는 실행되지 않는다.
CSRF (Cross Site Request Forgery)란?
: 로그인한 사용자, 즉 권한이 있는 사용자가 자신의 의도와 무관하게 특정 웹 사이트에 해커가 의도한 위장 요청을 보내도록 하는 해킹 기법을 말한다. 아래 그림을 예로 들자면, 해커가 설계한 링크에 로그인한 사용자가 접속하게 되면, 사용자의 인증 정보를 통해 권한을 가진 웹사이트에 해커가 의도한 POST 요청을 보내도록 하는 것이다. 즉, 권한이 있어야만 실행할 수 있는 요청을 사용자 본인도 모르게 서버에 위장 요청이 보내지는 것이다. 이에 서버 입장에서는 권한이 있는 요청이라고 판단하여 요청에 맞는 처리를 할 것이다.
해커의 공격 과정
- CSRF에 취약한 웹 사이트를 찾는다.
- 웹 사이트를 통해 자금을 이체하도록 하는 요청을 위조하고, 이를 링크에 심어서 권한이 있는 사용자에게 전송한다.
- 사용자는 해당 링크를 클릭하면, 위조된 요청을 자기도 모르게 웹 사이트의 서버에게 전송하게 된다.
- 서버는 인증된 사용자의 유효한 요청이라 판단하고, 사용자의 계좌에서 특정 금액이 공격자에게 이체되도록 한다.
방어법
- Referrer 검증 : 서버 단에서 요청 헤더의 referrer을 확인해서, 동일한 도메인으로부터 온 요청인지 확인하는 방법이다. 만약 악성 페이지로부터 온 요청이라면 동일한 도메인이 아닐 것이므로 CSRF 공격이라고 판단하여 요청을 거부한다. 하지만 동일한 도메인 내 페이지에 XSS 취약점이 있다면 이 방법으로는 방어할 수 없다.
- CSRF 토큰 검증 : 임의의 CSRF 토큰을 만들어 세션에 저장한다. 요청하는 페이지에 hidden 타입 input 태그를 이용해 토큰 값을 함께 전달하고 이후 서버에서 세션에 저장된 CSRF 토큰 값과 요청 파라미터에 담긴 토큰 값을 비교한다.
SQL Injection
: 악의적인 SQL문을 실행되게 함으로써, 서버의 DB를 공격하는 해킹 방식이다. 사용자가 입력한 값이 쿼리에 그대로 들어가, 원하는대로 쿼리를 조작해 데이터를 빼내오는 것이 대표적인 SQL 인젝션이다. 사용자가 입력한 값을 필터링, 이스케이핑하지 못했을 경우 발생한다.
XSS 방어법과 비슷한 형태로, 사용자가 입력한 값이 쿼리에 그대로 넘어가지 않게 하는 것이 핵심이다.
- 필터링 : 사용자의 입력 값을 받아 validation check를 하는 방식이다. 특정 문자를 포함한 input 값을 막는다.
- Prepared Statement 사용 : SQL 문을 먼저 컴파일한 후, 사용자의 입력 값을 바인딩하는 방식이다. 입력 값이 쿼리문의 일부가 아닌 하나의 문자열로 인식하게 함으로써 SQL 인젝션 공격을 방어한다.
- 이스케이프(escape) 처리
참고자료
https://namu.wiki/w/SQL%20injection
https://it-eldorado.tistory.com/10
'Web' 카테고리의 다른 글
[Web] URI, URL, URN 차이점과 URL 구조 (0) | 2023.01.17 |
---|---|
[Servlet/JSP] Servlet Filter와 Event Listener (0) | 2023.01.16 |
[Servlet/JSP] Servlet이란 무엇이며 어떻게 동작할까? (feat. Servlet Container) (0) | 2023.01.14 |
[Web] 쿠키와 세션은 HTTP의 어떤 특성을 보완하기 위해 생겨났을까? (0) | 2023.01.11 |
[Web] Web application을 이해하고 Web Server와 WAS의 차이를 알아보자. (0) | 2023.01.10 |