본문 바로가기
카테고리 없음

SQL 인젝션에 대해 알아보자

by 지니앤잡 2025. 4. 6.

이 글에서는 SQL 인젝션의 정의부터 블라인드 SQLi, 유니온 기반 SQLi, 저장 프로시저를 이용한 공격까지 다양한 기법을 상세히 설명합니다. 보안 실무자와 개발자 모두가 알아야 할 핵심 지식을 제공합니다.

 

SQL 인젝션에서 보호하기
SQL 인젝션에서 보호하기

1. SQL 인젝션이란 무엇인가요?

SQL 인젝션(SQL Injection)은 웹 애플리케이션의 보안 취약점을 노려 악의적인 SQL 구문을 삽입함으로써 데이터베이스에 비정상적인 접근을 시도하는 공격 기법입니다. 주로 입력 필드를 통해 전송된 사용자 입력값이 적절히 검증되지 않거나 필터링되지 않을 때 발생하며, 공격자는 이를 이용해 데이터베이스의 정보를 탈취하거나 조작할 수 있습니다. 예를 들어 로그인 화면에서 admin' OR '1'='1과 같은 값을 입력하면 인증 절차를 우회하여 관리자 권한을 획득할 수 있습니다. 이러한 공격은 단순한 인증 우회를 넘어, 전체 테이블 덤프, 데이터 수정 및 삭제, 시스템 명령 실행까지 이어질 수 있기 때문에 매우 위험합니다. 특히 사용자 정보, 결제 내역 등 민감한 데이터를 다루는 시스템에서는 SQL 인젝션에 대한 대비가 필수입니다.

2. 블라인드 SQL 인젝션(Blind SQL Injection)의 정교한 기법

블라인드 SQL 인젝션은 일반적인 SQL 인젝션처럼 즉각적인 에러 메시지를 통해 결과를 알 수 없는 상황에서 사용되는 정교한 기법입니다. 서버가 공격자의 쿼리에 직접적인 응답을 하지 않더라도, 참(True) 또는 거짓(False)에 따라 다른 반응을 보이는 것을 이용하여 데이터베이스 구조나 내용을 추론할 수 있습니다. 예를 들어 ' AND 1=1 --' AND 1=2 --를 번갈아 넣어보고, 응답 페이지의 차이를 통해 참/거짓 여부를 유추합니다. 이 방법은 시간차 분석(Time-based Blind SQLi) 또는 조건 기반 응답(Boolean-based Blind SQLi) 등으로 더 세분화됩니다. 특히 보안 메시지를 숨기거나 에러 출력을 막은 시스템에서도 공격이 가능하다는 점에서 방어하기 까다롭습니다. 실제로 자동화된 툴을 통해 이 방식이 대규모로 악용되는 사례가 많기 때문에 더욱 주의가 필요합니다.

3. 유니온 기반 SQL 인젝션(Union-based SQLi)과 그 응용

유니온 기반 SQL 인젝션은 UNION SQL 구문을 활용해 공격자가 원하는 결과를 기존 쿼리 결과에 덧붙이는 방식입니다. 예를 들어 SELECT name FROM users WHERE id='1' UNION SELECT credit_card FROM payments -- 와 같은 식으로 두 개의 SELECT 쿼리를 결합해 민감한 정보를 추출할 수 있습니다. 이 기법의 핵심은 테이블의 칼럼 수와 데이터 타입을 정확히 파악하는 것이며, 공격자는 ORDER BYNULL 값을 활용해 칼럼 수를 추정하고, 이후 적절한 칼럼에 원하는 정보를 삽입합니다. 이 방식은 시각적으로 즉각적인 결과를 확인할 수 있어, 블라인드 방식보다 빠르고 효과적인 편입니다. 하지만 웹 서버가 결과를 브라우저에 그대로 출력하지 않거나, UNION 키워드를 필터링할 경우 공격이 제한되므로 이를 우회하기 위한 변형 기법도 많이 활용됩니다.

4. 스토어드 프로시저와 다단계 SQL 인젝션

일부 시스템에서는 데이터베이스 로직을 저장 프로시저(Stored Procedure)로 관리합니다. 이 경우에도 SQL 인젝션은 여전히 위협이 될 수 있으며, 오히려 더 강력한 공격이 가능해집니다. 스토어드 프로시저 내에 문자열 연결 방식으로 쿼리를 구성하면, 공격자가 입력값을 조작해 프로시저 자체의 흐름을 바꿀 수 있습니다. 특히 프로시저가 다른 프로시저를 호출하거나 동적 SQL을 실행할 경우, 다단계로 공격이 확장될 수 있어 더욱 위험합니다. 예를 들어 하나의 인젝션으로 여러 테이블에 연쇄적으로 영향을 주는 시나리오도 발생할 수 있습니다. 또한 일부 데이터베이스에서는 시스템 명령어 호출 기능까지 제공되기 때문에, 데이터 탈취를 넘어 시스템 장악까지 이어질 수 있습니다. 이를 방지하기 위해서는 파라미터 바인딩을 철저히 적용하고, 동적 SQL 사용을 최소화하는 것이 중요합니다.

결론

SQL 인젝션은 단순한 취약점이 아닌, 웹 시스템 전체를 위협할 수 있는 매우 치명적인 공격입니다. 특히 다양한 방식으로 변형되고 자동화된 공격 도구들이 존재하기 때문에, 항상 입력값에 대한 유효성 검사를 강화하고, 쿼리 작성 시 파라미터 바인딩을 적용하는 것이 필수적입니다. 개발 초기부터 보안을 염두에 둔 설계가 되어야 하며, 주기적인 보안 점검도 필요합니다.