반응형

SQL Injection이란?

웹 애플리케이션과 데이터베이스 간의 연동으로 발생하는 취약점으로, 공격자가 입력 폼에 악의적으로 조작된 쿼리를 삽입하여 데이터베이스 정보를 불법적으로 열람하거나 조작할 수 있는 방식

 

SQL Injection 공격 유형

Error based SQL injection (논리적 에러를 활용한 SQL 인젝션) 

  - 가장 대중적인 기법으로, 인증 우회를 위해 논리적 에러를 유도하는 방식의 공격 기법

-- 정상적인 input
SELECT * FROM user WHERE id = 'id' AND pwd = 'pwd'

-- 비정상적인 input
'OR 1=1 --'

-- 인증 우회를 통한 비정상적 input
SELECT * FROM user WHERE id = '' OR 1=1 --
==> SELECT * FROM user 결과값 도출

 

Union SQL Injection (UNION 명령어를 활용한 SQL 인젝션)

  - 공격자가 추가적인 쿼리를 삽입하여 정보를 획득하는 기법으로, UNION 명령어를 이용하여 여러 쿼리를 합치는 방식을 이용, UNION을 하려는 두 테이블의 컬럼 수와 데이터 형식이 같아야 하므로 ORDER BY 절이나 HAVING을 이용한 오류 메시지를 통해 컬럼의 수를 유추

-- 정상적인 input
SELECT * FROM board WHERE title = 'title' and contents = 'contents'

-- 비정상적인 input
'UNION SELECT id, pwd FORM user --'

-- UNION을 통한 비정상적 input
SELECT * FROM board WHERE title LIKE '' UNION SELECT id, pwd FORM user --

==> SELECT * FROM board 컬럼에 user 정보 합계되서 결과값 도출


Blind SQL Injection (Boolean based SQL)

  - 서버의 반응을 통해 정보를 얻는 SQL 공격 기법으로, 단순히 참과 거짓의 정보한 알 수 있을 때 사용하는 공격 기법. 조건이 참이면 페이지가 정상적으로 출력되고 그렇지 않은 경우 출력되지 않음으로 구분이 가능

-- Boolean 기반 공격 예시
-- 정상적인 input
SELECT * FROM user WHERE id = 'id' and pwd = 'pwd'

-- 비정상적인 input
'abc123' and ASCII(SUBSTR((SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 --'

-- Boolean 통한 비정상적 input
SELECT * FROM user WHERE id = 'abc123' and ASCII(SUBSTR((SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 --

-- Time 기반 공격 예시
-- 정상적인 input
SELECT * FROM user WHERE id = 'id' and pwd = 'pwd'

-- 비정상적인 input
'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --

-- Time을 통한 비정상적 input
SELECT * FROM user WHERE id = 'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --

 

Stored Procedure based SQL Injection

  - 웹에서 저장 프로시저에 대한 접근 권한을 가짐으로써 정보를 탈취할 수 있는 공격 기법

 

Mass SQL Injection

  - 한 번의 공격으로 다량의 DB를 조작해 큰 피해를 입히는 공격 기법

 

SQL Injection 대응 방안

입력값 검증

  - 사용자의 입력을 받을 때 검증 로직을 추가하여 값이 유효한지 검증하는 방법
     (데이터 길이 제한, 특수문자와 명령어 필터링 등)

 

Prepared Statement 구문 사용

  - 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 미리 컴파일하여 실행하지 않고 대기. 그 후 사용자의 입력 값을 문자열로 인식하여 공격 쿼리가 들어간다고 하더라도, 단순 문자열로 인식하여 공격을 무효화하는 방법

 

Error Message 노출 금지

  - SQL Injection을 수행하기 위해서는 데이터베이스의 정보가 필요하기 때문에, 오류 발생 시 사용자에게 보여주는 로그를 별도로 작업하여 데이터베이스 정보 유출 방지하여 공격을 무효화 하는 방법

 

웹 방화벽 사용

  - 웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 방법

반응형

'개발새발 > 기타' 카테고리의 다른 글

코딩 스타일 괄호 및 표기법  (1) 2021.05.27

+ Recent posts