전자금융기반시설 (웹, 모바일)

SQL Injection

서쪽곰 2023. 5. 29. 22:09

목 차

     

    평가항목ID WEB-SER-001, MOB-SER-001 위험도 5
    통제구분 5.8.4 (일반공통) 서비스 보호 평가항목 SQL Injection
    상세설명 o 사용자가 간섭 가능한 매개변수(URL 파라미터, XML 등)에 의해 SQL 질의문이 완성되는 점을 이용하여, 해당 매개변수 변조를 통해 비정상 질의 가능 여부를 점검
    * (평가 예시) 
    - URL 파라미터 또는 XML 등 입력하는 부분에 SQL 구문 입력 후 서버에서 응답한 값에 대한 위험성 점검
    - SQL문으로 해석될 수 있는 값(글번호, 검색 내용 등)을 입력하여 데이터베이스내에 저장된 정보 열람 및 시스템 명령 실행가능 여부 점검
    - 조작된 XPath 쿼리를 보내어 비정상적인 질의 가능 여부 점검 등

     

    SQL Injection

    데이터베이스(DB)와 연동된 웹 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 URL 입력란에 SQL 질의문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안취약점을 말합니다.

     

    소프트웨어 개발보안 가이드_SQL 삽입 취약점


    SQL 주입 공격을 방지하려면 적절한 보안 조치를 구현하는 것이 중요합니다.

    입력 유효성 검사 및 매개변수화된 쿼리: 사용자 입력을 SQL 쿼리에 통합하기 전에 항상 유효성을 검사하고 삭제합니다. SQL 코드를 사용자 입력과 분리하는 매개 변수가 있는 쿼리 또는 준비된 문을 사용하여 공격자가 악의적인 SQL 명령을 삽입할 수 없도록 합니다.

    최소 권한 원칙: 애플리케이션의 데이터베이스 사용자 계정에 필요한 작업을 수행하는 데 필요한 최소 권한이 있는지 확인합니다. 이는 SQL 인젝션 취약점이 악용될 경우 공격자가 일으킬 수 있는 잠재적 손상을 제한합니다.

    입력 삭제: 입력 필터링 기술을 사용하여 SQL 구문을 변경할 수 있는 특수 문자를 제거하거나 이스케이프 합니다. 적절한 데이터 유효성 검사 루틴을 사용하여 예상 형식을 준수하지 않는 입력을 거부하십시오.

    보안 코딩 관행: 보안 코딩 지침과 모범 사례를 따라 강력하고 안전한 애플리케이션을 개발하십시오. 사용자 입력을 사용하여 SQL 쿼리를 동적으로 구성하지 말고 대신 준비된 문이나 저장 프로시저를 사용하십시오.

    정기적인 보안 감사 및 업데이트: 애플리케이션의 코드베이스에 대한 정기적인 보안 감사를 수행하여 잠재적인 SQL 주입 취약점을 식별하고 해결합니다. 애플리케이션 프레임워크 또는 데이터베이스 관리 시스템에서 제공하는 보안 패치 및 업데이트로 최신 상태를 유지하십시오.

    웹 애플리케이션 방화벽(WAF): WAF를 구현하면 악성 SQL 코드가 애플리케이션에 도달하기 전에 감지하고 차단하여 SQL 삽입 공격에 대한 추가 보호 계층을 제공할 수 있습니다.

    이러한 예방 조치를 채택함으로써 조직은 SQL 인젝션 취약점의 위험을 크게 줄이고 애플리케이션 및 데이터베이스의 전반적인 보안 태세를 강화할 수 있습니다.

     

    해결방안

    1. JDBC API

    PreparedStatement 객체 등을 이용하여 DB에 컴파일된 쿼리문(상수)을 전달하는 방법을 사용합니다. PreparedStatement를 사용하는 경우에는 DB 쿼리에 사용되는 외부입력값에 대하여 특수문자 및 쿼리 예약어를 필터링하고, 스트러츠(Struts), 스프링(Spring) 등과 같은 프레임워크를 사용하는 경우에는 외부입력값 검증모듈 및 보안모듈을 상황에 맞추어 적절하게 사용합니다.

     

    소프트웨어 개발보안 가이드_JDBC API

     

    2. MyBatis

    외부입력값을 MyBatis 쿼리맵에 바인딩할 경우 $(문자열) 기호가 아닌 #(상수) 기호를 사용해야 합니다. $ 기호를 사용하는 경우 입력값을 문자열에 결합하는 형태로 쿼리에 반영하므로 쿼리문이 조작될 수 있습니다.

     

    소프트웨어 개발보안 가이드_Mybatis

     

    3. C#

    C# 코드는 외부 입력값을 SQL 쿼리에 직접 사용하고 있어, 쿼리의 구조가 변경될 위험이 있습니다. 파라미터 바인딩을 사용하여 쿼리의 구조가 변경될 위험을 제거해야 합니다.

    소프트웨어 개발보안 가이드_C#

     

    반응형