ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL Injection
    보안 2023. 8. 30. 11:34
    웹 응용 프로그램에서 발생할 수 있는 보안 취약점 중 하나입니다. 이 공격은 악의적인 사용자가 웹 응용 프로그램의 입력 폼이나 매개변수를 통해 SQL(Structured Query Language) 쿼리를 조작하여 데이터베이스에 대한 비인가된 액세스를 획득하거나 조작하는 것을 의미합니다.

     

    일반적으로 SQL Injection 공격은 다음과 같은 과정

    1. 입력 폼 또는 매개변수 식별: 웹 응용 프로그램에는 사용자가 데이터를 입력하는 폼이나 매개변수가 있을 수 있습니다. 이러한 입력 공간을 통해 사용자가 데이터베이스에 대한 쿼리를 전달합니다.
    2. 악의적인 SQL 코드 삽입: 공격자는 입력 필드나 매개변수에 악의적인 SQL 코드를 삽입합니다. 이 코드는 원래 의도된 쿼리와 병합되어 데이터베이스에 전달됩니다.
    3. SQL 쿼리 조작: 공격자가 삽입한 SQL 코드는 데이터베이스에서 실행될 때 해당 데이터베이스의 내용을 조작하거나 노출할 수 있습니다. 예를 들어, 로그인 기능에서 공격자가 입력한 정보를 이용해 사용자 인증을 우회하거나 데이터베이스 내의 데이터를 삭제, 수정하거나 노출시킬 수 있습니다.

     

    SQL Injection을 방지하기 위한 몇 가지 예防책:

    1. 매개변수화된 쿼리 사용: SQL 쿼리에 사용자 입력을 직접 삽입하는 대신, 매개변수화된 쿼리를 사용하여 입력 데이터를 안전하게 삽입합니다.
    2. 입력 유효성 검사: 입력 받는 데이터를 검사하여 예상하지 못한 문자나 코드가 포함되지 않도록 합니다.
    3. 웹 애플리케이션 방화벽(WAF): WAF를 사용하여 악의적인 SQL 쿼리나 코드를 탐지하고 차단할 수 있습니다.
    4. 최소 권한 원칙: 데이터베이스 사용자에게 최소한의 권한만 부여하여, 공격자가 악용할 수 있는 영역을 제한합니다.
    5. 보안 업데이트와 패치: 데이터베이스 시스템과 웹 애플리케이션을 항상 최신 버전으로 유지하고 보안 업데이트와 패치를 적용합니다.

     

     

    기본적인 SQL에 대한 설명과 SQL Injection의 아주 기초적인 부분을 다루는 챕터이다

    2단계 문제

    문제 : 직원 밥 프랑코의 부서를 찾기 (전체 관리자의 권한이 부여되었으면 인증 없이 모든 데이터에 액세스 가능)

    Employees 테이블의 정보를 보여주고 SQL Query를 이용해 특정 정보를 조회하면 해결할 수 있는 문제이다


    문제에서 요구한건 BoB Franco의 정보. select문을 이용하면 될것이고 first_name과 last_name column을 조건으로 죄회하면 된다

     

     

    select * from employees where first_name='Bob' and last_name='Franco'; 

    3단계 문제

    문제: 직원 토비 바넷의 부서를 영어부로 변경하기 (전체 관리자 권한이 부여되었으며 인증 없이 모든 데이터에 액세스 가능)

    DML은 데이터를 직접적으로 조회, 수정, 추가, 삭제 가능한 쿼리들을 말한다. Select/Insert/Delete/Update 가 있다.

    문제의 내용은 Tobi Barnett의 department 컬럼을 Sales로 바꾸면 해결이된다.
    Update문에 where로 이름을 조건으로 걸면 금방  풀릴것으로 보인다

    구문 : Update [table] set [column]=[data] where [column]=[data]

     

     

    update employees set department='Sales' where first_name='Tobi' and last_name='Barnett';

    4단계 문제

     

    문제: employees 테이블에서 phone 컬럼(varchar(20)) 열을 추가

    DDL은 데이터를 정의하는 쿼리들을 의미한다. 예를들어 데이터베이스나 테이블 자체에 대한 생성 또는 삭제 그리고 수정이 있을수 있다. Create/Drop/Alter 문이 있다

    문제는 employees table에 phone 컬럼을 추가하면 되는 문제이다. 아마도 Alter문을 이용하면 쉽게 풀릴것같다.

    구문: Alter table [table] add [column] [type]
              Alter table [table] drop [column] 

     

     

    alter table employees add column phone varchar(20);

    5단계 문제

     

    이번엔 DCL 관련한 문제이다. 데이터를 제어할 수 있는 쿼리로 권한을 부여하거나, 뺄수 있는 Grant와 Revoke 쿼리가 해당한다.

    문제 자체는 grant_rights라는 테이블에 unauthorized_user가 접근할 수 있게 권한을 주면 되는것으로 보인다. 다만 여기에 조금 함정이 있었다. 기본적으로 grant 쿼리는 권한을 줄 테이블에 대한 데이터베이스명을 알아야 db명.테이블명 이런식으로 쿼리를 짜는데... 데이터베이스명을 전혀 모른다...

     

     

    이 부분은 WebGoat가 기본적으로 HSqlDB를 사용하고 있어 발생하는 이슈로, 메뉴얼을 보렴 HSqlDB는 grant나 revoke를 할때 db명 없이 바로 테이블명을 넣어 권한을 제어할 수 있다고 한다.

    그렇다면 바로 grant명령어로 권한을 넣어줘보자. 어떤 권한을 넣으라고는 나오지 않았기에, 모든 권한을 넣어보자.

     

     

    grant all privileges on grant_rights to unauthorized_user;

    9단계 문제

     

     

    문제: 아래 양식을 사용하여 users 테이블에서 모든 사용자를 검색(전체 목록을 얻으려면 특정 사용자 이름을 알 필요없다)

    string 형태에서 발생하는 SQL Injection이다. 위에서 제공한 

    '보안' 카테고리의 다른 글

    HTTP Proxies  (0) 2023.08.29
    HTTP Basics  (0) 2023.08.29
    WebGoat  (0) 2023.08.28
    XSS(Stored)  (0) 2023.08.28
    admin 비밀번호 취득 SQL Map  (0) 2023.08.28
Designed by Tistory.