SQL 인젝션 공격이란?

2023. 7. 17. 00:10개발 일지/백엔드

SQL 인젝션은 웹 애플리케이션의 보안 취약점을 이용한 공격 방식으로, 악의적인 사용자가 SQL 쿼리를 조작하여 데이터베이스를 비정상적으로 조작하는 행위입니다. 

특히 웹 애플리케이션에서 사용자의 입력을 적절하게 검증하거나 필터링하지 않을 때 발생할 수 있습니다.

인젝션 공격의 목적은 다양하며, 공격자는 아래와 같은 행위를 수행할 수 있습니다.

데이터 추출: 공격자는 민감한 데이터를 추출하기 위해 SQL 쿼리를 조작할 수 있습니다. 예를 들어, 사용자 이름과 비밀번호, 신용 카드 정보, 개인 식별 정보 등을 데이터베이스에서 추출할 수 있습니다.

데이터 조작: 공격자는 데이터를 수정하거나 삭제하기 위해 SQL 쿼리를 조작할 수 있습니다. 예를 들어, 다른 사용자의 정보를 변경하거나 삭제할 수 있습니다.

인증 우회: 공격자는 SQL 쿼리를 조작하여 애플리케이션의 인증 메커니즘을 우회할 수 있습니다. 예를 들어, 비밀번호 검증 단계를 우회하여 다른 사용자의 계정에 로그인할 수 있습니다.

 

무시무시하지요?

 

대표적인 예시를 들어볼까요?

SELECT * FROM Users WHERE username = '사용자가 요청한 쿼리의 입력 공간';

SELECT * FROM Users WHERE username = '돌핀코딩';

 

위와 같은 쿼리가 발생하는 api를 개발했다고 가정해 볼게요.

위의 쿼리는 Users라는 테이블을 조회하는데, username이라는 칼럼의 값이 '돌핀코딩'인 사용자의 정보를 가져오는 쿼리예요

 

그런데 위와 같은 쿼리에서 만약 돌핀코딩 대신에 ';drop table Users;'가 된다면 어떻게 될까요?

 

SELECT * FROM Users WHERE username = '';drop table Users;'';

username이라는 값은 조회를 하고, 뒤에 drop table Users를 실행하면서 Users 테이블이 날아가게 돼요!

이런 공격을 SQL 인젝션 공격이라고 합니다.

 

그럼 이런 공격을 방어하려면 어떻게 해야 할까요?

 

가장 간단한 방법은 Prepared Statement 방식으로 쿼리를 실행하는 거예요!

 

SELECT * FROM Users WHERE username = ?;

 

Prepared Statement는 사전에 쿼리의 처리 과정이 컴파일이 되어 있어 ; 같은 SQL 관련 특수 문자가 들어와도 SQL 문법으로 적용되지 않습니다.

 

String query = "select * from Users where username = ?";
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setString(1, queryUsername);
return pstmt;

 

대표적으로 Spring에서는 JDBC, QueryDsl 등이 이러한 방식으로 쿼리를 컴파일하여 사용한답니다.

 

 

이외에도 SQL 인젝션 공격을 방지하기 위한 다양한 주요 방법은 아래와 같습니다.

입력 유효성 검사: 사용자의 입력은 항상 검증해야 합니다. 이는 악의적인 입력이 SQL 쿼리의 일부로 해석되는 것을 방지하는 첫 번째 방어선입니다.

최소 권한 원칙: 애플리케이션의 데이터베이스 계정은 가능한 최소한의 권한을 가지고 있어야 합니다. 이는 공격자가 SQL 인젝션을 통해 획득할 수 있는 권한을 제한합니다.

ORM 도구 사용: 객체 관계 매핑(ORM) 도구는 SQL 인젝션 공격을 방지하는 데 도움을 줄 수 있습니다. ORM 도구는 일반적으로 안전한 쿼리 생성을 지원하므로, 개발자가 직접 SQL 쿼리를 작성하지 않아도 됩니다.

 

파라미터화된 쿼리 사용: 파라미터화된 쿼리(또는 준비된 문장)는 SQL 인젝션을 막는 데 매우 효과적입니다. 이는 데이터베이스가 사용자 입력을 항상 데이터로만 처리하도록 함으로써, 그 입력이 SQL 명령으로 해석되지 않도록 보장합니다.

 

SQL 인젝션 공격에 대해 이해되셨나요?

 

그럼 20000 즐코하세요!

'개발 일지 > 백엔드' 카테고리의 다른 글

API에서 URL의 작성 관례  (0) 2023.07.16