icon

안동민 개발노트

4장 : 어플리케이션보안

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 StatementSQL 구조와 입력값 분리
입력값 검증허용된 형식의 값만 처리
특수문자 처리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 StatementSQL 구조와 입력값 분리
입력값 검증허용된 형식, 길이, 범위만 처리
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 대응 우선순위

실기에서 대응책을 쓸 때 우선순위를 잡으면 답안이 좋아집니다.

1순위
Prepared Statement 사용
2순위
입력값 검증
3순위
DB 권한 최소화
4순위
오류 메시지 노출 제한
5순위
WAF, 로그 모니터링, 취약점 점검

답안 구조는 이렇게 쓰면 됩니다.

정의 → 원인 → 피해 → 대응책
예시
SQL Injection은 사용자 입력값에 악의적인 SQL 구문을 삽입하여 DB를 비정상적으로 조작하는 공격이다.
주요 원인은 입력값을 검증하지 않고 SQL 문자열에 직접 결합하는 것이다.
대응 방안으로는 Prepared Statement 사용, 입력값 검증, DB 권한 최소화, 오류 메시지 노출 제한, WAF 적용, 로그 모니터링 등이 있다.

SQL Injection과 HTTPS의 관계

중요한 시험 포인트입니다.

HTTPS를 사용해도 SQL Injection은 발생할 수 있다.

왜냐하면 HTTPS는 통신 구간을 암호화하는 기술이고, SQL Injection은 서버 내부의 입력값 처리 문제이기 때문입니다.

구분HTTPSSQL Injection 대응
보호 대상통신 구간애플리케이션 입력 처리
주요 효과도청·변조 방지DB 공격 방지
핵심 기술TLSPrepared 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 InjectionXSSCSRF
공격 대상DB사용자 브라우저사용자의 인증 상태
핵심 원리SQL 구문 삽입악성 스크립트 실행원치 않는 요청 전송
주요 피해정보 유출, 인증 우회, DB 변조쿠키 탈취, 피싱, 화면 변조비밀번호 변경, 송금, 게시글 작성
주요 대응Prepared Statement, 입력값 검증출력값 인코딩, CSPCSRF 토큰, 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 StatementSQL 구조와 입력값 분리
입력값 검증허용목록, 길이, 형식, 범위 검증
차단목록 한계우회 가능성 존재
DB 권한 최소화피해 범위 제한
오류 메시지 제한DB 구조 정보 노출 방지
WAFSQL Injection 패턴 탐지·차단
저장 프로시저동적 SQL 사용 시 취약 가능
ORM원시 SQL 문자열 결합 시 취약 가능
HTTPS와 관계HTTPS만으로 SQL Injection 방어 불가
사고 대응로그 분석, 차단, 영향 확인, 취약점 수정

필기형 문제풀이

문제 1

SQL Injection에 대한 설명으로 가장 적절한 것은?

A. 네트워크 패킷을 몰래 도청하는 공격
B. 사용자 입력값에 SQL 구문을 삽입하여 DB를 비정상적으로 조작하는 공격
C. 로그인된 사용자의 인증 상태를 악용해 원치 않는 요청을 보내게 하는 공격
D. 사용자의 브라우저에서 악성 스크립트를 실행하는 공격

정답: B

SQL Injection은 입력값에 SQL 구문을 삽입하여 DB 조회, 수정, 삭제, 인증 우회 등을 시도하는 공격입니다.


문제 2

SQL Injection의 주요 발생 원인으로 가장 적절한 것은?

A. 사용자 입력값을 검증하지 않고 SQL 문자열에 직접 결합한다
B. HTTPS를 사용한다
C. 쿠키에 Secure 속성을 적용한다
D. 사용자 입력값을 파라미터로 바인딩해 SQL 구조와 분리한다

정답: A

사용자 입력값을 SQL 문자열에 직접 연결하면 입력값이 SQL 구문으로 해석될 수 있습니다.


문제 3

SQL Injection으로 발생할 수 있는 피해가 아닌 것은?

A. 인증 우회
B. 개인정보 유출
C. DB 데이터 변조
D. IP 주소를 MAC 주소로 변환

정답: D

IP 주소를 MAC 주소로 변환하는 것은 ARP의 역할입니다.


문제 4

Prepared Statement가 SQL Injection 방어에 효과적인 이유는?

A. DB 계정의 모든 권한을 자동으로 제거하기 때문이다
B. SQL 오류 메시지를 사용자에게 더 자세히 보여주기 때문이다
C. SQL 구조와 사용자 입력값을 분리하기 때문이다
D. HTTPS 인증서를 자동으로 갱신하기 때문이다

