설명

SQL injection 이란?

sewoo-jjang 2025. 12. 31. 18:47

1. SQL이란 무엇인가?

본격적인 공격 기법을 알기 전에 SQL이 무엇인지 이해해야 합니다.

정의: SQL(Structured Query Language)은 데이터베이스(DB)와 대화하기 위한 언어입니다.

역할: 웹사이트에서 사용자가 회원가입을 하거나 글을 쓸 때, 웹 서버는 이 데이터를 저장하거나 조회하기 위해 DB와 소통하는데, 이때 사용하는 언어가 바로 SQL입니다.

2. SQL Injection(SQLi)이란?

SQL Injection은 웹 사이트의 보안 취약점을 이용해 악의적인 SQL 명령을 실행시키는 공격 방법입니다.

핵심 원인: 웹 애플리케이션이 "사용자의 입력값"을 제대로 검증하지 않고 DB 쿼리에 그대로 포함시킬 때 발생합니다.

공격 효과: 공격자는 이를 통해 인증을 우회하거나, DB에 저장된 민감한 데이터를 열람, 수정, 삭제할 수 있습니다.

▶ 쉽게 말해 웹 서버에게 "내 아이디는 admin이야"라고 말하는 대신, "내 아이디는 admin이고, 뒤에 나오는 비밀번호 검사 구문은 무시해(--)"라고 명령을 조작하여 전달하는 것입니다.

3. 공격 기법 심화: UNION Based Injection

강의 자료에서는 공격자가 DB의 데이터를 알아내기 위해 UNION 연산자를 사용하는 방법을 강조하고 있습니다. UNION은 두 개의 쿼리 결과를 합쳐서 보여주는 SQL 연산자입니다.

3-1. UNION 공격의 전제 조건

UNION을 사용하려면 두 가지 조건을 맞춰야 합니다.

칼럼(열)의 개수가 같아야 합니다.

데이터 타입이 호환되어야 합니다.

3-2. 공격 시나리오 (Step-by-Step)

UNION SELECT NULL 기법을 통해 공격자는 단계적으로 정보를 수집합니다.

1단계: 칼럼(열) 개수 파악하기 원본 쿼리가 몇 개의 열을 반환하는지 모르기 때문에, 오류가 나지 않을 때까지 NULL의 개수를 늘려가며 요청을 보냅니다.

 

?id=1' UNION SELECT NULL -- (에러 발생 시: 1개가 아님)

?id=1' UNION SELECT NULL, NULL -- (에러 발생 시: 2개가 아님)

?id=1' UNION SELECT NULL, NULL, NULL -- (성공 시: 원본 쿼리는 3개의 열을 가지고 있음)

 

2단계: 출력되는 칼럼 위치 확인하기 열의 개수를 알았다면, 어떤 열의 데이터가 실제 화면에 출력되는지 확인해야 합니다. 숫자를 넣어서 테스트합니다.

공격 구문: ?id=1' UNION SELECT 1, 2, 3 --

결과: 만약 화면에 2라는 숫자가 떴다면, 두 번째 열이 화면에 렌더링되는 위치임을 알 수 있습니다.

 

3단계: 데이터 탈취 화면에 출력되는 위치(위 예시에서는 2번)에 원하는 SQL 명령어를 넣어 데이터를 봅니다.

예: ?id=1' UNION SELECT 1, database(), 3 -- (현재 DB 이름 확인)

4. (심화) 어떻게 방어할 것인가?

가장 확실한 방어 방법은 Prepared Statement (파라미터화된 쿼리)를 사용하는 것 입니다.

  • 취약한 코드 (예시):
    # 사용자 입력을 문자열에 그대로 연결 (위험!)
    query = "SELECT * FROM users WHERE id = '" + user_input + "'"
    
  • 안전한 코드 (예시):
    # 입력을 데이터로만 취급하고, 명령어로 해석하지 않음 (안전)
    cursor.execute("SELECT * FROM users WHERE id = %s", (user_input,))
    

Prepared Statement를 사용하면 DB는 사용자 입력을 SQL 명령어가 아닌 단순한 '데이터'로만 인식하기 때문에, 공격자가 특수문자를 넣어도 공격이 성립되지 않습니다.

 

5. 실습 및 연습 사이트 (Wargames)

추후에 풀이를 올릴 예정

 

로그인 | Dreamhack

 

dreamhack.io

 

 

로그인 | Dreamhack

 

dreamhack.io

 

 

SQL Injection Lab

Understand how SQL injection attacks work and how to exploit this vulnerability.

tryhackme.com

 

 

OWASP Juice Shop

This room uses the Juice Shop vulnerable web application to learn how to identify and exploit common web application vulnerabilities.

tryhackme.com

 

 

 

 

 

 

 

 

 

'설명' 카테고리의 다른 글

SSTI(Server-Side Template Injection)와 Python RCE 원리  (0) 2026.01.09
Web Shell과 Reverse Shell  (0) 2026.01.05
XSS란?  (0) 2026.01.03
mac에서 x86 환경 구축하기  (0) 2025.08.31
Agentic AI  (2) 2025.08.31