[취약점] SQL 인젝션

2024. 3. 22. 14:42정보 보안/취약점

 

정의

 

  대화형 웹 사이트에 비정상적인 사용자 입력 값으로 웹 사이트 SQL 쿼리가 완성되는 약점을 이용하며, 입력 값을 변조하여 비정상적인 SQL 쿼리를 조합하거나 실행하는 공격하는 취약점을 의미한다.

 

 

공격 시나리오

 

  사용자 입력 값에 임의의 SQL 구문을 삽입하여 변조된 비정상적인 SQL 쿼리로 DBMS 및 데이터를 열람하거나 조작한다.

 

 

대응 방안

 

  • 소스코드에 SQL 쿼리를 사용자 입력 값으로 받는 함수나 코드를 사용하는 경우, 임의의 SQL 쿼리 입력에 대한 검증 로직 구현하여 서버에 검증되지 않은 SQL 쿼리 요청 시 에러 페이지가 아닌 정상 페이지가 반환되도록 필터링 처리
  • 웹 방화벽에 SQL 인젝션 관련 룰셋을 적용

 

 

판단 기준

 

주요정보통신기반시설

  • 양호 : 임의로 작성된 SQL 쿼리 입력에 대한 검증이 이루어지는 경우
  • 취약 : 임의로 작성된 SQL 쿼리 입력에 대한 검증이 이루어지지 않는 경우

 

 

점검 예시

 

주요정보통신기반시설

  • 사용자 입력 값에 특수문자나 임의의 SQL 쿼리를 삽입하여 DB 에러 페이지가 반환되는지 확인(Error Based SQL 인젝션 공격 가능 여부 확인 작업)
  • 사용자 입력 값에 임의의 SQL 참, 거짓 쿼리를 삽입하여 참, 거짓 쿼리에 따라 반환되는 페이지가 다른지 확인(Blind SQL 인젝션 공격 가능 여부 확인 작업)
  • 로그인 페이지에 참이 되는 SQL 쿼리를 전달하여 로그인되는지 확인

 

전자금융기반시설

  • URL 파라미터 또는 XML 등 입력하는 부분에 SQL 구문 입력 후 서버에서 응답한 값에 대한 위험성 점검
  • SQL 구문으로 해석될 수 있는 값(글번호, 검색 내용 등)을 입력하여 데이터베이스 내에 저장된 정보 열람 및 시스템 명령 실행가능 여부 점검
  • 조작된 XPath 쿼리를 보내어 비정상적인 질의 가능 여부 점검

 

 

구체적 보안 설정 방법

 

1. SQL 쿼리에 사용되는 문자열의 유효성을 검증하는 로직을 구현한다. 

 

2. 아래와 같은 특수문자를 사용자 입력 값으로 지정하는 것을 금지한다. (특수문자들은 DB 종류에 따라 달라질 수 있음)

문자 설명
' 문자 데이터 구분기호
; 쿼리 구분 기호
--, # 해당라인 주석 구분 기호
/* */ /* 와 */ 사이 구문 주석 기호

 

3. Dynamic SQL 구문 사용을 지양하고 파라미터 값 문자열 검증하는 기능을 구현한다.

 

4. 시스템에서 제공하는 에러 메시지 및 DBMS에서 제공하는 에러 코드가 노출되지 않도록 예외처리 기능을 구현한다.