예를 들어 영화를 검색할 수 있는 웹 사이트가 있다고 했을 때,
사이트에는 유저가 검색어를 입력하도록 요청하는 양식이 있을 것입니다.
이 검색어는 영화에 대한 데이터베이스를 검색하는 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
'CS' 카테고리의 다른 글
프로세스와 스레드 + 멀티 스레드 (0) | 2023.01.12 |
---|---|
SQL 과 NoSQL (0) | 2023.01.09 |
교착상태 (Deadlock) (0) | 2023.01.09 |
트랜잭션 (0) | 2022.12.27 |
정규화 (0) | 2022.12.27 |