반응형
SQL 인젝션(SQL Injection
) 은 공격자가 웹 애플리케이션의 데이터베이스 쿼리를 조작하여 민감한 정보를 탈취하거나 시스템을 손상시키는 보안 취약점입니다.
SQL 인젝션은 잘못된 입력 검증으로 인해 발생하며, 가장 심각한 보안 위협 중 하나로 알려져 있습니다.
- 공격자가 SQL 쿼리를 조작할 수 있는 입력값(예: URL, 폼, 쿠키)을 이용.
- 애플리케이션이 공격자의 입력값을 그대로 SQL 쿼리에 포함시키는 경우, 데이터베이스의 무단 접근, 데이터 조작, 시스템 손상이 가능.
-
클래식 SQL 인젝션 (
Classic SQL Injection
)- 일반적인 쿼리 조작으로 데이터베이스를 공격.
- 예시:
sql
공격 입력:SELECT * FROM users WHERE username = 'admin' AND password = '';
admin' OR '1'='1
실행 쿼리:sql
결과: 조건이 항상 참이 되어 무단 로그인 성공.SELECT * FROM users WHERE username = 'admin' OR '1'='1';
-
블라인드 SQL 인젝션 (
Blind SQL Injection
)- 데이터베이스 결과를 직접 확인할 수 없지만, 참/거짓 기반의 응답을 이용.
- 예시:
sql
SELECT * FROM users WHERE id = 1 AND 1=1; -- 참 SELECT * FROM users WHERE id = 1 AND 1=2; -- 거짓
-
에러 기반 SQL 인젝션 (
Error-based SQL Injection
)- 데이터베이스 에러 메시지를 통해 정보를 유출.
- 예시:
UNION SELECT null, @@version;
결과: 데이터베이스 버전이 노출됨.
-
UNION 기반 SQL 인젝션 (
Union-based SQL Injection
)UNION
명령어를 이용해 추가적인 쿼리 결과를 결합.- 예시:
sql
SELECT name, email FROM users UNION SELECT username, password FROM admin;
-
타임 기반 SQL 인젝션 (
Time-based SQL Injection
)- 데이터베이스 응답 시간이 느려지는 것을 이용하여 정보를 유출.
- 예시:
sql
SELECT IF(1=1, SLEEP(5), NULL);
- 데이터 유출: 사용자의 개인정보, 계정 정보, 민감 데이터 탈취.
- 데이터 변경: 데이터베이스 내용 삭제, 수정.
- 무단 접근: 관리자 계정 도용을 통한 시스템 제어.
- 서비스 중단: 데이터베이스 손상으로 인한 장애 발생.
- 백도어 설치: 악성 명령어를 데이터베이스에 삽입하여 추가 공격 수행.
-
Prepared Statement (사전 준비된 쿼리)
- 파라미터화된 쿼리를 사용하여 입력값을 별도로 처리.
- 예시 (Python + MySQL):
python
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
-
ORM 사용
- Hibernate, Django ORM 등 SQL 쿼리를 직접 작성하지 않고 안전하게 데이터베이스 처리.
-
입력값 검증(Input Validation)
- 사용자 입력을 철저히 검증하여 허용된 데이터만 처리.
- 예: 숫자만 필요한 필드에 문자 입력 차단.
-
출력값 인코딩(Output Encoding)
- 데이터베이스 결과값을 안전하게 렌더링.
-
최소 권한 부여
- 데이터베이스 사용자 계정에 최소한의 권한만 부여.
-
에러 메시지 노출 금지
- 클라이언트에 상세한 SQL 에러 정보를 숨김.
-
웹 방화벽 사용
- WAF(Web Application Firewall)를 통해 악성 요청 차단.
SQL 인젝션은 입력값을 신뢰하지 않고 적절히 검증하거나, 안전한 쿼리 작성을 통해 예방할 수 있습니다.
모든 데이터베이스와 연동된 애플리케이션에서 철저히 관리해야 합니다.
728x90
반응형
'DB' 카테고리의 다른 글
pgloader : MySQL, Oracle 등 다양한 데이터베이스를 PostgreSQL로 자동 이관 (0) | 2025.04.28 |
---|---|
soci를 Linux 환경에서 Oracle과 함께 빌드하기 위한 스크립트 (0) | 2024.11.29 |
SQLite 암호화 방식: OFB 모드와 CCM 모드의 차이점 (1) | 2024.11.14 |
Oracle SQL*Loader sqlldr (1) | 2024.11.13 |
SQLite 암호화 SQLCipher : 특징, 빌드, 적용 가이드 (0) | 2020.01.28 |