[보안] SQL injection 이란?

카테고리 : 보안 리딩타임 : 1 분 페이지뷰 : --

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

댓글 공유

[보안] XSS(Cross Site Scription)란 무엇인가?

카테고리 : 보안 리딩타임 : 1 분 페이지뷰 : --

웹 개발자로서 기본적으로 알아야할 지식에 대해서 포스팅을 하려고 한다.
그 중 기초적인 보안 기술 중 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 태그 안에 심어놓는걸 방지.(‘<’. ‘>’) 등의 태그를
서버에서 브라우저로 전송시 다음과 같은 문자로 인코딩해 전송한다.
![](./image/html tag encoding.png)

2. 라이브러리 이용

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

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

3. 쿠키 보안 옵션 이용

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


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

댓글 공유

[Javascript] Class에서의 Static이란?

카테고리 : Javascript 리딩타임 : 1 분 페이지뷰 : --

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

예를 들어,

1
2
3
4
5
class Foo {
bar() {...}

static baz() {...}
}

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

1
2
const f = new Foo();
f.bar();

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

baz()는

1
Foo.baz();

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

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

** static method != instance method **

댓글 공유

블로그를 시작하다

카테고리 : Monologue 리딩타임 : 1 분 페이지뷰 : --

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

댓글 공유

Copyrights © 2020 Jin Seon. All Rights Reserved.
저자 이미지

Jin Seon

Aspiring developer dreaming about freedom


Software Enginner


Seoul