CWE-89 : SQL Injection

rootk1m·2025년 3월 20일

CCE,CVE,CWE

목록 보기
1/3

SQL Injection

정의

  • SQL Injection이란 소프트웨어가 SQL 명령문에 포함되는 특수 문자를 적절히 escape하지 않아, 공격자가 입력란에 악의적인 SQL 구문을 삽입할 수 있는 상태
  • 공격자는 이를 이용해 데이터베이스의 정보를 조회, 변경, 삭제하거나 시스템 권한을 상승시킬 수 있음.

발생 원인

  • 사용자 입력의 직접 사용
    사용자가 입력한 데이터를 별도의 검증 없이 SQL 쿼리 문자열에 그대로 삽입하면, 사용자가 의도하지 않은 SQL 명령이 실행될 수 있음.
  • Escape 미흡
    ' 나 " 같은 특수 문자가 쿼리 문법에 중요 역할을 하는데, 이를 적절히 처리하지 않으면 쿼리 구조가 망가지게 됨

공격 결과

  • 인증 우회
    로그인 폼에서 SQL Injection을 사용하면 정상적인 인증 절차를 우회해 로그인에 성공할 수 있음.
  • 데이터 노출 및 변조
    공격자가 데이터베이스에서 민감한 정보를 조회하거나, 데이터를 삭제, 변경할 수 있음.
  • RCE
    데이터베이스나 애플리케이션 서버의 명령어를 사용해 전체 시스템을 제어할 수 있음.

예시

  1. 로그인 우회

일반적인 로그인 쿼리:

SELECT * FROM users WHERE username = '사용자입력' AND password = '사용자입력';

만약 사용자가 username에 ' OR '1'='1 을 입력한다면?

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '...';

처럼 변하게 됨. '1'='1'은 항상 True 이므로, 로그인 절차 우회 가능

  1. 데이터 노출

특정 사용자 정보를 조회하는 쿼리에서, 공격자가 입력값에

'; DROP TABLE users; -- 

같은 코드를 삽입하면, 원래 의도했던 조회 쿼리 뒤에 데이터베이스 테이블을 삭제하는 명령어가 추가되어 데이터 손실이 발생할 수 있음.

예방 조치

  • 입력값 검증 및 정규화:
    모든 사용자 입력은 허용된 형식과 범위 내에 있는지 확인해야 함.
    이메일 주소나 숫자 등 예상되는 형태의 데이터만 허용하도록 체크해야 함

  • 파라미터화된 쿼리(Prepared Statement) 사용:
    SQL 쿼리를 미리 컴파일하고, 사용자 입력은 별도의 파라미터로 전달하는 방식으로 처리해야 함
    이 방식은 입력값이 SQL 코드로 해석되지 않게 함.

  • 저장 프로시저 사용:
    저장 프로시저를 활용하면, 미리 정의된 SQL 문을 호출하는 형태가 되어 직접 쿼리 문자열을 구성하는 위험을 줄일 수 있음.

  • 최소 권한 원칙 적용:
    데이터베이스 사용자에게 꼭 필요한 권한만 부여하여, 설령 SQL 인젝션 공격이 성공하더라도 피해 범위를 제한할 수 있음.

  • 보안 모니터링 및 로그 분석:
    비정상적인 쿼리 실행이나 의심스러운 로그인을 탐지하기 위한 모니터링 체계를 구축하면, 공격 시도를 조기에 발견하고 대응할 수 있음.

궁금하신 점이나, 잘못된 정보가 있다면 댓글로 알려주세요. 감사합니다!


출처:
https://cwe.mitre.org/data/definitions/89.html
+내 머리

8개의 댓글

comment-user-thumbnail
2025년 3월 21일

Blind SQLI와 SQLI 차이점도 알려 주세요 ~

1개의 답글
comment-user-thumbnail
2025년 3월 21일

placeholder 로도 예방할 수 있을 듯 한데, 이건 어떻게 생각하시나요 ? 🤔

1개의 답글
comment-user-thumbnail
2025년 3월 21일

sqli 취약점이 존재하더라도 프로그램의 로직에는 영향을 주지 않는 경우는 뭐가 있을까요 ~ ?

1개의 답글