topic난이도 · 약 22

OWASP Top 10 & SQL Injection 심화 방어

OWASP 2021 Top 10 변경점 + SQL Injection 5유형 + Prepared Statement 방어.

#OWASP#SQLInjection#PreparedStatement#실기핵심
왜 배우는가

실기 고빈도 서술형. 2024년 1·3회차 모두 "SQL Injection을 방어하는 구문을 쓰시오" 유형으로 Prepared Statement 코드 작성이 출제. OWASP Top 10은 매회 필기 1~2문항, 특히 2021 신규 3종(Insecure Design·SSRF·SW Supply Chain)이 핵심.

OWASP(Open Web Application Security Project) 는 3~4년 주기로 Top 10을 발표한다. 최신은 2021 버전(정보처리기사 시험 기준). 2025 버전이 2025 하반기 발표 예정이지만 시험은 2021 기준이 당분간 유지.

순위2021 Top 102017 대비
A01Broken Access Control (접근 통제 실패)↑ 1위
A02Cryptographic Failures (암호화 실패)명칭 변경
A03Injection (SQL/NoSQL/LDAP)↓ 3위
A04Insecure Design (안전하지 않은 설계)🆕 신규
A05Security Misconfiguration-
A06Vulnerable Components-
A07Identification & Auth Failures-
A08SW & Data Integrity Failures🆕 신규
A09Security Logging & Monitoring Failures-
A10SSRF (Server-Side Request Forgery)🆕 신규

2017 → 2021 주요 변화 — A03 Injection은 1위 → 3위로 하락(방어 기법 보편화). 신규 3종: A04 Insecure Design(설계 단계 보안), A08 SW Supply Chain(SolarWinds 사건 영향), A10 SSRF(서버 측 요청 위조).

SQL Injection 5유형 - Classic: `' OR '1'='1'` — 인증 우회 - Union-based: `UNION SELECT` — 다른 테이블 데이터 노출 - Error-based: 에러 메시지로 정보 추출 - Blind (Boolean): 참/거짓 응답으로 1비트씩 추출 - Time-based: `SLEEP(5)` 응답 지연으로 추출

java
// ❌ 취약: 문자열 연결 (SQL Injection 가능)
String sql = "SELECT * FROM users WHERE id = '" + userId + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// userId = "admin' OR '1'='1" 입력 시 전체 조회됨

// ✅ 안전: Prepared Statement (바인딩 변수)
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, userId);
ResultSet rs = ps.executeQuery();
// '?'에 바인딩된 값은 데이터로만 취급 → Injection 불가능

핵심은 문자열 조합 금지, 파라미터 바인딩 사용. DB가 쿼리와 데이터를 분리 해석하므로 악성 입력이 쿼리 구조를 바꿀 수 없다.

SQL Injection 방어 5원칙 1. Prepared Statement (바인딩 변수) — 1순위 2. ORM 프레임워크 사용 (JPA, Hibernate, Django ORM) 3. Stored Procedure — 쿼리 사전 컴파일 4. 입력 검증·Whitelist — 허용 문자만 통과 5. 최소 권한 원칙 — DB 계정에 필요한 권한만

ESCAPING만으로는 부족 — `'` → `\'` 치환은 기본적인 Classic Injection은 막지만 유니코드·다중 바이트 문자·인코딩 차이를 악용한 우회가 존재. 반드시 Prepared Statement 또는 ORM 사용이 표준.

실기 드릴 5문항
edit실기 드릴 · 단답형

OWASP Top 10 2021에서 1위를 차지한 보안 취약점은?

edit실기 드릴 · 단답형

OWASP Top 10 2021에서 신규로 추가된 3종 취약점을 모두 쓰시오.

space_bar실기 드릴 · 빈칸 채우기

SQL Injection의 가장 근본적인 방어 기법은 ( )을(를) 사용해 쿼리 구조와 데이터를 분리하는 것이다.

code실기 드릴 · 코드 추적

다음 중 SQL Injection에 취약한 코드는? (A) `PreparedStatement ps = conn.prepareStatement("... WHERE id = ?"); ps.setString(1, uid);` (B) `stmt.executeQuery("... WHERE id = '" + uid + "'");`

check_circle실기 드릴 · OX

Classic SQL Injection은 작은따옴표(`'`) 문자를 백슬래시로 이스케이프(`\'`)만 해도 완벽히 방어된다.