flawopen.com/sql-injection/Csharp

● CWE-89 · 심각
보안 연구 · FlawOpen

취약점 분석: SQL Injection in C#

Learn how to fix SQL Injection (CWE-89) in C# / .NET. Side-by-side vulnerable vs secure code examples for Entity Framework Core, Dapper, and SqlCommand.Parameters.

💡 알기 쉬운 설명 (ELI5)

도서관 회원 카드 신청서의 이름 칸에 '홍길동; 금고에 있는 모든 책을 내놓으시오'라고 적는 상황을 비유해 보겠습니다. 사서가 이 문구를 단순한 이름이 아닌 명령어로 오인하면, 비밀 금고로 들어가 모든 기밀 문서를 넘겨주게 됩니다.

핵심 개념 및 용어

Web Application Security
보안 개념 (Web Application Security): Core architecture component affected by CWE-89.
CWE-89
보안 개념 (CWE-89): Standard Common Weakness Enumeration classification for sql-injection-csharp.
Defense-in-Depth
보안 개념 (Defense-in-Depth): Multi-layered engineering verification and runtime boundary isolation.

단계별 공격 실행 흐름

Step 1

신뢰할 수 없는 SQL 쿼리 입력

공격자가 HTTP 매개변수에 SQL 제어 문자(예: ' OR '1'='1)가 포함된 입력을 전달합니다.

Step 2

동적 SQL 문자열 직접 결합

백엔드가 매개변수화된 준비된 쿼리(Prepared Statement)를 사용하지 않고 문자열을 결합합니다.

Step 3

추상 구문 트리(AST) 구조 변조

데이터베이스 파서가 주입된 문자를 리터럴 데이터가 아닌 SQL 키워드로 해석하여 쿼리 논리를 변경합니다.

Step 4

무단 데이터 탈취 및 인증 우회

변조된 쿼리가 데이터베이스 권한으로 실행되어 로그인 인증을 우회하고 전체 테이블 데이터를 유출합니다.

소스 코드 비교: 취약한 구현 vs 보안 패치

✕ 취약한 구현
// userId comes straight from the request
var query =
  $"SELECT * FROM Users WHERE Id = {userId}";
var cmd = new SqlCommand(query, connection);
var reader = cmd.ExecuteReader();
✓ 보안 강화 패치
// value bound as a parameter
var cmd = new SqlCommand(
  "SELECT * FROM Users WHERE Id = @id",
  connection);
cmd.Parameters.AddWithValue("@id", userId);
var reader = cmd.ExecuteReader();

엔지니어링 및 시스템 보안 강화 체크리스트

References