0Pricing
Security+ Academy · 강의

SQL 삽입과 명령 삽입

공격자가 데이터베이스 쿼리나 운영 체제 명령을 조작하는 삽입 페이로드를 작성하는 방법과 매개변수화된 쿼리 및 입력 검증으로 이를 방지하는 방법을 학습합니다.

SQL 삽입과 명령 삽입은(는) CoddyKit의 무료 Security+ Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Security+ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Security+ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

SQL Injection이란 무엇인가

SQL Injection (SQLi)은 공격자가 나중에 데이터베이스 query로 전달되는 입력 필드에 악성 SQL 코드를 삽입하거나 '주입'할 때 발생합니다. 애플리케이션이 User 입력을 SQL 문에 직접 이어 붙이기 때문에 데이터베이스는 정상적인 데이터와 공격자가 제공한 Commands를 구분할 수 없습니다. SQLi는 OWASP Top 10에서 지속적으로 가장 위험한 웹 Vulnerabilities 중 하나로 분류됩니다.

고전적인 SQLi Payload 예시

취약한 로그인 query는 다음과 같은 형태일 수 있습니다: SELECT * FROM users WHERE username='INPUT' AND password='INPUT'. 공격자가 사용자 이름으로 ' OR '1'='1을 입력하면 query가 변형되어 WHERE 절이 항상 참이 되고, 인증을 완전히 우회합니다. 이것이 고전적인 항진 명제 기반 Injection입니다.

-- Vulnerable query (DO NOT use in production)
SELECT * FROM users
WHERE username = '' OR '1'='1'
  AND password = 'anything';
-- Returns ALL rows — auth bypassed

SQL Injection 유형

SQL Injection 공격은 여러 형태로 이루어집니다. In-band SQLi는 HTTP 응답에 결과를 직접 반환합니다(error 기반 또는 union 기반). Blind SQLi는 Boolean 참/거짓 응답이나 의도적인 시간 지연(SLEEP(5))을 통해 데이터를 추론합니다. Out-of-band SQLi는 응답을 확인할 수 없을 때 DNS 조회와 같은 보조 채널을 사용하여 데이터를 유출합니다.

-- Time-based blind SQLi example
SELECT * FROM users
WHERE id = '1' AND SLEEP(5)--';
-- If response is delayed 5s, injection succeeded

SQLi 방지: Parameterized Query

SQL Injection에 대한 기본 방어 방법은 Parameterized Query(Prepared Statement라고도 함)입니다. Parameterized Query에서는 SQL 구조가 먼저 컴파일되고 User 입력은 별도의 Parameter로 전달되므로 Query 구조를 절대 변경할 수 없습니다. 이 방식은 언어에 관계없이 적용할 수 있으며 입력 정제만 사용하는 것보다 훨씬 신뢰할 수 있습니다.

# Python example — parameterized query (safe)
import sqlite3
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
username = 'admin'
password = 'secret'
cursor.execute(
    'SELECT * FROM users WHERE username=? AND password=?',
    (username, password)  # parameters, never concatenated
)

심층 방어로서의 입력 검증

Parameterized Query가 기본 방어 수단이지만 입력 검증은 중요한 보조 계층을 제공합니다. 허용 목록 검증은 예상되는 문자만 허용합니다(예: 사용자 이름 필드에는 영숫자만 허용). 차단 목록 검증은 알려진 악성 문자를 차단하지만 공격자는 차단 목록을 우회하기 위해 Payload를 인코딩하거나 난독화하는 경우가 많으므로 허용 목록이 훨씬 강력합니다.

Command Injection이란 무엇인가

Command Injection(OS Command Injection)은 애플리케이션이 정제되지 않은 User 입력을 System Shell에 전달할 때 발생합니다. 데이터베이스를 대상으로 하는 SQL Injection과 달리 Command Injection은 운영 체제 자체를 공격하므로 공격자는 웹 서버 프로세스의 Privileges로 임의의 Commands를 실행할 수 있습니다. 심각도가 CRITICAL로 평가되며 전체 System 침해로 이어지는 경우가 많습니다.

Command Injection 예시

User가 제공한 IP 주소를 Ping하는 웹 앱은 다음과 같은 Command를 사용할 수 있습니다: ping -c 1 INPUT. 공격자가 8.8.8.8; cat /etc/passwd를 입력하면 Shell은 ;를 Command 구분자로 해석하여 두 Commands를 모두 실행합니다. 일반적인 Injection 연산자로는 ;, &&, ||, |, 백틱 Command 치환이 있습니다.

