CSRF란 무엇인가?

1
2
CSRF(Cross Stie Request Forgery) : 사이트간 요청 위조
웹 애플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격방법을 의미한다 - 나무위키

정의만 보면 앞서 알아봤던 XSSSQL injection과 비슷하다.
XSS가 사용자가 특정 사이트를 신뢰한다는 점을 공격하는거라면, CSRF는 특정 사이트가 사용자의 브라우저를 신뢰한다는 점을 공격하는 것이 다르다.

간단하게 정리하자면, 악성코드가
XSS: 클라이언트에서 발생 / CSRF: 서버에서 발생
이라고 할 수 있다.

2008년도에 있었던 옥션 해킹 사고도 CSRF로 공격을 했다고 한다. (해커가 옥션 운영자에게 CSRF 코드가 포함된 이메일을 보내서 관리자 권한을 얻어냈다)

공격 과정

1
2
3
...
<img src="http://auction.com/changeUserAcoount?id=admin&password=admin" width="0" height="0">
...

위 옥션 사건을 예로 들어보자.

  1. 옥션 관리자 중 한명이 관리 권한을 가지고 회사내에서 작업을 하던 중 메일을 조회한다. (로그인이 이미 되어있다고 가정하면 관리자로서의 유효한 쿠키를 갖고있음)
  2. 해커는 위와 같이 태그가 들어간 코드가 담긴 이메일을 보낸다. 관리자는 이미지 크기가 0이므로 전혀 알지 못한다.
  3. 피해자가 이메일을 열어볼 때, 이미지 파일을 받아오기 위해 URL이 열린다.
  4. 해커가 원하는 대로 관리자의 계정이 id와 pw 모두 admin인 계정으로 변경된다.

방어 방법

1. Referrer 검증

request header에 있는 요청을 한 페이지의 정보가 담긴 referrer 속성을 검증하여 차단.
일반적으로 이 방법만으로도 대부분 방어가 가능할 수 있다.
옥션이 아닌 개인 이메일에서 요청이 들어오는 것처럼,
같은 도메인 상에서 요청이 들어오지 않는다면 차단하도록 하는 것이다.

2. CSRF Token 사용

랜덤한 수를 사용자의 세션에 저장하여 사용자의 모든 요청(Request)에 대하여 서버단에서 검증하는 방법.

1
2
3
4
5
// 로그인시, 또는 작업화면 요청시 CSRF 토큰을 생성하여 세션에 저장한다. 
session.setAttribute("CSRF_TOKEN",UUID.randomUUID().toString());

// 요청 페이지에 CSRF 토큰을 셋팅하여 전송한다
<input type="hidden" name="_csrf" value="${CSRF_TOKEN}" />

3. CAPTCHA 사용

요즘은 거의 모든 웹사이트에서 캡차를 이용하는 것 같은데 캡차이미지상의 숫자/문자가 아니라면 해당 요청을 거부하는 것이다.

이 외에도 form 태그를 입력할 시 GET방식을 지양하고 POST방식을 쓰도록 하는 것은 기본이라고 할 수 있다.


출처 : 나무위키, 위키피디아,
http://blog.ilkyu.kr/entry/CSRF-Crosssite-Request-Forgery-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EA%B0%84-%EC%9A%94%EC%B2%AD-%EC%9C%84%EC%A1%B0,
http://itstory.tk/entry/CSRF-공격이란-그리고-CSRF-방어-방법

Comment and share

XSS와 더불어 가장 흔한 보안 공격 기술인 SQL injection에 대해서 알아보았다.

SQL injection 이란?

1
SQL 인젝션은 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말한다. - 나무위키

데이터베이스 조작언어인 SQL 입력값에 정상적인 값이 아닌 SQL문을 삽입해 데이터베이스에 해를 가하는 공격이라고 할 수 있다.

예를 들어, 로그인을 하는 코드가 있다고 하자.

1
SELECT user FROM user_table WHERE id='입력한 아이디' AND password='입력한 비밀번호';

위와 같이 SQL문을 짜서 데이터베이스에 존재하는 user_table 테이블에서 입력한 id와 입력한 password와 동일한 값을 찾아 반환해주는 코드이다.

