OWASP Top 10 & SQL Injection 심화 방어
OWASP 2021 Top 10 변경점 + SQL Injection 5유형 + Prepared Statement 방어.
실기 고빈도 서술형. 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 10 | 2017 대비 |
|---|---|---|
| A01 | Broken Access Control (접근 통제 실패) | ↑ 1위 |
| A02 | Cryptographic Failures (암호화 실패) | 명칭 변경 |
| A03 | Injection (SQL/NoSQL/LDAP) | ↓ 3위 |
| A04 | Insecure Design (안전하지 않은 설계) | 🆕 신규 |
| A05 | Security Misconfiguration | - |
| A06 | Vulnerable Components | - |
| A07 | Identification & Auth Failures | - |
| A08 | SW & Data Integrity Failures | 🆕 신규 |
| A09 | Security Logging & Monitoring Failures | - |
| A10 | SSRF (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)` 응답 지연으로 추출
// ❌ 취약: 문자열 연결 (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 사용이 표준.
OWASP Top 10 2021에서 1위를 차지한 보안 취약점은?
OWASP Top 10 2021에서 신규로 추가된 3종 취약점을 모두 쓰시오.
SQL Injection의 가장 근본적인 방어 기법은 ( )을(를) 사용해 쿼리 구조와 데이터를 분리하는 것이다.
다음 중 SQL Injection에 취약한 코드는? (A) `PreparedStatement ps = conn.prepareStatement("... WHERE id = ?"); ps.setString(1, uid);` (B) `stmt.executeQuery("... WHERE id = '" + uid + "'");`
Classic SQL Injection은 작은따옴표(`'`) 문자를 백슬래시로 이스케이프(`\'`)만 해도 완벽히 방어된다.