# Vulnerable Python (subprocess with shell=True)
import subprocess
user_ip = '8.8.8.8; cat /etc/passwd'  # attacker input
subprocess.run('ping -c 1 ' + user_ip, shell=True)

# Safe alternative — avoid shell=True, pass args as list
subprocess.run(['ping', '-c', '1', '8.8.8.8'])

Command Injection 방지

Command Injection에 대한 가장 안전한 방어 방법은 User 입력으로 OS Commands를 호출하는 것을 완전히 피하는 것이며, 동일한 목적을 달성하는 라이브러리 함수를 사용해야 합니다. Shell 호출이 불가피한 경우에는 인수를 목록으로 전달하고(문자열을 이어 붙여 전달하지 않음), Shell 해석을 비활성화하고, 엄격한 허용 목록에 따라 입력을 검증하며, 가능한 한 최소 Privileges를 가진 User 계정으로 프로세스를 실행해야 합니다.

OWASP 맥락: 상위 10대 항목의 삽입 공격

OWASP Top 10은 SQL, NoSQL, OS, LDAP 삽입을 포괄하는 삽입 공격을 가장 심각한 애플리케이션 보안 위험 중 하나로 분류합니다. OWASP는 심층 방어 접근 방식을 권장합니다. 인터프리터를 거치지 않는 안전한 API를 사용하고, 서버 측에서 허용 목록 방식의 양성 입력 검증을 수행하며, 해당 인터프리터의 문법에 맞게 특수 문자를 이스케이프하고, 대량 정보 노출을 방지하기 위해 LIMIT와 같은 SQL 제어 기능을 사용해야 합니다.

탐지: WAF와 로깅

웹 애플리케이션 방화벽(WAF)은 HTTP 요청을 서명 패턴과 비교해 검사함으로써 흔한 삽입 공격 페이로드를 탐지하고 차단할 수 있습니다. 그러나 WAF는 인코딩 기법으로 우회할 수 있으며, 안전한 코딩을 대신할 수는 없습니다. 적절한 애플리케이션 로깅, 즉 질의 매개변수, 응답 코드, 오류 메시지를 기록하는 작업을 수행하면 보안 팀이 사고를 검토하는 동안 삽입 공격 시도를 식별할 수 있습니다.

삽입 공격이 현실에 미치는 영향

삽입 공격은 역사상 가장 큰 데이터 유출 사고를 일으켰습니다. 2017년 Equifax 침해 사고에서는 웹 애플리케이션의 결함을 통해 1억 4,700만 건의 기록이 노출되었습니다. 2011년에는 Sony PlayStation Network에 대한 SQL 삽입 공격으로 7,700만 개의 계정이 침해되었습니다. 이러한 사고는 삽입 결함이 기업에 막대한 영향을 미친다는 점을 보여 줍니다. 삽입 공격이 성공하면 데이터 탈취, 규제 기관의 과징금, 평판 손상, 법적 책임이 모두 뒤따를 수 있습니다.

빠른 확인

이 단원에서 배운 CompTIA Security+ (SY0-701) 개념을 이해했는지 확인해 보십시오.

단원 복습

이 단원에서는 다음을 배웠습니다. SQL 삽입은 정제되지 않은 입력이 데이터베이스 질의문에 연결될 때 이를 악용합니다. 명령 삽입은 ; 및 |과 같은 연산자를 통해 Malicious 입력을 OS 셸에 전달합니다. 또한 매개변수화된 질의문을 사용하고 shell=True를 피하는 것이 기본적인 방어 방법입니다. 다음에는 사이트 간 스크립팅(XSS)과 CSRF 공격을 살펴보겠습니다.

자주 묻는 질문

“SQL 삽입과 명령 삽입” 강의는 무료인가요?

네 — “SQL 삽입과 명령 삽입” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Security+ Academy 강의 전체를 잠금 해제할 수 있습니다. Security+ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“SQL 삽입과 명령 삽입”에서 뭘 배우나요?

공격자가 데이터베이스 쿼리나 운영 체제 명령을 조작하는 삽입 페이로드를 작성하는 방법과 매개변수화된 쿼리 및 입력 검증으로 이를 방지하는 방법을 학습합니다. 브라우저에서 직접 실행하는 실습 코드로 Security+ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Security+ Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Security+ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“SQL 삽입과 명령 삽입” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Security+ Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Security+ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. SQL 삽입과 명령 삽입
  2. 사이트 간 스크립팅(XSS)과 CSRF
  3. 취약한 인증과 안전하지 않은 역직렬화
  4. 보안 SDLC, SAST, DAST 도구
← Security+ Academy(으)로 돌아가기