본문 바로가기
  • 저희는 평생 개발할 운명이걸랑요
Tech.log/데이터베이스

[SQL Injection]

by SpaciousKitchen 2021. 6. 4.

 

SQL Injection

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

 

 

그림1.sql injection에 대한 만화

 

 

INSERT INTO students (이름) VALUES ('학생 이름');

 

저 학교에서 입력한 명령은 다음과 같을 것이다.

 

INSERT INTO students (이름) VALUES ('Robert');
DROP TABLE students;
--');

 

첫 번째 줄에서는 Robert라는 학생이 입력되었지만, 두 번째 줄에서 학생들의 데이터가 있는 테이블을 제거한다. 그리고 세 번째에서는 뒤에 오는 내용을 모두 주석 처리한다. 결과적으로 ‘모든 학생 기록을 삭제한다.’라는 뜻의 명령문이 완성된다.

 

 

논리적 오류에 의한 공격

 

SELECT user FROM user_table WHERE id='admin' AND password=' ' OR '1' = '1';

따옴표를 올바르게 닫으며 password=' '를 만듦과 동시에 SQL 구문 뒤에 ' OR '1' = '1'을 붙였다.

WHERE 뒤에 있는 구문을 간단히 축약하면 false AND false OR true로 정리할 수 있는데, 논리학에 따르면 AND 연산은 OR보다 연산 우선순위가 빠르기 때문에 해당 구문의 연산 값은 true가 되어 올바른 값으로 판단하고 실행하게 된다.

 

즉, 아이디와 비밀번호를 몰라도 ' OR '1' = '1 구문 때문에 로그인에 성공하게 되는 것이다.

 

 JOIN이나 UNION에 의한 공격

 

그림2.UNION에 의한 공격 예시

 

 

입력값을 title  contents 컬럼의 데이터랑 비교한 뒤 비슷한 글자가 있는 게시글을 출력한다다. 

 

여기서 입력값으로 Union 키워드와 함께 컬럼 수를 맞춰서 SELECT 구문을 넣어주게 되면 두 쿼리문이 합쳐서서 하나의 테이블로 보여진다.

인젝션이 성공하게 되면,사용자의 개인정보가 게시글과 함께 화면에 보여지게 되어버린다.

 

 

대응 방안

 

입력 값에 대한 검증

사용자의 입력 값에 대한 검증이 필요하다. 서버 단에서 화이트리스트 기반으로 검증해야 한다.공백으로 치환하는 방법도 많이 쓰이는데, 이 방법도 취약한 방법입니다. 예를 들어 공격자가 SESELECTLECT 라고 입력 시 중간의 SELECT가 공백으로 치환이 되면 SELECT 라는 키워드가 완성되게 됩니다. 공백 대신 공격 키워드와는 의미 없는 단어로 치환되어야 합니다.

 

 

Prepared Statement 구문사용

 Prepared Statement 구문을 사용하게 되면, 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 미리 컴파일 하여 실행하지 않고 대기합니다. 그 후 사용자의 입력 값을 문자열로 인식하게 하여 공격쿼리가 들어간다고 하더라도, 사용자의 입력은 이미 의미 없는 단순 문자열 이기 때문에 전체 쿼리문도 공격자의 의도대로 작동하지 않는다.

 

 

Error Message 노출 금지

에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환해준다. 여기서 테이블명 및 컬럼명 그리고 쿼리문이 노출이 될 수 있다.

 

웹 방화벽 사용

웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 것도 하나의 방법이다. 

 

 

출처
나무위키
그림2:https://noirstar.tistory.com/264

'Tech.log > 데이터베이스' 카테고리의 다른 글

[ORM(Object Relational Mapping)]  (0) 2021.06.04
[NoSQL]  (0) 2021.05.22
[Statement VS Prepared Statement]  (0) 2021.05.22
[트랜잭션이란?]  (0) 2021.05.22
[정규화]  (0) 2021.05.21

댓글