정답: C

Prepared Statement는 입력값을 파라미터로 바인딩하여 SQL 명령어가 아닌 데이터로 처리합니다.


문제 5

SQL Injection 대응 방안으로 적절하지 않은 것은?

A. Prepared Statement 사용
B. 입력값 검증
C. DB 권한 최소화
D. 사용자 입력값을 SQL 문자열에 직접 연결

정답: D

사용자 입력값을 SQL 문자열에 직접 연결하는 것은 SQL Injection의 주요 원인입니다.


문제 6

오류 기반 SQL Injection에서 위험한 것은?

A. 상세 DB 오류 메시지가 사용자에게 노출되는 것
B. 서버가 일반 오류 메시지만 보여주는 것
C. 입력값을 숫자로 제한하는 것
D. DB 권한을 최소화하는 것

정답: A

상세 DB 오류 메시지는 DB 구조, 쿼리, 테이블명, 컬럼명 등을 추론하는 데 악용될 수 있습니다.


문제 7

Blind SQL Injection의 설명으로 적절한 것은?

A. 상세 DB 오류 메시지만 이용해 테이블명과 컬럼명을 직접 확인한다
B. 모든 HTTP 요청을 WAF가 자동으로 정상 요청으로 변환한다
C. 결과가 직접 보이지 않아도 참·거짓 반응이나 응답 시간 차이로 정보를 추론한다
D. MAC 주소 위조를 통해 같은 네트워크의 ARP 캐시를 조작한다

정답: C

Blind SQL Injection은 화면에 결과가 출력되지 않아도 서버 반응 차이를 이용해 정보를 추론합니다.


문제 8

DB 권한 최소화의 보안 효과로 적절한 것은?

A. SQL Injection이 발생해도 피해 범위를 줄일 수 있다
B. 웹 애플리케이션 DB 계정에 불필요한 DROP 권한까지 부여한다
C. DB 오류 메시지를 더 자세히 보여준다
D. 공격자가 모든 테이블을 삭제할 수 있게 한다

정답: A

DB 계정에 필요한 최소 권한만 부여하면 공격 성공 시 수행 가능한 행위를 제한할 수 있습니다.


문제 9

SQL Injection 방어에서 허용목록 방식의 설명으로 적절한 것은?

A. 허용된 형식과 값만 통과시킨다
B. 모든 입력을 무조건 허용한다
C. 위험해 보이는 단어만 일부 차단하고 나머지는 모두 허용한다
D. DB 계정에 모든 권한을 부여한다

정답: A

허용목록 방식은 허용된 문자, 형식, 길이, 범위만 통과시키는 방식입니다.


문제 10

HTTPS와 SQL Injection의 관계로 올바른 것은?

A. HTTPS를 사용하면 SQL Injection이 자동으로 제거된다
B. HTTPS는 통신 구간을 보호하지만 SQL Injection 취약점 자체를 제거하지는 못한다
C. HTTPS는 SQL문을 자동 검증한다
D. HTTPS는 DB 권한을 자동으로 최소화한다

정답: B

HTTPS는 통신 암호화 기술이고, SQL Injection은 서버 애플리케이션의 입력값 처리 문제입니다.


문제 11

WAF에 대한 설명으로 적절한 것은?

A. SQL Injection 같은 웹 공격 패턴을 탐지·차단할 수 있다
B. DB 계정을 자동으로 삭제한다
C. 모든 개발 코드를 자동 수정한다
D. 암호화 키를 생성하지 못하게 한다

정답: A

WAF는 HTTP 요청의 URL, 파라미터, 쿠키, 헤더, 본문 등을 분석해 웹 공격 패턴을 탐지·차단할 수 있습니다.


문제 12

저장 프로시저 사용 시 SQL Injection이 발생할 수 있는 경우는?

A. 내부에서 사용자 입력값을 문자열로 결합한 동적 SQL을 실행하는 경우
B. 입력값을 파라미터로 안전하게 바인딩하는 경우
C. DB 계정 권한을 최소화하는 경우
D. 상세 오류 메시지를 숨기는 경우

정답: A

저장 프로시저라도 내부에서 동적 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 StatementSQL 구조와 입력값 분리
파라미터 바인딩입력값을 데이터로 처리
입력값 검증허용된 형식·길이·범위만 처리
허용목록허용된 값만 통과시키는 방식
차단목록위험해 보이는 값만 막는 방식, 우회 가능성 있음
DB 권한 최소화공격 성공 시 피해 범위 제한
오류 메시지 제한DB 구조와 쿼리 정보 노출 방지
WAFSQL 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만으로 근본 해결된다고 쓰면 감점한다.