기록

[시큐어 코딩]SQL Injection이란 무엇인가?

알리에미친남자 2025. 4. 28. 15:52

✅ SQL Injection이란?

SQL Injection은 웹 애플리케이션이 사용자 입력을 제대로 필터링하지 않고 데이터베이스 쿼리에 넣을 때 발생하는 보안 취약점이다.
쉽게 말하면, 사용자가 입력하는 값에 악의적인 SQL 문장을 심어서 서버가 의도하지 않은 명령을 수행하게 만드는 공격이다.

요약하면:
"입력값으로 SQL 쿼리를 조작한다."

 

✅ 어떻게 작동할까?

예를 들어, 로그인 폼이 있다고 가정

SELECT * FROM users WHERE username = '입력한아이디' AND password = '입력한비밀번호';

 

여기서 아이디 입력

admin' --

 

SQL 문장은 이렇게 변합니다

SELECT * FROM users WHERE username = 'admin' -- ' AND password = '비밀번호';

 

--는 SQL에서 "주석"을 뜻하기 때문에, 뒤에 오는 비밀번호 검증 부분이 무시됨.
결과적으로 비밀번호를 몰라도 로그인 가능.

 

✅ SQL Injection으로 할 수 있는 것들

  • 비밀번호 없이 로그인
  • 다른 사용자 계정 탈취
  • 데이터베이스의 모든 정보 조회
  • 데이터 수정/삭제
  • 심한 경우, 서버 시스템 명령어 실행까지 가능

✅실습 예시

로그인 우회 입력값 예시:

' OR '1'='1

 

데이터 탈취 입력값 예시 (Union 기반):

' UNION SELECT username, password FROM users --

 

시간 지연을 이용한 Blind SQL Injection 예시:

' OR IF(1=1, SLEEP(5), 0) --

(응답이 느려지면 Injection 성공)

 

✅ 어떻게 막을까? (방어법)

Prepared Statements (Prepared SQL) 사용

  • SQL 문장을 고정하고, 값만 바인딩해서 넣기
  1. ORM 사용하기
    • 예: JPA, Hibernate, Django ORM 등
  2. 입력값 필터링
    • 특수문자( ', ", ;, -- 등) 제거하거나 이스케이프 처리
  3. 최소 권한 원칙 적용하기
    • DB 계정에 꼭 필요한 권한만 부여
  4. 에러 메시지 감추기
    • 사용자에게 SQL 에러 메시지를 노출하지 않기