yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

SQL injection 본문

웹/웹 해킹

SQL injection

yehey 2020. 9. 11. 01:59

SQL (Structured Query Language)

:관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 언어

주로 사용하는 tool) MySQL, PostgreSQL, MariaDB, Oracle 등

 

->SQL 더 알아보기

 

SQL Injection 

:임의의 SQL 문을 주입하고 실행되게 하여 데이버 베이스가 비정상적인 동작을 하도록 조작하는 행위

공격 기법) Logic, Union, Subquery, Error Based, Blind, Time based 등이 있다.

 

 SQL 인젝션 취약점 

-사용자가 입력한 파라미터 값이 쿼리문의 일부로 사용될 때 SQL injection 취약점이 존재한다.

 

1. Logic(논리 연산)을 이용한 공격 방법 

SQL injection 취약점이 존재하는 파라미터 입력 창에 해당하는 값이 아닌

SQL쿼리문을 직접 조작하는 값을 입력해서 정보에 접근하는 공격

 

*논리연산*

A B A&&B A||B
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 1

&&(and) 연산: 모든 조건이 참인 경우에만 결과가 참이 된다.

||(or) 연산: 하나의 조건이라도 참이 되는 경우 결과는 참이 된다.

 

logic을 이용해 WHERE 구문 우회

위의 그림과 같이 원래 id 입력 부분과 pw 입력 부분에 실제 사용자의 id와 pw가 들어가야

해당 사용자의 데이터에 접근할 수 있다. 

 

그러나 Logic을 이용해서 WHERE 구문을 우회하면 모든 사용자의 id와 pw 데이터가 공격자에게 전달된다.

(1' or '1이 공격자가 입력한 SQL 쿼리문, id와 pw가 1인 데이터뿐만 아니라 다른 데이터에도 항상 참이 된다)

 

2. Union 구문을 이용한 공격 방법

공격자가 or을 이용한 구문 대신 UNION 키워드를 삽입하고 추가적인 SELECT 구문을 이용해서 데이터베이스 내의 다른 테이블의 데이터에 접근하는 공격

-UNION을 이용하면 데이터베이스의 모든 정보를 알아낼 수 있다.

※UNION하는 두 테이블의 column 수가 같아야 하고, 데이터 형이 같아야 한다.

 

UNION을 이용한 SQL injection

UNION: 합집합, 두 개의 SELECT 구문의 결과를 모두 포함시키는 키워드

위의 그림에서는 id가 1인 사용자의 데이터 외에도 공격자가 입력한 SELECT 구문의 결과도 같이 반환하게 된다.

그러나 공격자가 입력한 SELECT 구문에는 WHERE이 존재하지 않기 때문에 users 테이블에 존재하는 모든 사용자의 이름과 pw를 반환한다.

 

더보기

쿼리문 끝의 #은 무엇일까?

#은 MySQL 데이터베이스에서 #뒤에 오는 내용을 주석 처리하고자 할 때 사용되는 특수문자

만약 #이 없다면 쿼리문 가장 끝의 ' 문자로 인해 에러가 날 수도 있음

(공격자가 쿼리문을 수정하는 과정에서 '쌍이 맞지 않을 수 있기 때문)

따라서 쿼리문 완성 후에는 #을 추가해서 뒤에 존재할 수도 있는 다른 SQL 쿼리문은 주석 처리하여

공격자가 원하지 않는 명령문 실행을 막고 SQL 형식 에러가 발생하지 않게 한다.

 

 3. Blind SQL Injection 

데이터베이스 조회 후 결과를 직접적으로 확인할 수 없는 경우 사용되는 공격 기법

데이터베이스 내에 존재하는 데이터와 사용자의 입력을 비교, 특정 조건 발생 시 특별한 응답을 발생시킨다.

 

Blind SQL Injection 수행의 조건

-데이터를 비교해 참/거짓을 구분해야한다

참/거짓의 결과에 따른 특별한 응답을 생성해야 한다.

=>IF statements를 주로 사용한다. (조건문)

SELECT IF(1=1,True,False);

True자리에는 조건식(여기서는 1=1)이 참일 때 실행되는 함수가 들어가고

False자리에는 거짓일 때 실행되는 함수가 들어간다.

 

3-1. Time Based 

시간 지연을 통해 참/거짓 여부를 판단

=>시간 지연이 특별한 응답이 된다!

 

  • SLEEP(duration) //duration 동안 정지

  • BENCHMARK(count,expr)  //expr 식을 count번 실행=> 시간지연

  • heavy query //사용자가 설정한 무거운 연산과정

3-2. Error Based

임의적으로 에러를 발생시켜 참/거짓 여부를 판단

=>에러메시지가 특별한 응답이 된다!

 

SELECT IF(num=1, 9e307*2,0);
//num이 1이면 조건식이 참이 되므로 9e307*2실행, 에러메시지를 발생시킨다
//num이 1이 아닌 경우 아무 변화가 없음

 

Comments