일반적인 유저라면

id = 홍길동
password = 1234

이런식으로 입력을 하겠지만

SQl injection을 할 유저는

id = 홍길동
password = 1234’; DROP table user_table–

이런식으로 입력을 하게 된다.

그렇게 되면 전체 SQL 구문은 이렇게 되어버린다.

1
2
SELECT user FROM user_table 
WHERE id='홍길동' AND password='1234'; DROP TABLE user_table--';

SQL에서 ;(세미콜론)은 한 구문의 끝을 나타내므로 위 구문은

1
SELECT user FROM user_table WHERE id='홍길동' AND password='1234'
1
DROP TABLE user_table--'

이렇게 2개의 구문으로 나눠져 실행되게 된다.

–(하이픈 2개) 다음으로 오는 문장은 주석 처리가 되므로,
결국 DROP 명령어에 의해 해당 table은 DB에서 지워지게 된다.

이 외에도 로그인을 무조건 성공하게 하는
‘ OR ‘1’ = ‘1 (1은 1과 같으니 WHERE절은 무조건 참이 되어 아이디 또는 비밀번호가 무엇이든 로그인 성공)
등 수많은 케이스가 있다.


방어 방법

1. 입력값 검증

다음과 같은 특수문자 혹은 SQL 명렁문이 입력값에 포함되있는지 검증한 후 차단한다.

1
2
3
*, –, ‘, “, ?, #, (, ), ;, @, =, *, +, union, select, drop, update, from, 
where, join, substr, user_tables, user_table_columns,
information_schema, sysobject, table_schema, declare, dual,…

유저가 클라이언트단에서 자바스크립트를 끌 수 있으니
클라이언트 단에서도 차단 및 서버 단에서도 차단하여 이중장치를 마련하자.
대부분의 경우, 입력값 검증만 해도 막을 수 있다.

2. SQL 오류 발생시 오류 메세지 클라이언트 표시 금지

SQL 오류 메세지를 통하여 유저가 해당 DB의 구조를 알 수 있다.

3. HASH 사용

DB에 데이터 저장시 민감한 정보는 HASH를 이용해 저장한다.
특히 패스워드는 반드시 SHA-256 이상으로 해싱 후 저장! (하지 않을시 개인정보보호법 29조 위반이라고 한다..)


출처 : 나무위키, http://blog.plura.io/?p=6056, https://docs.microsoft.com/ko-kr/sql/relational-databases/security/sql-injection?view=sql-server-2017, http://asfirstalways.tistory.com/360, http://brownbears.tistory.com/59

Comment and share

웹 개발자로서 기본적으로 알아야할 지식에 대해서 포스팅을 하려고 한다.
그 중 기초적인 보안 기술 중 XSS에 대해서 알아보자.

XSS(Cross Site Scripting)이란?

SQL injection과 함께 웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로,
악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말한다.
공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며,
보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다. - 나무위키

웹페이지 내에 악의적인 자바스크립트 코드를 심어넣는 방법으로 공격한다.
예전부터 쓰이는 간단하고 전통적인 공격 방법이지만 많은 사이트들이 이 간단한 공격에 대비를 하지 않아 공격을 받는 경우가 많다.

공격/방어방식 라는 면에서 XSS(자바스크립트 이용해 공격)와 SQL Injection(쿼리를 통해 공격)은 서로 비슷하다고 볼 수 있다.

공격의 방법

  1. 스크립트 태그 안에 심기

    1
    <script>alert(document.cookie)</script>
  2. 서버 응답 결과에 심기

    1
    htt://www.server.com/search/?q=<script>(document.cookie)</script>&xyz
  3. 링크 또는 이미지에 심기

피해 종류

  1. 쿠키 정보/세션 ID 획득
  2. 시스템 관리자 권한 획득
  3. 악성코드 다운로드

예방 방법

1. 태그 문자 무효화

기본적으로 HTML 태그 안에 심어놓는걸 방지.(‘<’. ‘>’) 등의 태그를
서버에서 브라우저로 전송시 다음과 같은 문자로 인코딩해 전송한다.

2. 라이브러리 이용

