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 |
---|