SQL 인젝션: 개념, 공격 방식, 주요 페이로드
카테고리
보안
서브카테고리
인프라/DevOps/보안
대상자
- 웹 개발자, 보안 전문가, DevOps 엔지니어
- 중급~고급 난이도: SQL 인젝션 공격 기법과 방어 전략 이해를 위한 내용 포함
핵심 요약
- SQL 인젝션은 사용자 입력을 SQL 쿼리에 직접 삽입하여 데이터베이스를 조작하는 보안 취약점으로,
' OR 1=1--
와 같은 페이로드를 통해 인증 우회나 데이터 유출이 가능하다. UNION SELECT
와information_schema
등의 메타데이터 테이블을 활용해 데이터베이스 구조를 탐색할 수 있으며,CONCAT
이나UPDATEXML
함수를 통해 비밀번호 추출이 가능하다.- 블라인드 SQL 인젝션은 시간 지연(
SLEEP(5)
)이나 논리 조건(OR 1=1
vsOR 1=2
)을 통해 직접적인 출력 없이도 취약점 확인이 가능하다.
섹션별 세부 요약
1. 오류 관찰
- 사용자 입력에 단일/이중 인용문(
'
또는"
을 삽입해 오류 메시지(예:500 Internal Server Error
)를 유발한다. - 오류 메시지에서 쿼리 구조를 유추해 인젝션 가능 여부를 판단할 수 있다.
2. 행동 차이 분석
- 논리 조건(
OR 1=1
vsOR 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. 세션 쿠키 인젝션
TrackingId
에AND '1'='1
또는AND '1'='2
를 추가해 세션 타임아웃 유도 또는 인젝션 가능성 확인.
7. `UNION` 공격
UNION SELECT
를 사용해 다른 테이블의 데이터를 추출하되, 열 수 및 데이터 타입 일치가 필수적이다.- 예:
SELECT id, username, password FROM users--
8. 메타데이터 탐색
information_schema.tables
와information_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 DELAY
나SLEEP
과 같은 시간 기반 공격에 대비한 응답 시간 제한 설정이 중요하다.