주통기반-SQL Injection

황인환·2024년 8월 13일

정의

  • 입력값을 통해 악의적인 SQL 코드를 주입하여 데이터베이스를 조작하거나 민감한 정보를 탈취하는 웹 보안 취약점입니다.

원인

  • 사용자 입력의 검증 부족: 사용자 입력값을 SQL 쿼리에 직접 포함하여 실행할 때, 입력값을 제대로 검증하지 않습니다.

  • Prepared Statements: 매개변수화된 쿼리나 Prepared Statements를 사용하지 않고 동적 SQL 쿼리를 생성했기 때문입니다.

위협

  • 해당 취약점이 존재하는 경우 비정상적인 SQL쿼리로 DBMS 및 데이터를 열람하거나 조작이 가능해집니다.

TEST방법

' and '1' ='1(참)입력 ' and '1' ='2(거짓)입력으로 참 거짓 값의 결과가 다르게 나타나는지 확인합니다.

  • 로그인 페이지
    로그인 가능한 아이디(admin) 입력후 ' and '1' ='1입력 -> ex) admin' and '1' ='1
    로그인 가능한 비밀번호 입력후 로그인을 시도합니다.
  • 기타
    DB가 연결되어 있을만한 파라미터 값에 ' and '1' ='1입력 시도을 시도합니다.
    헤더에도 ' and '1' ='1입력을 시도합니다.
    Prepare Statements를 사용할 수 없는 column, table_name, order by에도 ' and '1' ='1입력을 시도합니다.

공격시나리오

  1. DB와 연결 되어있을 만한 곳에 TEST 합니다.

  2. 만약 참거짓 TEST의 결과가 다르게 나타나면 Blind SQLInjection 자동화 툴을 이용하여 DB정보를 취득합니다.

대상 & 판단기준 & 조치방법

설명
대상웹어플리케이션 소스코드, 웹 방화벽
판단기준양호 임의로 작성된 SQL 쿼리 입력에 대한 검증이 이루어지는 경우
취약 임의로 작성된 SQL 쿼리 입력에 대한 검증이 이루어지지 않는 경우
조치방법1. SQL 쿼리의 구조를 미리 정의하고, 실행 시 동적인 값을 안전하게 바인딩할 수 있는 Prepare Statements 사용
바인딩은 SQL 쿼리의 자리 표시자에 동적인 값을 안전하게 대입하여 쿼리를 실행하는 과정입니다.
2. 특정 단어만 사용하게하는 White List Filtering 사용

0개의 댓글