SQL Injection: 데이터베이스 공격의 주요 위협 기법
- SQL Injection의 기본 개념
- SQL Injection의 주요 특징
- 주요 공격 기법
- SQL Injection 침입 확인 방법
- 취약점 검색 방법
- SQL Injection 방어 및 조치 기법
- 실제 SQL Injection 사례
- 결론
- Keywords
SQL Injection은 웹 애플리케이션의 보안 취약점을 악용하는 가장 일반적이고 위험한 공격 기법 중 하나이다. 공격자가 웹 애플리케이션의 입력 필드를 통해 악의적인 SQL 쿼리를 삽입하여 데이터베이스를 조작하는 방식으로 이루어진다. 이 공격은 여전히 OWASP Top 10 웹 취약점 목록에서 높은 순위를 차지하고 있으며, 수많은 데이터 유출 사고의 원인이 되어왔다.
SQL Injection의 기본 개념
- 정의: 웹 애플리케이션에서 입력 받은 파라미터를 변조하여 SQL 쿼리를 재구성함으로써 데이터베이스에 비정상적인 접근을 시도하는 해킹 기법
- 목적: 인증 우회, 데이터 유출, 데이터 조작, 데이터 삭제, 시스템 명령 실행 등
- 동작 원리: 사용자 입력값이 적절한 검증 없이 SQL 쿼리에 직접 결합될 때 발생
SQL Injection의 주요 특징
- 대량 삽입 가능성: 하나의 취약점으로 수천 개의 웹사이트에 동시 공격 가능
- 자동화된 스크립트: 공격 도구를 이용해 자동으로 취약점 스캔 및 공격 실행
- 공격 로그 식별 어려움: 일반 요청과 유사하게 보여 탐지가 어려움
- 데이터 손실 위험: 데이터베이스 내용 삭제, 변조 가능성
- 간단한 구현: 고도의 기술 없이도 기본적인 공격 가능
주요 공격 기법
1. 인증 우회 (Authentication Bypass)
로그인 폼에서 사용자 인증을 우회하는 가장 기본적인 SQL Injection 공격 기법이다.
-- 원래 쿼리
SELECT * FROM users WHERE username='input_username' AND password='input_password';
-- 공격 예시: username 필드에 ' OR '1'='1 입력 시
SELECT * FROM users WHERE username='' OR '1'='1' AND password='input_password';
이 공격이 성공하면 '1'='1'은 항상 참이므로 첫 번째 사용자(주로 관리자)로 로그인된다.
2. Error-Based Injection
데이터베이스 오류 메시지를 이용하여 데이터베이스 구조와 정보를 파악하는 기법이다.
- 예시: 입력 필드에
'
또는"
같은 특수문자를 입력하여 오류 메시지 유도 - 활용: 오류 메시지에서 테이블명, 컬럼명, 데이터베이스 종류 등 정보 수집
-- 공격 예시: id 파라미터에 ' 입력 시
SELECT * FROM products WHERE id=''';
위 쿼리는 구문 오류를 발생시키며, 오류 메시지에 데이터베이스 정보가 포함될 수 있다.
3. Blind SQL Injection
오류 메시지나 직접적인 결과를 볼 수 없는 상황에서 사용되는 기법이다.
- Boolean-based: 참/거짓 조건을 이용해 정보를 한 비트씩 추출
- Time-based: 쿼리 실행 시간 차이를 이용해 정보 추출
-- Boolean-based 예시
' OR (SELECT ASCII(SUBSTRING(username,1,1)) FROM users WHERE id=1) > 100 --
-- Time-based 예시
' OR IF((SELECT ASCII(SUBSTRING(username,1,1)) FROM users WHERE id=1) > 100, SLEEP(5), 0) --
4. Mass SQL Injection
한 번의 공격으로 다수의 데이터베이스 테이블을 감염시키는 기법이다.
- 특징: 주로 웹사이트의 모든 페이지에 악성 스크립트 삽입
- 목적: 방문자의 개인정보 탈취, 악성코드 배포 등
graph TD
A[공격자] -->|취약한 웹사이트 검색| B[대량 SQL Injection 공격]
B --> C[다수 DB 테이블 감염]
C --> D[악성 스크립트 삽입]
D --> E[방문자 정보 탈취]
D --> F[악성코드 배포]
SQL Injection 침입 확인 방법
1. 데이터베이스 확인
- 데이터베이스 테이블 변경 사항 검토
- 예상치 못한 새로운 관리자 계정 확인
- 비정상적인 쿼리 로그 분석
2. 웹 로그 확인
- HTTP 요청에서 SQL 구문이 포함된 비정상적인 파라미터 검색
- 특수문자(
'
,"
,;
,--
,/**/
등) 포함된 요청 분석 - 비정상적인 접근 패턴 모니터링
취약점 검색 방법
1. 수동 확인
- 입력 필드에
'
,"
,;
등의 특수문자 삽입 테스트 - SQL 쿼리 논리를 변경하는 구문(
OR 1=1
) 테스트 - 오류 메시지 유발 및 분석
2. 자동 확인
- SQLmap, OWASP ZAP, Burp Suite 등 보안 테스트 도구 활용
- 자동화된 취약점 스캐너 활용
- 정기적인 보안 점검 수행
SQL Injection 방어 및 조치 기법
1. 바인딩 매개변수 방식 적용 (Prepared Statements)
가장 효과적인 방어 방법으로, SQL 쿼리와 데이터를 분리하여 처리한다.
// 취약한 코드
String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
// 안전한 코드 (Java 예시)
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE username=? AND password=?");
stmt.setString(1, username);
stmt.setString(2, password);
2. 사용자 입력값 검증 및 필터링
- 화이트리스트 방식 검증: 허용된 문자와 패턴만 입력 허용
- 특수문자 이스케이프 처리
- 입력 길이 제한
// JavaScript 예시
function validateInput(input) {
// 알파벳, 숫자만 허용
return /^[a-zA-Z0-9]+$/.test(input);
}
3. 서버 필터 적용
- 웹 애플리케이션 방화벽(WAF) 도입
- ModSecurity 같은 오픈소스 필터 활용
- SQL Injection 시그니처 기반 필터링
4. 최소 권한 원칙 적용
- 데이터베이스 사용자에게 필요한 최소한의 권한만 부여
- 웹 애플리케이션용 별도 DB 계정 사용
- 중요 데이터 접근 시 추가 인증 요구
5. 오류 메시지 관리
- 상세한 오류 정보를 사용자에게 노출하지 않음
- 사용자 정의 오류 페이지 구현
- 디버깅 정보는 로그에만 기록
flowchart LR
A[사용자 입력] --> B{입력값 검증}
B -- 검증 실패 --> C[오류 메시지]
B -- 검증 성공 --> D[매개변수 바인딩]
D --> E[SQL 쿼리 실행]
E --> F[결과 반환]
G[로깅 및 모니터링] --> E
실제 SQL Injection 사례
1. Sony Pictures (2011)
공격자들이 SQL Injection 취약점을 이용해 100만 명 이상의 사용자 정보를 탈취했다. 해시되지 않은 비밀번호, 이메일, 집 주소 등 민감한 정보가 포함되었다.
2. Yahoo (2012)
약 45만 개의 사용자 계정 정보가 SQL Injection을 통해 유출되었다. 해시된 비밀번호와 함께 이메일 주소가 공개되었다.
3. Heartland Payment Systems (2008)
SQL Injection을 통해 1억 3천만 개의 신용카드 정보가 도난당한 대형 데이터 유출 사고였다. 당시 피해액은 약 1억 4천만 달러로 추산되었다.
결론
SQL Injection은 단순하지만 강력한 공격 기법으로, 적절한 방어책이 없으면 심각한 데이터 유출과 재정적 손실을 초래할 수 있다. 개발자는 안전한 코딩 관행을 따르고, 데이터베이스 접근 로직을 주기적으로 검토해야 한다. 매개변수화된 쿼리, 입력값 검증, 최소 권한 원칙은 SQL Injection 방어의 핵심 요소이다. 보안은 일회성 조치가 아닌 지속적인 프로세스로 접근해야 한다.
Keywords
SQL Injection, 매개변수 바인딩, 인증 우회, Error-Based, Blind SQL Injection, 데이터베이스 보안, 웹 취약점, 입력값 검증, 보안 테스트, 최소 권한 원칙
'IT Professional Engineering > SEC' 카테고리의 다른 글
Mass SQL Injection: 대량 데이터베이스 변조 공격의 위험성 (0) | 2025.05.29 |
---|---|
Blind SQL Injection: 보이지 않는 곳에서 이루어지는 데이터베이스 공격 기법 (1) | 2025.05.29 |
모바일 OWASP 2016: 모바일 애플리케이션 보안 취약점 대응 가이드 (0) | 2025.05.29 |
OWASP 2013: 웹 애플리케이션 보안 최상위 위협 요소 분석 (0) | 2025.05.29 |
OWASP 2017: 웹 애플리케이션 보안 취약점 Top 10 종합 가이드 (0) | 2025.05.29 |