ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL injection과 BWAPP
    카테고리 없음 2023. 4. 20. 14:35
    반응형

    목차

    SQL Injection

    사전 방지 방법

    BWAPP을 이용한 학습

     


    SQL Injection

    SQL Injection 공격은 악의적인 사용자가 웹 애플리케이션을 이용하여 데이터베이스에 액세스하고 조작하는 공격입니다. 이 공격은 보통 웹 애플리케이션에서 사용되는 입력 폼에서 발생하며, 특히 검색 폼에서 많이 발생합니다. 이 때문에 SQL Injection 공격은 GET 요청에서 가장 많이 발생하는 보안 취약점 중 하나입니다.

     

    SQL Injection 공격이 발생하는 원리는 입력값을 검증하지 않고 쿼리문에 직접 포함시키는 경우입니다. 악의적인 사용자는 이를 이용하여 쿼리문에 추가적인 조건을 주입하거나, 기존의 쿼리문을 변조하여 데이터베이스에 액세스하고 조작할 수 있습니다. SQL Injection 공격을 방지하기 위해서는 입력값에 대한 적절한 검증과 이스케이프 처리를 수행해야 합니다. 이를 위해서는 다음과 같은 방법들을 사용할 수 있습니다.

    • 입력값 검증: 입력값에 대한 검증을 수행하여, 사용자가 입력한 값이 적절한 형태인지 확인합니다. 이를 통해 적절하지 않은 입력값을 걸러낼 수 있습니다.
    • 매개변수화된 쿼리문 사용: 입력값을 직접 쿼리문에 포함시키는 대신, 매개변수화된 쿼리문을 사용합니다. 이를 통해 입력값이 쿼리문에 직접 포함되지 않고, 매개변수로 전달되어 쿼리문 내에서 안전하게 처리됩니다.
    • 데이터베이스 권한 제한: 데이터베이스 사용자에게 최소한의 권한만 부여하여, 악의적인 사용자가

     

    사전 방지 방법

    데이터베이스 사용자에게 최소한의 권한만 부여하는 것은 보안상 매우 중요합니다. 이를 통해 데이터베이스를 보호하고, 악의적인 사용자가 데이터베이스에 접근하여 중요한 정보를 훔치거나 파괴하는 것을 방지할 수 있습니다. 데이터베이스 권한을 제한하기 위해서는 다음과 같은 방법을 고려할 수 있습니다.

    • 사용자 생성 시 권한 설정: 데이터베이스 사용자를 생성할 때, 해당 사용자에게 필요한 최소한의 권한만 부여합니다. 예를 들어, 데이터 조회만 가능한 사용자와 데이터 수정/삭제가 가능한 사용자를 구분하여 권한을 부여할 수 있습니다.
    • 역할(Role) 기반 접근 제어: 사용자 그룹을 역할(Role) 단위로 구성하고, 역할에 필요한 권한을 할당합니다. 이후 사용자는 자신이 속한 역할에 따라 권한을 상속받아 데이터베이스에 접근할 수 있습니다.
    • 접근 제어 목록(ACL) 사용: 접근 제어 목록(ACL)을 사용하여 사용자별로 허용되는 데이터베이스 리소스를 명시적으로 지정합니다. 이를 통해 사용자가 접근할 수 있는 데이터베이스 객체와 권한을 제한할 수 있습니다.
    • 파라미터화된 쿼리 사용: 파라미터화된 쿼리를 사용하여 SQL Injection 등의 공격으로부터 데이터베이스를 보호할 수 있습니다. 파라미터화된 쿼리를 사용하면 사용자 입력값을 쿼리에 바로 삽입하지 않고, 미리 정의된 파라미터를 사용하여 입력값을 처리하므로, 악의적인 사용자가 쿼리를 조작하여 데이터베이스를 공격하는 것을 방지할 수 있습니다.

    이러한 방법들을 통해 데이터베이스 사용자에게 최소한의 권한만 부여하여 데이터베이스 보안을 강화할 수 있습니다.

     

    BWAPP을 이용한 학습

    Beebox는 OWASP에서 제공하는 웹 취약점 학습용 가상 머신입니다. Beebox에서 SQL Injection (GET/Search)을 학습하기 위해서는 다음과 같은 단계를 따릅니다.

    • Beebox 가상 머신을 다운로드하고 설치합니다.
    • 가상 머신을 실행하고, 웹 브라우저에서 http://192.168.56.101/bWAPP/login.php로 접속합니다.
    • 로그인 화면에서 beebox 계정으로 로그인합니다.
    • SQL Injection (GET/Search) 링크를 클릭하여 SQL Injection 공격을 수행할 수 있는 페이지로 이동합니다.
    • 검색 폼에 적절한 검색어를 입력하고 검색 버튼을 누릅니다.
    • 검색 결과가 나타나는 화면에서 주소창을 확인합니다.
    • URL 주소창에서 검색어 부분을 확인하고, 이 부분에 SQL Injection 쿼리문을 추가하여 공격을 수행합니다.

     

    Primary key가 있는 테이블에서는 주로 order by 절을 사용할 때 primary key를 기준으로 정렬하는 경우가 많습니다. 이 경우 SQL Injection 공격에서는 order by 절에 입력한 값이 primary key를 기준으로 정렬될 수 있도록 조작하면, 데이터베이스에서 예상치 못한 결과를 반환할 수 있습니다. 하지만 이러한 공격은 primary key가 아닌 다른 열의 값을 기준으로 정렬할 때는 효과가 없습니다.

     

    에러베이스 기반의 SQL Injection에서는 에러 메시지를 통해 데이터베이스 정보를 수집하는 공격 방법입니다. 이 경우, order by 절에 입력한 값이 데이터베이스에서 유효한 열 이름이 아닌 경우, 데이터베이스에서 오류가 발생하여 에러 메시지가 반환됩니다. 이 때 반환된 에러 메시지에서는 데이터베이스의 정보를 확인할 수 있습니다. 예를 들어, MySQL 데이터베이스에서는 "Unknown column"이라는 메시지를 반환하는데, 이 메시지에서는 입력한 열 이름과 관련된 테이블 이름 등의 정보를 파악할 수 있습니다.

     

    order by 1# 공격은 order by 절에 입력한 값이 첫 번째 열을 의미하므로, 에러 메시지에서 반환된 정보에서 첫 번째 열의 이름과 데이터 타입 등을 파악할 수 있습니다. 이를 통해 데이터베이스의 구조나 테이블 이름 등의 정보를 수집할 수 있습니다. 하지만 이러한 공격은 데이터베이스에서 order by 절에 입력한 값이 유효한 경우에만 가능하며, 효과적인 방어 방법으로는 입력값을 필터링하거나, Prepared Statement 등 파라미터화된 쿼리를 사용하는 것이 있습니다.

     

    반응형

    댓글

Designed by Tistory.