SQL Injection
어플리케이션보안에서 가장 중요한 취약점 중 하나인 SQL Injection을 집중적으로 정리합니다.
어플리케이션보안에서 가장 중요한 취약점 중 하나인 SQL Injection을 집중적으로 정리합니다.
HTTP 요청과 응답
GET과 POST
쿠키와 세션
인증과 인가
HTTPS
웹 로그
입력값 검증
오류 메시지 노출SQL Injection은 필기에서도 자주 나오고, 실기에서도 매우 자주 답안형으로 나올 수 있는 주제입니다.
SQL Injection의 개념을 설명하시오.
SQL Injection의 발생 원인과 대응 방안을 설명하시오.
Prepared Statement가 SQL Injection 대응에 효과적인 이유를 설명하시오.
SQL Injection 공격 로그를 보고 의심 근거와 대응 방안을 제시하시오.학습 목표
이번 절가 끝나면 다음 질문에 답할 수 있어야 합니다.
| 질문 | 목표 |
|---|---|
| SQL Injection이란 무엇인가? | 입력값에 SQL 구문을 삽입해 DB를 공격하는 기법이라고 설명 |
| SQL Injection은 왜 발생하는가? | 사용자 입력값을 검증하지 않고 SQL문에 직접 결합해서 발생한다고 설명 |
| 어떤 피해가 발생하는가? | 인증 우회, 정보 유출, 데이터 변조·삭제, 권한 상승 등을 설명 |
| Prepared Statement란 무엇인가? | SQL 구조와 입력값을 분리하는 방식이라고 설명 |
| 입력값 검증은 왜 필요한가? | 허용된 형식의 값만 처리하기 위해 필요하다고 설명 |
| DB 권한 최소화는 왜 중요한가? | 공격 성공 시 피해 범위를 줄이기 위해 필요하다고 설명 |
| 오류 메시지 노출 제한은 왜 필요한가? | DB 구조와 쿼리 정보 노출을 막기 위해 필요하다고 설명 |
| SQL Injection 대응책은? | Prepared Statement, 입력값 검증, DB 권한 최소화, 오류 메시지 제한, WAF 등을 제시 |
SQL Injection의 큰 그림
SQL Injection은 웹 애플리케이션과 DB가 연결된 부분에서 발생합니다.
예를 들어 로그인 기능을 생각해봅시다.
사용자 입력
→ 웹 서버
→ 애플리케이션 서버
→ SQL 쿼리 생성
→ DB 조회
→ 결과 반환이 과정에서 서버가 사용자 입력값을 안전하게 처리하지 않으면 문제가 발생한다.
사용자 입력값이 SQL문의 일부로 해석됨
→ 공격자가 SQL 구문을 삽입함
→ DB가 공격자의 의도대로 동작함한 줄로 요약하면 다음입니다.
SQL Injection = 사용자 입력값이 데이터가 아니라 SQL 명령어처럼 실행되는 문제SQL이란?
SQL은 Structured Query Language입니다.
DB에 데이터를 조회, 삽입, 수정, 삭제하기 위한 언어입니다.
대표적인 SQL 명령은 다음과 같습니다.
| SQL 명령 | 의미 |
|---|---|
| SELECT | 데이터 조회 |
| INSERT | 데이터 삽입 |
| UPDATE | 데이터 수정 |
| DELETE | 데이터 삭제 |
| WHERE | 조건 지정 |
| ORDER BY | 정렬 |
| JOIN | 테이블 결합 |
예를 들어 회원 정보를 조회하는 SQL은 다음과 같은 구조입니다.
SELECT * FROM users WHERE id = 'user01';의미는 다음입니다.
users 테이블에서 id가 user01인 사용자를 조회하라.로그인에서는 보통 이런 구조가 사용될 수 있습니다.
SELECT * FROM users
WHERE id = '입력한 아이디'
AND password = '입력한 비밀번호';문제는 이 SQL을 만들 때 사용자 입력값을 그대로 붙이면 발생합니다.
SQL Injection이란?
시험식 정의는 다음입니다.
SQL Injection은 웹 애플리케이션의 입력값에 악의적인 SQL 구문을 삽입하여 데이터베이스를 비정상적으로 조회, 수정, 삭제하거나 인증을 우회하는 공격 기법이다.핵심 의미는 다음과 같다.
SQL Injection = 입력창에 SQL 명령을 넣어 DB를 공격하는 기법공격 대상은 보통 다음과 같습니다.
로그인 폼
검색창
게시판
URL 파라미터
쿠키
HTTP 헤더
API 요청값
파일명
정렬 조건중요한 점은 이것입니다.
SQL Injection은 입력창에만 생기는 것이 아니다.
서버가 SQL에 사용하는 모든 입력값에서 발생할 수 있다.SQL Injection 발생 원인
SQL Injection의 가장 핵심 원인은 다음입니다.
사용자 입력값을 검증하지 않고 SQL 문자열에 직접 결합하기 때문취약한 구조를 단순화하면 다음과 같습니다.
SQL문 = "SELECT * FROM users WHERE id = '" + 사용자입력 + "'"이런 방식에서는 사용자의 입력이 단순한 데이터가 아니라 SQL문의 일부로 해석될 수 있습니다.
취약한 쿼리 생성 방식
나쁜 방식의 핵심은 문자열 연결입니다.
고정된 SQL 구조 + 사용자 입력값을 문자열로 직접 연결예를 들어 로그인 처리에서 다음처럼 SQL을 만든다고 생각해봅시다.
SELECT * FROM users
WHERE id = '사용자입력ID'
AND password = '사용자입력PW';정상 입력이면 문제가 없어 보인다.
ID: user01
PW: pass1234하지만 공격자가 입력값에 SQL 문법 요소를 넣으면 쿼리 구조가 바뀔 수 있습니다.
여기서 중요한 시험 포인트는 실제 공격 문자열을 외우는 것이 아니라, 입력값이 SQL 구조를 바꾼다는 원리를 이해하는 것입니다.
SQL Injection의 주요 피해
SQL Injection이 발생하면 다음과 같은 피해가 가능합니다.
| 피해 | 설명 |
|---|---|
| 인증 우회 | 비밀번호를 몰라도 로그인 우회 가능 |
| 정보 유출 | 회원정보, 개인정보, 관리자 정보 조회 |
| 데이터 변조 | 게시글, 금액, 권한 정보 수정 |
| 데이터 삭제 | 테이블 또는 레코드 삭제 |
| 권한 상승 | 일반 사용자가 관리자 권한 획득 가능 |
| DB 구조 노출 | 테이블명, 컬럼명, DB 오류 정보 노출 |
| 시스템 침해 확대 | DB 권한이 과도하면 서버 침해로 확대 가능 |
| 서비스 장애 | DB 부하, 데이터 손상으로 서비스 중단 |
시험에서 가장 많이 연결되는 피해는 다음입니다.
인증 우회
개인정보 유출
DB 데이터 변조·삭제SQL Injection 유형
정보보안기사 수준에서는 너무 깊은 공격 기법보다 유형의 개념을 구분하는 것이 중요합니다.
주요 유형은 다음입니다.
| 유형 | 핵심 |
|---|---|
| 인증 우회형 | 로그인 조건을 조작해 인증을 우회 |
| 오류 기반 | DB 오류 메시지를 통해 정보 추출 |
| Union 기반 | 다른 SELECT 결과를 결합해 정보 조회 |
| Blind SQL Injection | 화면에 결과가 직접 보이지 않아도 참·거짓 반응으로 추론 |
| Time-based Blind | 응답 지연 시간을 이용해 정보 추론 |
| Stored Procedure 악용 | 저장 프로시저나 동적 SQL 처리 취약점 악용 |
이번 절에서는 개념 중심으로만 정리합니다.
인증 우회형 SQL Injection
로그인 기능에서 SQL Injection이 발생하면 인증 우회가 가능할 수 있습니다.
정상 로그인은 보통 다음 조건을 확인합니다.
아이디가 맞는가?
비밀번호가 맞는가?SQL로는 다음과 같은 구조입니다.
SELECT * FROM users
WHERE id = '입력ID'
AND password = '입력PW';공격자가 입력값을 조작해 WHERE 조건이 항상 참이 되도록 만들면, 비밀번호 검증을 우회할 수 있습니다.
시험에서는 이렇게 이해하면 됩니다.
인증 우회형 SQL Injection은 로그인 조건절을 조작하여 비밀번호 검증 없이 인증된 사용자로 처리되게 하는 공격이다.대응책은 다음입니다.
Prepared Statement 사용
입력값 검증
비밀번호 해시 검증
로그인 실패 횟수 제한
오류 메시지 노출 제한
인증 로직 서버 측 검증오류 기반 SQL Injection
오류 기반 SQL Injection은 DB 오류 메시지를 통해 정보를 얻는 방식입니다.
예를 들어 서버가 이런 상세 오류를 사용자에게 보여준다고 합시다.
SQL syntax error near ...
Unknown column 'user_pw'
Table 'member_admin' doesn't exist공격자는 이런 오류 메시지로 다음을 추측할 수 있습니다.
사용 중인 DB 종류
테이블명
컬럼명
쿼리 구조
서버 경로따라서 상세 오류 메시지를 사용자에게 보여주면 안 됩니다.
오류 기반 SQL Injection은 DB 오류 메시지를 통해 쿼리 구조, 테이블명, 컬럼명 등 내부 정보를 추론하는 공격 방식이다. 대응을 위해 사용자에게 상세 오류를 노출하지 않고, 오류 내용은 서버 로그에만 기록해야 한다.Blind SQL Injection
Blind SQL Injection은 결과나 오류 메시지가 직접 보이지 않아도 서버의 반응 차이를 이용해 정보를 추론하는 공격입니다.
예를 들어 서버가 화면에 DB 결과를 직접 보여주지 않는다고 해도, 다음 차이가 있을 수 있습니다.
조건이 참일 때: 정상 페이지 표시
조건이 거짓일 때: 다른 페이지 표시조건이 참일 때: 응답이 지연됨
조건이 거짓일 때: 바로 응답함이런 차이를 이용해 공격자가 DB 정보를 조금씩 추론할 수 있습니다.
Blind SQL Injection은 쿼리 결과가 화면에 직접 출력되지 않더라도 참·거짓 응답 차이나 응답 지연 시간 등을 이용하여 DB 정보를 추론하는 공격 방식이다.대응책은 일반 SQL Injection과 동일하게 봅니다.
Prepared Statement
입력값 검증
오류 메시지 제한
DB 권한 최소화
비정상 요청 탐지
WAF 적용SQL Injection이 발생하기 쉬운 위치
SQL Injection은 사용자가 입력하는 다양한 위치에서 발생할 수 있습니다.
| 위치 | 예시 |
|---|---|
| 로그인 폼 | 아이디, 비밀번호 |
| 검색창 | 검색어 |
| 게시판 | 제목, 내용, 댓글 |
| URL 파라미터 | ?id=100 |
| 정렬 조건 | sort=name |
| 필터 조건 | 카테고리, 날짜, 상태 |
| 쿠키 | 사용자 식별값 |
| HTTP 헤더 | User-Agent, Referer 등 |
| API 요청 | JSON 파라미터 |
| 파일명 | 업로드 파일명 |
서버가 SQL 생성에 사용하는 모든 외부 입력값은 검증 대상이다.SQL Injection 탐지 징후
웹 로그나 WAF 로그에서 SQL Injection을 의심할 수 있는 징후가 있습니다.
| 징후 | 의미 |
|---|---|
| URL 파라미터에 SQL 키워드 포함 | SELECT, UNION, WHERE 등 |
| 특수문자 반복 | 따옴표, 주석, 괄호 등 |
| 로그인 실패 후 비정상 성공 | 인증 우회 가능성 |
| 500 오류 증가 | SQL 오류 발생 가능성 |
| DB 오류 메시지 노출 | 쿼리 구조 노출 가능성 |
| 긴 Query String | 공격 페이로드 가능성 |
| 동일 URL 반복 변형 요청 | 자동화 도구 또는 스캐닝 |
| WAF의 SQL Injection 탐지 로그 | 공격 시도 가능성 |
| 비정상 DB 조회량 증가 | 정보 유출 가능성 |
실기에서 로그 분석형으로 나오면 이렇게 답하면 됩니다.
요청 파라미터에 SQL 키워드와 특수문자가 포함되어 있고, 동일 URL에 반복 요청과 500 오류가 발생하므로 SQL Injection 시도로 의심할 수 있다. 대응 방안으로 해당 출발지 IP와 요청 패턴을 분석하고, 입력값 검증, Prepared Statement 적용 여부, 오류 메시지 노출 여부, WAF 탐지 정책을 점검해야 한다.SQL Injection 대응 전체 지도
SQL Injection 대응책은 매우 중요합니다.
필수로 외워야 할 대응책은 다음입니다.
Prepared Statement 사용
입력값 검증
DB 권한 최소화
오류 메시지 노출 제한
WAF 적용
로그 모니터링조금 더 체계적으로 정리하면 다음입니다.
| 대응책 | 목적 |
|---|---|
| Prepared Statement | SQL 구조와 입력값 분리 |
| 입력값 검증 | 허용된 형식의 값만 처리 |
| 특수문자 처리 | SQL 문법 요소로 해석되는 것 방지 |
| DB 권한 최소화 | 공격 성공 시 피해 범위 제한 |
| 오류 메시지 제한 | DB 구조 정보 노출 방지 |
| 비밀번호 해시 저장 | 계정정보 유출 시 피해 완화 |
| WAF | 공격 패턴 탐지·차단 |
| 로그 모니터링 | 공격 시도 탐지와 사고 분석 |
| 보안 코딩 교육 | 개발 단계에서 취약점 예방 |
| 정기 취약점 점검 | 배포 전후 취약점 발견 |
Prepared Statement
Prepared Statement란?
Prepared Statement는 SQL Injection 대응에서 가장 중요한 대책입니다.
시험식 정의는 다음입니다.
Prepared Statement는 SQL문의 구조를 미리 정의하고 사용자 입력값을 파라미터로 바인딩하여 SQL 구문과 데이터를 분리하는 방식이다.핵심 의미는 다음과 같다.
Prepared Statement = SQL 구조와 입력값을 분리하는 안전한 쿼리 방식왜 효과적인가?
일반 문자열 결합 방식에서는 사용자 입력값이 SQL문의 일부로 해석될 수 있습니다.
SQL 구조 + 사용자 입력값이 섞임Prepared Statement에서는 SQL 구조와 입력값이 분리됩니다.
SQL 구조는 고정
사용자 입력값은 데이터로만 처리따라서 사용자가 SQL 문법처럼 보이는 값을 입력해도 DB는 그것을 명령어가 아니라 데이터로 처리합니다.
Prepared Statement는 SQL 구조와 사용자 입력값을 분리하고 입력값을 파라미터로 바인딩하므로, 입력값에 SQL 구문이 포함되더라도 명령어로 해석되지 않고 데이터로 처리된다. 따라서 SQL Injection 방지에 효과적이다.Prepared Statement와 입력값 검증의 관계
Prepared Statement가 중요하지만, 입력값 검증이 필요 없다는 뜻은 아닙니다.
| 대책 | 역할 |
|---|---|
| Prepared Statement | SQL 구조와 입력값 분리 |
| 입력값 검증 | 허용된 형식, 길이, 범위만 처리 |
| DB 권한 최소화 | 공격 성공 시 피해 제한 |
| 오류 메시지 제한 | 내부 정보 노출 방지 |
즉, 가장 좋은 방식은 다음입니다.
Prepared Statement + 입력값 검증 + DB 권한 최소화 + 오류 메시지 제한입력값 검증
입력값 검증은 사용자가 보낸 값이 허용된 형식인지 확인하는 것입니다.
입력값 검증은 사용자 입력이 허용된 형식, 길이, 범위, 문자 집합에 맞는지 확인하여 비정상 입력을 차단하는 보안 조치이다.예를 들어 사용자 번호는 숫자만 허용해야 합니다.
user_id = 숫자만 허용
page = 1 이상의 정수만 허용
email = 이메일 형식만 허용
sort = name, date, price 중 하나만 허용허용목록 방식
입력값 검증에서는 허용목록 방식이 권장됩니다.
허용목록 = 허용된 값만 통과시키는 방식예를 들어 정렬 기준은 다음 값만 허용합니다.
name
date
price그 외 값은 모두 거부합니다.
반대로 차단목록 방식은 위험할 수 있습니다.
차단목록 = 위험해 보이는 값만 막는 방식차단목록은 공격자가 우회 표현을 사용할 수 있기 때문에 한계가 있습니다.
입력값 검증은 차단목록 방식보다 허용목록 방식을 적용하는 것이 바람직하다. 허용된 문자, 형식, 길이, 범위만 통과시켜 우회 입력 가능성을 줄일 수 있기 때문이다.특수문자 처리와 이스케이프
SQL Injection에서는 따옴표, 주석, 괄호, 연산자 같은 문자가 SQL 구조를 바꾸는 데 사용될 수 있습니다.
그래서 일부 상황에서는 특수문자를 적절히 이스케이프하거나 제한해야 합니다.
하지만 중요한 점은 다음입니다.
이스케이프만으로 SQL Injection 방어를 끝냈다고 보면 안 된다.
Prepared Statement가 우선이다.특수문자 이스케이프는 보조적인 대응책이며, SQL Injection 방어의 핵심은 SQL 구조와 입력값을 분리하는 Prepared Statement 사용이다.DB 권한 최소화
DB 권한 최소화는 SQL Injection 피해를 줄이는 중요한 대책입니다.
웹 애플리케이션이 DB에 접속할 때 사용하는 계정에 너무 많은 권한이 있으면 위험합니다.
웹 애플리케이션 DB 계정이 모든 테이블에 SELECT, INSERT, UPDATE, DELETE, DROP 권한을 가짐웹 애플리케이션 기능에 필요한 테이블과 작업 권한만 부여예를 들어 조회 기능만 필요한 계정은 SELECT만 가져야 합니다.
삭제 권한이 필요 없다면 DELETE 권한을 주면 안 됩니다.
DB 권한 최소화는 웹 애플리케이션 DB 계정에 업무 수행에 필요한 최소 권한만 부여하는 것이다. SQL Injection이 발생하더라도 공격자가 수행할 수 있는 조회, 수정, 삭제 범위를 제한하여 피해를 줄일 수 있다.오류 메시지 노출 제한
SQL Injection 공격자는 오류 메시지를 통해 내부 정보를 얻을 수 있습니다.
노출되면 위험한 정보는 다음입니다.
| 노출 정보 | 위험 |
|---|---|
| DB 종류 | DB별 공격 방식 추정 |
| 테이블명 | 데이터 구조 파악 |
| 컬럼명 | 민감정보 위치 파악 |
| SQL 구문 | 쿼리 구조 분석 |
| 서버 경로 | 시스템 구조 파악 |
| 계정명 | 권한 공격에 활용 |
사용자에게는 일반 오류 메시지만 표시한다.
상세 오류는 서버 로그에만 기록한다.상세 SQL 오류 메시지는 DB 종류, 테이블명, 컬럼명, 쿼리 구조 등 내부 정보를 노출하여 SQL Injection 공격에 활용될 수 있다. 따라서 사용자에게는 일반화된 오류 메시지만 제공하고, 상세 오류는 서버 로그에 기록하여 관리자만 확인하도록 해야 한다.WAF 적용
WAF는 Web Application Firewall입니다.
SQL Injection 대응에서 WAF는 다음 역할을 합니다.
HTTP 요청의 URL, 파라미터, 쿠키, 헤더, 본문을 분석하여 SQL Injection 패턴을 탐지·차단WAF는 도움이 되지만, 근본 해결책은 아닙니다.
WAF = 보조 방어
시큐어 코딩 = 근본 방어WAF는 SQL Injection 공격 패턴을 탐지하고 차단하는 데 도움이 되지만, 애플리케이션 코드의 취약점을 제거하는 근본 대책은 아니다. 따라서 Prepared Statement와 입력값 검증 등 시큐어 코딩과 함께 적용해야 한다.저장 프로시저와 SQL Injection
저장 프로시저는 DB에 미리 저장해두고 호출하는 SQL 로직이다.
저장 프로시저를 사용하면 보안에 도움이 될 수 있지만, 무조건 안전한 것은 아닙니다.
저장 프로시저 내부에서 사용자 입력값으로 동적 SQL을 문자열 결합하여 실행하는 경우이 경우에도 SQL Injection이 발생할 수 있습니다.
저장 프로시저를 사용하더라도 내부에서 사용자 입력값을 문자열로 결합한 동적 SQL을 실행하면 SQL Injection이 발생할 수 있다. 따라서 저장 프로시저 내부에서도 파라미터 바인딩과 입력값 검증을 적용해야 한다.ORM과 SQL Injection
ORM은 객체와 DB 테이블을 연결해주는 개발 도구입니다.
ORM을 사용하면 직접 SQL을 작성하지 않아도 DB를 다룰 수 있습니다.
하지만 ORM을 사용한다고 무조건 안전한 것은 아닙니다.
ORM의 파라미터 바인딩 기능을 사용하는 경우ORM에서 직접 작성한 원시 SQL에 사용자 입력값을 문자열로 결합하는 경우ORM을 사용하더라도 사용자 입력값을 원시 SQL 문자열에 직접 결합하면 SQL Injection이 발생할 수 있다. ORM의 안전한 파라미터 바인딩 기능을 사용하고 입력값 검증을 함께 적용해야 한다.SQL Injection 대응 우선순위
실기에서 대응책을 쓸 때 우선순위를 잡으면 답안이 좋아집니다.
Prepared Statement 사용입력값 검증DB 권한 최소화오류 메시지 노출 제한WAF, 로그 모니터링, 취약점 점검답안 구조는 이렇게 쓰면 됩니다.
정의 → 원인 → 피해 → 대응책SQL Injection은 사용자 입력값에 악의적인 SQL 구문을 삽입하여 DB를 비정상적으로 조작하는 공격이다.
주요 원인은 입력값을 검증하지 않고 SQL 문자열에 직접 결합하는 것이다.
대응 방안으로는 Prepared Statement 사용, 입력값 검증, DB 권한 최소화, 오류 메시지 노출 제한, WAF 적용, 로그 모니터링 등이 있다.SQL Injection과 HTTPS의 관계
중요한 시험 포인트입니다.
HTTPS를 사용해도 SQL Injection은 발생할 수 있다.왜냐하면 HTTPS는 통신 구간을 암호화하는 기술이고, SQL Injection은 서버 내부의 입력값 처리 문제이기 때문입니다.
| 구분 | HTTPS | SQL Injection 대응 |
|---|---|---|
| 보호 대상 | 통신 구간 | 애플리케이션 입력 처리 |
| 주요 효과 | 도청·변조 방지 | DB 공격 방지 |
| 핵심 기술 | TLS | Prepared Statement, 입력값 검증 |
| 한계 | 서버 내부 취약점 제거 불가 | 통신 암호화 기능은 아님 |
HTTPS는 클라이언트와 서버 간 통신을 암호화하여 도청과 변조를 방지하지만, 서버 애플리케이션이 입력값을 SQL문에 직접 결합하는 취약점을 제거하지는 못한다. 따라서 SQL Injection 방어를 위해서는 HTTPS와 별도로 Prepared Statement, 입력값 검증, DB 권한 최소화 등을 적용해야 한다.SQL Injection 사고 대응
이미 SQL Injection 공격이 의심되거나 발생했다면 다음 절차로 대응합니다.
탐지
→ 분석
→ 차단
→ 영향 범위 확인
→ 취약점 수정
→ 복구
→ 재발 방지| 단계 | 내용 |
|---|---|
| 탐지 | WAF, 웹 로그, DB 로그에서 비정상 요청 확인 |
| 분석 | 공격 IP, URL, 파라미터, 시간, 성공 여부 분석 |
| 차단 | WAF 정책, 방화벽, IP 차단, 임시 기능 제한 |
| 영향 확인 | 유출·변조·삭제된 데이터 확인 |
| 취약점 수정 | Prepared Statement, 입력값 검증 적용 |
| 복구 | 백업 복원, 데이터 정합성 확인 |
| 재발 방지 | 로그 모니터링, 취약점 점검, 개발 보안 교육 |
SQL Injection 공격이 의심되면 웹 로그, WAF 로그, DB 로그를 분석하여 공격 IP, 요청 URL, 파라미터, 발생 시간, DB 접근 내역을 확인해야 한다. 이후 공격 요청을 차단하고, 데이터 유출·변조 여부를 조사하며, Prepared Statement와 입력값 검증을 적용해 취약점을 수정하고 로그 모니터링과 정기 취약점 점검으로 재발을 방지해야 한다.SQL Injection과 다른 공격 비교
SQL Injection은 XSS, CSRF와 자주 비교됩니다.
| 구분 | SQL Injection | XSS | CSRF |
|---|---|---|---|
| 공격 대상 | DB | 사용자 브라우저 | 사용자의 인증 상태 |
| 핵심 원리 | SQL 구문 삽입 | 악성 스크립트 실행 | 원치 않는 요청 전송 |
| 주요 피해 | 정보 유출, 인증 우회, DB 변조 | 쿠키 탈취, 피싱, 화면 변조 | 비밀번호 변경, 송금, 게시글 작성 |
| 주요 대응 | Prepared Statement, 입력값 검증 | 출력값 인코딩, CSP | CSRF 토큰, SameSite |
| 실기 키워드 | SQL 구조와 입력값 분리 | 사용자 브라우저에서 실행 | 로그인 상태 악용 |
이번 절에서는 이 정도만 기억하면 됩니다.
SQL Injection = DB 공격
XSS = 브라우저 공격
CSRF = 요청 위조내용 연결 정리
로그인 기능을 예로 들면 전체 흐름은 다음과 같다.
1. 사용자가 아이디와 비밀번호를 입력한다.
2. 서버가 입력값을 받는다.
3. 서버가 SQL을 만들어 DB에 조회한다.
4. 입력값을 SQL 문자열에 직접 붙이면 SQL Injection이 발생할 수 있다.
5. 공격자는 조건절을 조작해 인증 우회나 정보 조회를 시도할 수 있다.
6. DB 오류 메시지가 노출되면 테이블명이나 컬럼명을 추측할 수 있다.
7. 공격이 성공하면 개인정보 유출, 데이터 변조, 삭제가 발생할 수 있다.안전한 처리 방식은 다음입니다.
1. 서버에서 입력값 형식과 길이를 검증한다.
2. Prepared Statement로 SQL 구조와 입력값을 분리한다.
3. DB 계정에는 필요한 최소 권한만 부여한다.
4. 상세 오류 메시지는 사용자에게 노출하지 않는다.
5. WAF와 로그 모니터링으로 비정상 요청을 탐지한다.
6. 정기적으로 취약점 점검을 수행한다.시험에 나오는 포인트
이 절에서 필기와 실기에 자주 나오는 포인트는 다음과 같다.
| 주제 | 시험 포인트 |
|---|---|
| SQL Injection | 입력값에 SQL 구문 삽입 |
| 발생 원인 | 입력값을 SQL 문자열에 직접 결합 |
| 주요 피해 | 인증 우회, 정보 유출, 데이터 변조·삭제 |
| 오류 기반 | DB 오류 메시지로 정보 추론 |
| Blind SQL Injection | 참·거짓 또는 응답 시간으로 정보 추론 |
| Prepared Statement | SQL 구조와 입력값 분리 |
| 입력값 검증 | 허용목록, 길이, 형식, 범위 검증 |
| 차단목록 한계 | 우회 가능성 존재 |
| DB 권한 최소화 | 피해 범위 제한 |
| 오류 메시지 제한 | DB 구조 정보 노출 방지 |
| WAF | SQL Injection 패턴 탐지·차단 |
| 저장 프로시저 | 동적 SQL 사용 시 취약 가능 |
| ORM | 원시 SQL 문자열 결합 시 취약 가능 |
| HTTPS와 관계 | HTTPS만으로 SQL Injection 방어 불가 |
| 사고 대응 | 로그 분석, 차단, 영향 확인, 취약점 수정 |
필기형 문제풀이
문제 1
SQL Injection에 대한 설명으로 가장 적절한 것은?
A. 네트워크 패킷을 몰래 도청하는 공격
B. 사용자 입력값에 SQL 구문을 삽입하여 DB를 비정상적으로 조작하는 공격
C. 로그인된 사용자의 인증 상태를 악용해 원치 않는 요청을 보내게 하는 공격
D. 사용자의 브라우저에서 악성 스크립트를 실행하는 공격
SQL Injection은 입력값에 SQL 구문을 삽입하여 DB 조회, 수정, 삭제, 인증 우회 등을 시도하는 공격입니다.
문제 2
SQL Injection의 주요 발생 원인으로 가장 적절한 것은?
A. 사용자 입력값을 검증하지 않고 SQL 문자열에 직접 결합한다
B. HTTPS를 사용한다
C. 쿠키에 Secure 속성을 적용한다
D. 사용자 입력값을 파라미터로 바인딩해 SQL 구조와 분리한다
사용자 입력값을 SQL 문자열에 직접 연결하면 입력값이 SQL 구문으로 해석될 수 있습니다.
문제 3
SQL Injection으로 발생할 수 있는 피해가 아닌 것은?
A. 인증 우회
B. 개인정보 유출
C. DB 데이터 변조
D. IP 주소를 MAC 주소로 변환
IP 주소를 MAC 주소로 변환하는 것은 ARP의 역할입니다.
문제 4
Prepared Statement가 SQL Injection 방어에 효과적인 이유는?
A. DB 계정의 모든 권한을 자동으로 제거하기 때문이다
B. SQL 오류 메시지를 사용자에게 더 자세히 보여주기 때문이다
C. SQL 구조와 사용자 입력값을 분리하기 때문이다
D. HTTPS 인증서를 자동으로 갱신하기 때문이다
Prepared Statement는 입력값을 파라미터로 바인딩하여 SQL 명령어가 아닌 데이터로 처리합니다.
문제 5
SQL Injection 대응 방안으로 적절하지 않은 것은?
A. Prepared Statement 사용
B. 입력값 검증
C. DB 권한 최소화
D. 사용자 입력값을 SQL 문자열에 직접 연결
사용자 입력값을 SQL 문자열에 직접 연결하는 것은 SQL Injection의 주요 원인입니다.
문제 6
오류 기반 SQL Injection에서 위험한 것은?
A. 상세 DB 오류 메시지가 사용자에게 노출되는 것
B. 서버가 일반 오류 메시지만 보여주는 것
C. 입력값을 숫자로 제한하는 것
D. DB 권한을 최소화하는 것
상세 DB 오류 메시지는 DB 구조, 쿼리, 테이블명, 컬럼명 등을 추론하는 데 악용될 수 있습니다.
문제 7
Blind SQL Injection의 설명으로 적절한 것은?
A. 상세 DB 오류 메시지만 이용해 테이블명과 컬럼명을 직접 확인한다
B. 모든 HTTP 요청을 WAF가 자동으로 정상 요청으로 변환한다
C. 결과가 직접 보이지 않아도 참·거짓 반응이나 응답 시간 차이로 정보를 추론한다
D. MAC 주소 위조를 통해 같은 네트워크의 ARP 캐시를 조작한다
Blind SQL Injection은 화면에 결과가 출력되지 않아도 서버 반응 차이를 이용해 정보를 추론합니다.
문제 8
DB 권한 최소화의 보안 효과로 적절한 것은?
A. SQL Injection이 발생해도 피해 범위를 줄일 수 있다
B. 웹 애플리케이션 DB 계정에 불필요한 DROP 권한까지 부여한다
C. DB 오류 메시지를 더 자세히 보여준다
D. 공격자가 모든 테이블을 삭제할 수 있게 한다
DB 계정에 필요한 최소 권한만 부여하면 공격 성공 시 수행 가능한 행위를 제한할 수 있습니다.
문제 9
SQL Injection 방어에서 허용목록 방식의 설명으로 적절한 것은?
A. 허용된 형식과 값만 통과시킨다
B. 모든 입력을 무조건 허용한다
C. 위험해 보이는 단어만 일부 차단하고 나머지는 모두 허용한다
D. DB 계정에 모든 권한을 부여한다
허용목록 방식은 허용된 문자, 형식, 길이, 범위만 통과시키는 방식입니다.
문제 10
HTTPS와 SQL Injection의 관계로 올바른 것은?
A. HTTPS를 사용하면 SQL Injection이 자동으로 제거된다
B. HTTPS는 통신 구간을 보호하지만 SQL Injection 취약점 자체를 제거하지는 못한다
C. HTTPS는 SQL문을 자동 검증한다
D. HTTPS는 DB 권한을 자동으로 최소화한다
HTTPS는 통신 암호화 기술이고, SQL Injection은 서버 애플리케이션의 입력값 처리 문제입니다.
문제 11
WAF에 대한 설명으로 적절한 것은?
A. SQL Injection 같은 웹 공격 패턴을 탐지·차단할 수 있다
B. DB 계정을 자동으로 삭제한다
C. 모든 개발 코드를 자동 수정한다
D. 암호화 키를 생성하지 못하게 한다
WAF는 HTTP 요청의 URL, 파라미터, 쿠키, 헤더, 본문 등을 분석해 웹 공격 패턴을 탐지·차단할 수 있습니다.
문제 12
저장 프로시저 사용 시 SQL Injection이 발생할 수 있는 경우는?
A. 내부에서 사용자 입력값을 문자열로 결합한 동적 SQL을 실행하는 경우
B. 입력값을 파라미터로 안전하게 바인딩하는 경우
C. DB 계정 권한을 최소화하는 경우
D. 상세 오류 메시지를 숨기는 경우
저장 프로시저라도 내부에서 동적 SQL을 문자열 결합으로 만들면 SQL Injection이 발생할 수 있습니다.
실기형 답안 훈련
실기 예제 1
문제: SQL Injection의 개념과 발생 원인을 설명하시오.
좋은 답안
SQL Injection은 웹 애플리케이션의 입력값에 악의적인 SQL 구문을 삽입하여 데이터베이스를 비정상적으로 조회, 수정, 삭제하거나 인증을 우회하는 공격이다. 주로 사용자 입력값을 검증하지 않고 SQL 문자열에 직접 결합할 때 발생한다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| 사용자 입력값 | 필수 |
| SQL 구문 삽입 | 필수 |
| DB 조회·수정·삭제 | 중요 |
| 인증 우회 | 좋음 |
| SQL 문자열 직접 결합 | 필수 |
실기 예제 2
문제: SQL Injection의 대응 방안을 설명하시오.
좋은 답안
SQL Injection 대응을 위해 SQL 구조와 입력값을 분리하는 Prepared Statement를 사용하고, 입력값의 형식·길이·범위를 서버 측에서 검증해야 한다. 또한 DB 계정에는 필요한 최소 권한만 부여하고, 상세 오류 메시지 노출을 제한하며, WAF와 로그 모니터링을 통해 공격 시도를 탐지해야 한다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| Prepared Statement | 필수 |
| 입력값 검증 | 필수 |
| DB 권한 최소화 | 중요 |
| 오류 메시지 제한 | 중요 |
| WAF·로그 모니터링 | 좋음 |
실기 예제 3
문제: Prepared Statement가 SQL Injection 방어에 효과적인 이유를 설명하시오.
좋은 답안
Prepared Statement는 SQL문의 구조를 미리 정의하고 사용자 입력값을 파라미터로 바인딩하여 SQL 구문과 데이터를 분리한다. 따라서 입력값에 SQL 문법이 포함되더라도 명령어로 실행되지 않고 데이터로 처리되어 SQL Injection을 방지할 수 있다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| SQL 구조 미리 정의 | 좋음 |
| 파라미터 바인딩 | 필수 |
| SQL 구문과 데이터 분리 | 필수 |
| 명령어로 실행되지 않음 | 중요 |
| 데이터로 처리 | 중요 |
실기 예제 4
문제: SQL Injection 대응에서 DB 권한 최소화가 필요한 이유를 설명하시오.
좋은 답안
DB 권한 최소화는 웹 애플리케이션이 사용하는 DB 계정에 업무 수행에 필요한 최소한의 권한만 부여하는 것이다. SQL Injection이 발생하더라도 공격자가 수행할 수 있는 조회, 수정, 삭제, 권한 변경 범위를 제한하여 피해를 줄일 수 있다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| 필요한 최소 권한 | 필수 |
| 웹 애플리케이션 DB 계정 | 중요 |
| 공격 성공 시 피해 제한 | 필수 |
| 조회·수정·삭제 범위 제한 | 좋음 |
실기 예제 5
문제: 오류 메시지 노출이 SQL Injection 공격에 위험한 이유를 설명하시오.
좋은 답안
상세 SQL 오류 메시지는 DB 종류, 테이블명, 컬럼명, 쿼리 구조, 서버 경로 등 내부 정보를 노출할 수 있다. 공격자는 이를 이용해 SQL Injection 공격을 정교화할 수 있으므로 사용자에게는 일반화된 오류 메시지만 제공하고 상세 오류는 서버 로그에 기록해야 한다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| DB 종류 노출 | 좋음 |
| 테이블명·컬럼명 | 중요 |
| 쿼리 구조 노출 | 중요 |
| 공격 정교화 | 중요 |
| 일반 오류 메시지 제공 | 필수 |
| 서버 로그 기록 | 좋음 |
실기 예제 6
문제: SQL Injection 공격이 의심될 때 대응 절차를 설명하시오.
좋은 답안
SQL Injection 공격이 의심되면 웹 로그, WAF 로그, DB 로그를 분석하여 공격 IP, 요청 URL, 파라미터, 발생 시간, DB 접근 내역을 확인해야 한다. 이후 공격 요청을 차단하고 데이터 유출·변조 여부를 조사하며, Prepared Statement와 입력값 검증을 적용해 취약점을 수정하고 로그 모니터링과 정기 취약점 점검으로 재발을 방지해야 한다.채점 포인트
| 요소 | 포함 여부 |
|---|---|
| 웹/WAF/DB 로그 분석 | 필수 |
| 공격 IP·URL·파라미터 확인 | 중요 |
| 차단 | 필요 |
| 유출·변조 여부 확인 | 중요 |
| 취약점 수정 | 필수 |
| 재발 방지 | 필수 |
핵심 요약
| 개념 | 한 줄 요약 |
|---|---|
| SQL Injection | 입력값에 SQL 구문을 삽입해 DB를 공격 |
| 발생 원인 | 입력값을 SQL 문자열에 직접 결합 |
| 주요 피해 | 인증 우회, 정보 유출, 데이터 변조·삭제 |
| 오류 기반 공격 | DB 오류 메시지로 내부 정보 추론 |
| Blind SQL Injection | 참·거짓 또는 응답 시간 차이로 정보 추론 |
| Prepared Statement | SQL 구조와 입력값 분리 |
| 파라미터 바인딩 | 입력값을 데이터로 처리 |
| 입력값 검증 | 허용된 형식·길이·범위만 처리 |
| 허용목록 | 허용된 값만 통과시키는 방식 |
| 차단목록 | 위험해 보이는 값만 막는 방식, 우회 가능성 있음 |
| DB 권한 최소화 | 공격 성공 시 피해 범위 제한 |
| 오류 메시지 제한 | DB 구조와 쿼리 정보 노출 방지 |
| WAF | SQL Injection 패턴 탐지·차단 |
| 저장 프로시저 | 동적 SQL 사용 시 취약 가능 |
| ORM | 원시 SQL 문자열 결합 시 취약 가능 |
| HTTPS | 통신 보호, SQL Injection 자체 방어는 아님 |
| 사고 대응 | 로그 분석, 차단, 영향 확인, 취약점 수정 |
필수 암기 문장
아래 문장들은 필기와 실기 모두 중요합니다.
SQL Injection은 사용자 입력값에 악의적인 SQL 구문을 삽입하여 DB를 비정상적으로 조회, 수정, 삭제하거나 인증을 우회하는 공격이다.
SQL Injection은 주로 사용자 입력값을 검증하지 않고 SQL 문자열에 직접 결합할 때 발생한다.
Prepared Statement는 SQL 구조와 사용자 입력값을 분리하고 입력값을 파라미터로 바인딩하여 SQL Injection을 방지한다.
입력값 검증은 차단목록 방식보다 허용목록 방식을 적용하는 것이 바람직하다.
DB 권한 최소화는 SQL Injection이 발생하더라도 공격자가 수행할 수 있는 작업 범위를 제한하여 피해를 줄인다.
상세 SQL 오류 메시지는 DB 종류, 테이블명, 컬럼명, 쿼리 구조를 노출할 수 있으므로 사용자에게 표시하지 않아야 한다.
WAF는 SQL Injection 공격 패턴 탐지에 도움이 되지만, Prepared Statement와 입력값 검증 같은 시큐어 코딩을 대체할 수는 없다.
HTTPS는 통신 구간을 암호화하지만 SQL Injection 취약점 자체를 제거하지는 못한다.
저장 프로시저나 ORM을 사용하더라도 사용자 입력값을 원시 SQL 문자열에 직접 결합하면 SQL Injection이 발생할 수 있다.
SQL Injection 의심 시 웹 로그, WAF 로그, DB 로그를 분석하고 공격 차단, 영향 범위 확인, 취약점 수정, 재발 방지 조치를 수행해야 한다.연습 과제
다음 문제를 풀고 정답 및 해설과 대조한다.
A. 단답형
1. SQL Injection이란 무엇인가?
2. SQL Injection의 주요 발생 원인은 무엇인가?
3. SQL Injection으로 발생할 수 있는 피해 4가지를 쓰시오.
4. 인증 우회형 SQL Injection이란 무엇인가?
5. 오류 기반 SQL Injection이 위험한 이유는 무엇인가?
6. Blind SQL Injection이란 무엇인가?
7. SQL Injection이 발생하기 쉬운 입력 위치 5가지를 쓰시오.
8. SQL Injection 의심 로그의 특징 4가지를 쓰시오.
9. Prepared Statement란 무엇인가?
10. Prepared Statement가 SQL Injection 방어에 효과적인 이유는 무엇인가?
11. 입력값 검증이란 무엇인가?
12. 허용목록 방식과 차단목록 방식의 차이를 쓰시오.
13. DB 권한 최소화가 필요한 이유는 무엇인가?
14. 오류 메시지 노출 제한이 필요한 이유는 무엇인가?
15. WAF가 SQL Injection 대응에 어떻게 활용되는가?
16. WAF가 근본 대책이 아닌 이유는 무엇인가?
17. 저장 프로시저를 사용해도 SQL Injection이 발생할 수 있는 경우는?
18. ORM을 사용해도 SQL Injection이 발생할 수 있는 경우는?
19. HTTPS만으로 SQL Injection을 방어할 수 없는 이유는 무엇인가?
20. SQL Injection 사고 대응 절차를 간단히 쓰시오.B. 상황 매칭 문제
아래 상황에 적합한 개념이나 대응책을 쓴다.
21. 사용자 입력값을 SQL 문자열에 직접 붙여 쿼리를 생성하고 있다.
22. 로그인 조건절이 조작되어 비밀번호 없이 로그인된 것으로 보인다.
23. 화면에 DB 테이블명과 컬럼명이 포함된 오류 메시지가 표시된다.
24. 검색 파라미터에 SQL 키워드와 특수문자가 반복적으로 포함되어 있다.
25. 쿼리 결과는 보이지 않지만 참·거짓 반응 차이로 정보가 추론된다.
26. SQL 구조와 입력값을 분리해 입력값을 데이터로만 처리하고 싶다.
27. 웹 애플리케이션 DB 계정이 모든 테이블 삭제 권한까지 가지고 있다.
28. 공격 패턴을 HTTP 요청 단계에서 탐지·차단하고 싶다.
29. HTTPS를 사용 중이지만 검색 기능에서 SQL Injection이 발생했다.
30. 저장 프로시저 내부에서 입력값을 문자열로 결합해 동적 SQL을 실행한다.C. 실기형 답안 작성
다음 5문제는 2~3문장으로 답안을 작성한다.
31. SQL Injection의 개념과 발생 원인을 설명하시오.
32. SQL Injection의 대응 방안을 설명하시오.
33. Prepared Statement가 SQL Injection 방어에 효과적인 이유를 설명하시오.
34. SQL Injection 대응에서 DB 권한 최소화가 필요한 이유를 설명하시오.
35. SQL Injection 공격이 의심될 때 대응 절차를 설명하시오.보완 학습 및 연습 과제 정답
SQL Injection 로그 분석 답안 틀
SQL Injection 로그형 문제는 요청 위치 → 공격 근거 → 영향 범위 → 즉시 조치 → 재발 방지 순서로 답안을 구성한다.
| 분석 항목 | 확인 내용 | 답안에 쓸 표현 |
|---|---|---|
| 요청 위치 | URI, 파라미터, 메서드, 계정, IP | 검색 파라미터 q에서 공격 문자열이 반복 입력됨 |
| 공격 근거 | ', --, UNION SELECT, OR 1=1, sleep() 등 | SQL 조건절 조작 또는 시간 기반 Blind SQL Injection 정황 |
| 영향 범위 | 조회·수정·삭제 여부, 오류 노출, DB 로그 | 인증 우회와 개인정보 조회 가능성을 우선 확인 |
| 즉시 조치 | WAF 차단, 계정 잠금, 취약 기능 임시 차단 | 공격 IP와 패턴을 차단하고 취약 URL을 격리 |
| 재발 방지 | Prepared Statement, 허용목록 검증, DB 최소권한 | 동적 쿼리를 파라미터 바인딩 방식으로 수정 |
저장 프로시저와 ORM도 안전을 자동 보장하지 않는다. 저장 프로시저 내부에서 문자열 결합으로 동적 SQL을 만들거나 ORM에서 raw query에 입력값을 직접 붙이면 동일하게 취약하다.
정답 및 해설
A. 단답형 예시 정답: 1 입력값에 SQL 구문을 삽입해 DB를 비정상 조작하는 공격. 2 입력값을 SQL 문자열에 직접 결합. 3 인증 우회, 정보 유출, 데이터 변조, 데이터 삭제. 4 조건절 조작으로 비밀번호 검증을 우회. 5 DB 구조와 쿼리 정보가 노출됨. 6 응답 차이 또는 시간 차이로 정보를 추론. 7 로그인, 검색, 게시글, 정렬값, 쿠키, 헤더. 8 SQL 키워드, 특수문자, 오류 증가, 반복 요청. 9 SQL 구조와 값을 분리하는 방식. 10 입력값이 명령이 아니라 데이터로 처리됨. 11 형식·길이·범위 검증. 12 허용목록은 허용값만 통과, 차단목록은 위험값만 차단. 13 침해 범위를 제한. 14 내부 정보 노출 방지. 15 공격 패턴 탐지·차단. 16 코드 취약점을 제거하지 못함. 17 내부 동적 SQL 결합. 18 raw SQL 문자열 결합. 19 통신 암호화와 서버 쿼리 취약점은 별개. 20 로그 분석, 차단, 영향 확인, 수정, 재발 방지.
B. 상황 매칭 정답: 21 취약한 동적 쿼리, 22 인증 우회형 SQLi, 23 오류 기반 SQLi, 24 SQLi 의심 로그, 25 Blind SQLi, 26 Prepared Statement, 27 DB 권한 최소화, 28 WAF, 29 HTTPS로 방어 불가, 30 저장 프로시저 내 동적 SQL 취약점.
C. 실기형 채점 기준: 핵심 키워드는 SQL 구문 삽입, 문자열 결합, Prepared Statement, 입력값 검증, 최소권한, 오류 제한, 로그 분석이다. 부분점은 개념 30%, 원인 20%, 대응 35%, 사고 대응 15%로 부여한다. Prepared Statement 없이 필터링만 쓰거나, HTTPS·WAF만으로 근본 해결된다고 쓰면 감점한다.