SQL 인젝션(SQL Injection)은 웹 애플리케이션에서 사용자 입력을 제대로 처리하지 않을 때 발생하는 보안 취약점입니다. 이를 악용하면 공격자가 데이터베이스에 악의적인 SQL 문을 주입하여 데이터 유출이나 조작 등의 심각한 문제를 일으킬 수 있습니다.
예시로 이해하기:
주어진 SQL 문의 기본 구조는 다음과 같습니다
SELECT * FROM users WHERE user_id = '_____'
여기서 _____ 부분에 사용자의 입력이 들어갑니다.
일반적으로 사용자가 입력한 user_id를 데이터베이스에서 검색하는 용도입니다.
예를 들어, 사용자가 doldol을 입력하면 SQL 문은 다음과 같이 완성됩니다
SELECT * FROM users WHERE user_id = 'doldol'
하지만 공격자가 악의적인 입력을 넣으면 어떻게 될까요?
만약 사용자가 다음과 같은 문자열을 입력했다고 가정해봅시다
doldol' OR '1'='1
doldol' OR '1'='1
SELECT * FROM users WHERE user_id = 'doldol' OR '1'='1'
이렇게 되면 조건문 '1'='1'이 항상 참이므로,users 테이블의 모든 사용자 정보를 가져오게 됩니다.
이는 원래 의도와 다르게 모든 데이터에 접근하는 결과를 낳습니다.
왜 작은따옴표(')를 추가로 넣지 않을까요?
기본 SQL 문에서 이미 user_id를 작은따옴표로 감싸고 있으므로,
입력할 때 앞뒤에 작은따옴표를 추가로 넣을 필요가 없습니다.
만약 추가로 작은따옴표를 넣으면 문법 오류가 발생하거나 의도한 대로 동작하지 않을 수 있습니다.
SQL 인젝션을 이해하는 핵심 포인트
OR 연산자는 두 조건 중 하나라도 참이면 전체 조건이 참이 되도록 합니다. 이를 악용하여 인증 절차나 데이터 조회를 우회할 수 있습니다.
기본 SQL 문
SELECT * FROM users WHERE user_id = '_____'
공격자가 입력한 값
' OR '1'='1
완성된 SQL 문
SELECT * FROM users WHERE user_id = '' OR '1'='1'
설명
AND 연산자는 두 조건이 모두 참이어야 전체 조건이 참이 됩니다. 이를 이용해 특정 조건을 만족하는 데이터를 필터링하거나, 존재 여부를 파악할 수 있습니다.
공격자가 입력한 값
doldol' AND '1'='1
완성된 SQL 문
SELECT * FROM users WHERE user_id = 'doldol' AND '1'='1'
설명
# 또는 --는 SQL에서 주석을 시작하는 문자입니다. 이를 이용해 쿼리의 일부를 무력화시킬 수 있습니다.
공격자가 입력한 값
doldol'#
완성된 SQL 문
SELECT * FROM users WHERE user_id = 'doldol'#
설명:
Error Based SQL Injection (0) | 2024.12.03 |
---|---|
UNION (0) | 2024.11.26 |
Burp Suite를 활용한 Web Proxy Tool의 활용과 실습 (2) | 2024.11.07 |
JWT (0) | 2024.11.04 |
로그인 세션 유지 (0) | 2024.11.01 |