보안 - XSS, CSRF, SQL INJECTION

yshjft·2023년 1월 21일
0

보안

목록 보기
1/1

XSS(Cross Site Scripting)

  • 사이트 간 스크립팅
  • 정적 웹페이지에서는 문제가 발생하지 않지만, 사용자의 입력을 받아 동적으로 HTML을 조작하는 웹 어플리케이션이 주요 공격 대상
  • 권한이 없는 사용자(관리자가 아닌 악의적인 사용자)가 웹 페이지에 악성 스크립트를 삽입하여 공격하는 방법
    • 의도하지 않은 행동을 수행
    • 쿠키 등을 탈취

XSS 예시

  • 사용자의 입력을 받는 웹 상의 공간에 임의의 스크립트를 삽입하여 개발자가 의도하지 않은 동작을 수행하도록 한다.
    • 페이지 조작
    • 쿠키 탈취
  • 해커가 미리 만들어둔 악성 해킹 사이트로 이동하게끔 하는 스크립트를 삽입하고 자극적인 제목을 달아 게시물을 등록한다. 일반 사용자는 그 게시물을 클릭하게 되고 해커가 삽입한 스크립트가 동작해 악의적인 페이지로 이동하게 된다.
    • 웹 서핑을 하다가 “X초 자동으로 변경된 주소로 이동합니다” 등의 메시지와 함께 광고 사이트로 이동

XSS 방지 방법

  • 입력 값 치환
    • 태그 문자 등 위험한 문자 입력 시 문자 참조(HTML entity)로 필터링하고 서버에서 브라우저로 전송 시 문자를 인코딩하는 것
    • ex) “<” → “<”, “>” → “>”
    • 사용자는 <script>로 보이지만 HTML 문서에서는 &lt;script&gt; 로 나타나서 브라우저에서 일반 문자로 인식하고 스크립트로 해석되어 실행되지 않는다.
  • XSS 방어 라이브러리 이용

참고 내용

CSRF(Cross Site Request Forgery)

  • 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹 사이트에 요청하게 만드는 공격
  • 희생자가 특정 문제 없는 사이트(ex. 구글, 네이버, 페이스북 등)에 로그인한 상태일 때 공격자가 만든 피싱 사이트에 접속하는 경우 발생
    • 피싱 사이트가 희생자의 권한을 도용하여 공격자가 의도한 행위를 수행

CSRF 방어 방법

  • Referer 검증
    • Back-end 단에서 request의 referrer를 확인하여 domain이 일치하는 지 검증하는 방법
    • 하지만 XSS를 이용하여(referer 헤더 변조 가능) CSRF가 수행될 수 있다.
  • CSRF Token 사용
    • 사용자의 세션에 임의의 난수 값을 저장하고 사용자의 요청 마다 해당 난수 값을 포함 시켜 전송한다. 이후 Back-end 단에서 요청을 받을 때마다 세션에 저장된 토큰 값과 요청 파라미터에 전달되는 토큰 값이 일치하는 지 검증하는 방법이다.
    • XSS 공격을 통해서 CSRF가 수행될 수 있다.

(추가)Referer 란

* 현재 요청을 보낸 페이지의 절대 혹은 부분 주소
* 쉽게 말해 요청이 어디서 왔는지를 의미한다.

참고 내용

SQL INJECTION

  • 보안상의 취약점을 이용하여 해커에 조작된 SQL 쿼리문이 데이터베이스에 전달되어 비정상적 명령을 실행시키는 공격 기법

SQL INJECTION 방어 방법

  • 입력 값에 대한 검증
    • 특정 문자를 포함하는 입력을 막음(화이트리스트)
    • 특정 문자를 포함하는 입력만 받음(블랙리스트)
  • Prepared Statement 사용
    • 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 미리 컴파일 하여 실행하지 않고 대기(컴파일로 쿼리문이 수정될 수 없다)
  • Error Message 노출 금지
    • 데이터베이스에서 에러 발생 시 따로 처리를 해주지 않는다면 에러가 발생한 쿼리문과 함께 에러에 대한 내용을 반환한다. 이는 공격자가 SQL Injection을 수행하기 위해서 필요한 데이터베이스 정보를 제공해줄 수 있으므로 사용자에게 보여줄 수 있는 페이지를 제작하거나 메시지박스를 띄워줘야 한다.

(추가)Statement & PreparedStatement

  • Statement
    • SQL문을 실행할 수 있는 객체
    • 쿼리를 수행할 때 마다 Parsing → Compile → Execute 과정을 거치게 된다.
  • PreparedStatement
    • Parsing → Compile → Execute 과정을 처음 한 번만 거치고 이후에는 캐시에 담아서 재사용한다.

참고 내용

profile
꾸준히 나아가자 🐢

0개의 댓글