SQL Injection: Concepts, Attack Methods, Key Payloads

SQL 인젝션: 개념, 공격 방식, 주요 페이로드

카테고리

보안

서브카테고리

인프라/DevOps/보안

대상자

  • 웹 개발자, 보안 전문가, DevOps 엔지니어
  • 중급~고급 난이도: SQL 인젝션 공격 기법과 방어 전략 이해를 위한 내용 포함

핵심 요약

  • SQL 인젝션은 사용자 입력을 SQL 쿼리에 직접 삽입하여 데이터베이스를 조작하는 보안 취약점으로, ' OR 1=1--와 같은 페이로드를 통해 인증 우회나 데이터 유출이 가능하다.
  • UNION SELECTinformation_schema 등의 메타데이터 테이블을 활용해 데이터베이스 구조를 탐색할 수 있으며, CONCAT이나 UPDATEXML 함수를 통해 비밀번호 추출이 가능하다.
  • 블라인드 SQL 인젝션시간 지연(SLEEP(5))이나 논리 조건(OR 1=1 vs OR 1=2)을 통해 직접적인 출력 없이도 취약점 확인이 가능하다.

섹션별 세부 요약

1. 오류 관찰

  • 사용자 입력에 단일/이중 인용문(' 또는 "을 삽입해 오류 메시지(예: 500 Internal Server Error)를 유발한다.
  • 오류 메시지에서 쿼리 구조를 유추해 인젝션 가능 여부를 판단할 수 있다.

2. 행동 차이 분석

  • 논리 조건(OR 1=1 vs OR 1=2)을 삽입해 페이지 내용, HTTP 상태 코드, HTML 요소 변화를 비교하여 인젝션 가능성을 확인한다.

3. 시간 기반 테스트

  • SLEEP(5)(MySQL), WAITFOR DELAY '0:0:5'(MSSQL), pg_sleep(5)(PostgreSQL)와 같은 데이터베이스 특정 함수를 사용해 응답 지연을 통해 인젝션 성공 여부를 판단한다.

4. 자동화 도구 활용

  • sqlmap, Burp Suite 등이 자동 페이로드 생성 및 분석을 수행하지만, 사용자 정의 로직 취약점이나 WAF 우회는 수동 테스트가 필수적이다.

5. 로그인 폼 인젝션 예시

  • 사용자 입력에 ' OR '1'='1을 입력해 AND 조건을 우회하여 인증 우회를 유발한다.
  • 예: SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'foo';

6. 세션 쿠키 인젝션

  • TrackingIdAND '1'='1 또는 AND '1'='2를 추가해 세션 타임아웃 유도 또는 인젝션 가능성 확인.

7. `UNION` 공격

  • UNION SELECT를 사용해 다른 테이블의 데이터를 추출하되, 열 수 및 데이터 타입 일치가 필수적이다.
  • 예: SELECT id, username, password FROM users--

8. 메타데이터 탐색

  • information_schema.tablesinformation_schema.columns를 사용해 테이블/칼럼 이름을 추출한다.
  • 예: SELECT NULL, table_name FROM information_schema.tables--

9. 오류 기반 데이터 유출

  • CONVERT(int, (SELECT @@version)) 또는 CAST((SELECT user()) AS INT)와 같은 타입 변환 오류를 유발해 데이터베이스 버전/사용자 정보를 추출한다.

10. 블라인드 SQL 인젝션

  • 논리 조건(EXISTS(SELECT 1 FROM users WHERE username='admin')) 또는 시간 지연(SLEEP(5))을 통해 직접 출력 없이도 데이터 추출이 가능하다.

결론

  • SQL 인젝션 방어를 위해 파라미터화 쿼리(예: PreparedStatement)와 입력 검증을 필수적으로 적용해야 하며, UNION, information_schema, CONCAT 등의 공격 패턴에 대응하는 보안 모니터링이 필요하다.
  • 자동화 도구(sqlmap) 사용 시 사용자 정의 로직 취약점은 수동 테스트로 보완해야 하며, WAITFOR DELAYSLEEP과 같은 시간 기반 공격에 대비한 응답 시간 제한 설정이 중요하다.