SQL Injection
•
DB와 연동된 웹 애플리케이션에서 데이터 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 URL 입력란에 SQL 구문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안 취약점
SQL Injection 위험성
인증우회
데이터베이스(DB) 획득
•
의도적으로 DB 에러메시지 유발, DB의 구조 파악
•
데이터 베이스의 구조
◦
DB → Table → Column → Data
Error based SQLi
⇒ 강제로 에러를 유발시켜 에러페이지에서 정보를 획득하는 SQLi
•
공격기법
◦
고의적으로 에러메시지가 발생하도록 유도
◦
테이블명, 필드명 등과 같은 주요정보 노출
◦
DB의 구조 파악 및 2차 공격 시도
Union based SQLi
⇒ SQL 문법 중 Table의 내용을 조회하는 쿼리(명령어) = SELECT
•
Union : SQL 문에서 SELECT를 여러번 사용할 수 있게 해주는 쿼리(명령어)
두 개의 SELECT문의 결과 집합을 하나로 합쳐서 반환
ex)
SELECT column1, column2 FROM table1 UNION SELECT column_a, column_b FROM table2
⇒ Union 앞, 뒤의 SELECT문이 가져오는 column의 개수가 동일해야 실행 가능하다
Union based SQLi를 실행하기 위해서는 웹 사이트에서 SELECT 문을 사용하는 부분을 찾아내야한다 (+ SELECT 하는 컬럼 갯수도 찾아내야함)
•
SELECT문 ⇒ 조회, 검색하는 곳에서 주로 사용
•
SELECT문에서 사용하는 column 개수의 파악 ⇒ 노가다
Blind based SQLi
⇒ 웹 브라우저 상에서 SQLi에 대한 결과가 직접적으로 나오지 않는 경우에 사용!
원리 : 사용자 입력값을 입력받는 부분에 SQL 쿼리를 입력
→ 입력하는 쿼리는 무조건 참인 쿼리, 무조건 거짓인 쿼리 입력
→ 이 때, 두 쿼리에 대한 반응이 다르다면, Blind based SQLi 에 대한 취약점 존재 확인
참인 쿼리
’ and 1=1 --
거짓인 쿼리
’ and 1=2 --
★ 가장 중요한 포인트
⇒ 참/거짓일 때의 반응이 달라야함
자주 사용되는 함수
•
substring([절단할 문자열], [절단 시작 위치], [절단할 길이])
⇒ 문자열 절단 함수
ex)
substring(’admin’, 1, 1) ⇒ a
substring(’admin’, 2, 3) ⇒ dmi
•
ascii([문자])
⇒ 해당 문자의 Ascii code 반환 (10진수)
ex)
ascii(’a’) ⇒ 97
char(97) ⇒ ‘a’
•
char([아스키코드])
⇒ 해당 아스키코드에 대한 문자를 반환
(부가적으로 알아두면 좋은 것)
mssql 키워드 중 ‘top’ 이라는 키워드가 있음 = 가장 위
ex)
SELECT top 1 table_name from information_schema.tables
⇒ table_name Column 데이터 중 가장 첫 번째 데이터 출력
Q) 첫 번째 테이블의 첫 번째 글자 확인
대치동' and substring((select top 1 table_name from information_schema.tables),1,1)='a' --
⇒ False
대치동' and substring((select top 1 table_name from information_schema.tables),1,1)='o' --
⇒ True
But! o와 O 모두 참으로 나옴, 구분이 필요함
상동' and ascii(substring((select top 1 table_name from information_schema.tables),1,1))=79 --
⇒ False
상동' and ascii(substring((select top 1 table_name from information_schema.tables),1,1))=111 --
⇒ True
(소문자 o 인것 확인)
SQL Injection 시큐어 코딩
•
소스코드 레벨에서 Prepared Statement 구문을 통한 SQL Injection 방어
◦
개발 중 DAO 객체 또는 DB 연결 구문에서 Prepared Statement 구문 이용
◦
SQL Injection 취약점이 근본적으로 발생하지 않는 구조로 웹사이트를 개발
◦
해당 구문은 SQL 쿼리를 선 처리하여 컴파일 한 후, 이후 입력되는 변수 값을 항상 문자열 변수로 처리함
◦
사용자가 어떤 악의적인 SQL 구문을 변수에 삽입해도 SQL 문에 영향을 미치지 않아 SQL Injection이 발생하지 않는다