일일이 개발자가 위와 같이 인코딩하는 것은 무리가 있다.
유명한 라이브러리를 이용하면 손쉽게 처리가 가능하다.
다음과 같은 라이브러리들이 있다.

  • AntiXSS(MS에서 개발)
  • OWASP ESAPI(validator:입력값 필터링, encoder:출력값 인코딩/디코딩)
  • NAVER Lucy XSS filter

3. 쿠키 보안 옵션 이용

쿠키 생성시
‘보안 쿠키’ 파라미터 지정시 TLS 상에서만 사용하게 할 수 있다.
‘HTTP ONLY’ 파라미터 지정시 웹브라우저상에서만 사용하게 할 수 있다.
완전히 방어 가능한 건 아니라고 한다.


출처: 나무위키, 한국인터넷진흥원

Comment and share

클래스의 static method는 정적 메소드라고 불리는데 이는 클래스의 인스턴스가 필요없이 호출이 가능한 메소드를 말한다.

예를 들어,

class Foo {
    bar() {...}

    static baz() {...}
}

라는 코드가 있을때 bar()는

const f = new Foo()
f.bar() 

위 예시처럼 f라는 Foo의 인스턴스를 선언을 하고 그 인스턴스에서 호출을 해야하지만

baz()는

Foo.baz()

위 예시처럼 클래스 Foo에서 바로 호출이 가능하다.
Foo의 인스턴스를 선언하지 않고도 메소드를 호출이 가능하다는 것이다.

용어의 반대 관계는 아래와 같다.

static method != instance method

Comment and share

개발자로서의 첫 걸음에 앞서 블로그를 시작한다.

이 블로그는 주로 내가 학습한 개발과 관련된 내용들이 주를 이룰 것이지만

비단 개발 분야만이 아니라 좀 더 멋진 미래를 위해 하루하루 발전해나가는 내 모습을 기록할 것이다.

평소 뭔가 기록을 남겨서 머릿속에 있는 생각이든, 공부한 내용이든 정리할 필요성을 느끼고 있었고

특히나 개발자로서 블로그 운영의 중요성을 보면서

당장 시작해야겠다는 생각이 들었다. 군생활도 얼마 안남은 김에 어제밤에 Hexo로 정적 사이트 생성기로 만들어봤다.

이거 하나 만드는 데에도 굉장히 시간이 많이 걸렸는데 만드면서도 그 뭔가 모를 재미를 느꼈었다.

아마 이 감정(Craftmanship라나 뭐라더나) 때문에 수 많은 개발자들이 개발을 시작했고 또 즐기는 이유일 것이다.

블로그 제목(Jinco the Snorkel)은 요즘 하고 있는 것 중 동기들과 하고있는 스노클이라는 조직에서 내가 많은 영향을 받았고

인생의 전환기에서 “항상 스노클의 정체성을 기억하자” 라는 의미를 담았다.

나를 본격적으로 개발자의 길로 이끌었던 마르코님을 보면서

자기만의 브랜드가 중요한 시대라고 느꼈다. 아마 15년 말부터 마르코님의 브런치 글을 읽기 시작했는데

초기부터 글을 읽어온 독자로서 3년 동안 마르코님은 엄청나게 성장하신 것 같다.

아마 그 이유는 여러가지가 있었겠지만 개발이든 사업구상이든 독서든 브런치 글 발행이든

무엇인가를 꾸준하게 하는 것에 있을 것이다.

이제 마르코라는 이름은 <비전공 문과 출신 개발자>라는 분야에서 어느 정도 브랜드화 되지 않았나싶다.

마르코님은 날 모르시겠지만 개인적으로도 나의 롤모델이라고 생각하고 있다.

이 블로그를 통해 비록 지금은 내세울 것 하나 없는 사람이지만 마르코님처럼 나만의 브랜드를 쌓아나갈 것이다.

또, 개인적으로 논리력이 많이 부족하다고 생각하는데 글을 쓰면서 논리력과 타인에게 나를 표현할 수 있는 자기표현력도 많이 향상되었으면 좋겠다.

Comment and share

  • page 1 of 1
Author's picture

Jin Seon

Aspiring Developer dreaming about freedom


Developer


Seoul