예를 들어 영화를 검색할 수 있는 웹 사이트가 있다고 했을 때,
사이트에는 유저가 검색어를 입력하도록 요청하는 양식이 있을 것입니다.
이 검색어는 영화에 대한 데이터베이스를 검색하는 SQL 쿼리를 작성하는 데 사용될 것 입니다.
하지만 만약 사용자 입력의 유효성을 제대로 검사하지 않는 경우 누군가가 데이터베이스에서
암호나 신용 카드 번호와 같은 중요한 데이터를 검색하는 방식으로 SQL 쿼리를 수정하는 악의적인 공격이 있을 수 있습니다.
즉, SQL injection은 공격자가 웹 사이트의 SQL 문에 악성 코드를 삽입하고 데이터베이스의 중요한 정보에 무단으로 엑세스하는 사이버 공격유형을 말합니다.
공격 종류
☑ Union-based
“UNION” 연산자(두 개 의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여줌)를 사용하여
두 개 이상의 SELECT문의 결과를 합쳐져서 하나의 결과물로 보여지게 됩니다.
SELECT * FROM users WHERE username = '' UNION SELECT * FROM secret_table WHERE 1=1 --' AND password = '$password'
사용자 테이블의 모든 행과 secret_table의 모든 행을 검색하여 두 쿼리문이 합쳐져서 하나의 테이블로 보여지게 됩니다.
인젝션이 성공한다면, 사용자의 개인정보가 화면에 보여질 수 있습니다.
☑ Error-based
논리적 에러를 이용한 SQL Injection 으로 논리적 에러를 이용한 대표적인 공격입니다.
SELECT * FROM users WHERE username='' OR 1=1--' AND password='$password'
users"OR 1=1" 조건이 항상 참이므로 데이터베이스 서버가 테이블의 모든 행을 반환하도록 합니다.
공격자는 반환된 행에 포함된 정보를 사용하여 데이터베이스의 구조 및 콘텐츠에 대한 정보를 추론할 수 있습니다.
☑ Boolean-based
데이터베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 때 사용합니다.
SELECT * FROM users WHERE username='' AND 1=2--' AND password='$password'
"AND 1=2" 조건이 항상 거짓이므로 항상 빈 결과 집합을 반환합니다.
공격자는 데이터베이스에서 정보를 추출하기 위해 다른 부울 문을 주입하고 쿼리 출력의 변경 사항을 유리하게 이용 할 수 있습니다.
☑ Stored procedure
일련의 쿼리들을 모아 하나의 함수처럼 사용하기 위한 것입니다.
단, 공격자가 시스템 권한을 획득 해야 하므로 공격난이도가 높으나 공격에 성공한다면, 서버에 직접적인 피해를 입힐 수 있는 공격 입니다.
☑ Inferential
요청을 처리하고 데이터베이스 서버에서 소요되는 시간을 사용하여 데이터베이스에 대한 정보를 추론할 수 있습니다.
대응방안
☑ 입력값 검증
사용자의 입력이 DB Query에 동적으로 영향을 주는 경우 입력된 값이 개발자가 의도한 값(요효값) 인지 검증합니다
☑ 저장 프로시저 사용
저장 프로시저는 사용하자고 하는 Query에 미리 형식을 지정하는 것을 말합니다. 지정된 형식의 데이터가 아니면 Query가 실행되지 않기 때문에 보안성을 크게 향상시킵니다.
☑ 서버보안
- 최소 권한 유저로 DB 운영
- 사용하지 않는 저장 프로시저와 내장함수 제거 또는 권한 제어
- 목적에 따라 Query권한 수정
- 공용 시스템 객체의 접근 제어
- 신뢰할 수 있는 네트워크, 서버에 대해서만 접근 허용
- 에러 메시지 노출 차단
Reference Path
SQL Injection 이란? (SQL 삽입 공격)
1. SQL Injection 1.1 개요 SQL InjectionSQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는
noirstar.tistory.com
'CS' 카테고리의 다른 글
프로세스와 스레드 + 멀티 스레드 (0) | 2023.01.12 |
---|---|
SQL 과 NoSQL (0) | 2023.01.09 |
교착상태 (Deadlock) (0) | 2023.01.09 |
트랜잭션 (0) | 2022.12.27 |
정규화 (0) | 2022.12.27 |