SQL 인젝션(SQL Injection)은 사용자 입력을 통해 악의적인 SQL 쿼리를 삽입해 데이터베이스를 조작하는 공격이다. OWASP Top 10에서 지속적으로 상위를 차지하는 가장 위험한 취약점 중 하나다.
공격 원리
python
# 취약한 코드
username = request.form['username']
password = request.form['password']
query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
# 공격자 입력:
# username: admin' --
# password: 아무거나
# 실행되는 쿼리:
# SELECT * FROM users WHERE username='admin' -- ' AND password='아무거나'
# -- 이후는 주석 처리 → password 검사 우회!
데이터 탈취 공격
sql
-- Union-based 인젝션
' UNION SELECT username, password FROM users --
-- 다른 테이블 데이터를 결과에 포함시킴
-- 전체 데이터베이스 덤프
'; DROP TABLE users; --
방어 방법
python
# 1. 파라미터화된 쿼리 (가장 효과적)
cursor.execute(
"SELECT * FROM users WHERE username=%s AND password=%s",
(username, password) # 입력값이 자동으로 이스케이프
)
# 2. ORM 사용
user = User.query.filter_by(username=username, password=password).first()
# 3. 입력 검증
import re
if not re.match(r'^[a-zA-Z0-9_]+$', username):
raise ValueError("유효하지 않은 사용자명")
관련 개념
- •SQL — SQL 인젝션의 대상
- •OWASP — SQL 인젝션은 OWASP A03
- •ORM — SQL 인젝션 방지 도구
참고문헌
- •OWASP — SQL Injection Prevention Cheat Sheet