-
SQL Injection보안 2023. 8. 30. 11:34
웹 응용 프로그램에서 발생할 수 있는 보안 취약점 중 하나입니다. 이 공격은 악의적인 사용자가 웹 응용 프로그램의 입력 폼이나 매개변수를 통해 SQL(Structured Query Language) 쿼리를 조작하여 데이터베이스에 대한 비인가된 액세스를 획득하거나 조작하는 것을 의미합니다. 일반적으로 SQL Injection 공격은 다음과 같은 과정
- 입력 폼 또는 매개변수 식별: 웹 응용 프로그램에는 사용자가 데이터를 입력하는 폼이나 매개변수가 있을 수 있습니다. 이러한 입력 공간을 통해 사용자가 데이터베이스에 대한 쿼리를 전달합니다.
- 악의적인 SQL 코드 삽입: 공격자는 입력 필드나 매개변수에 악의적인 SQL 코드를 삽입합니다. 이 코드는 원래 의도된 쿼리와 병합되어 데이터베이스에 전달됩니다.
- SQL 쿼리 조작: 공격자가 삽입한 SQL 코드는 데이터베이스에서 실행될 때 해당 데이터베이스의 내용을 조작하거나 노출할 수 있습니다. 예를 들어, 로그인 기능에서 공격자가 입력한 정보를 이용해 사용자 인증을 우회하거나 데이터베이스 내의 데이터를 삭제, 수정하거나 노출시킬 수 있습니다.
SQL Injection을 방지하기 위한 몇 가지 예防책:
- 매개변수화된 쿼리 사용: SQL 쿼리에 사용자 입력을 직접 삽입하는 대신, 매개변수화된 쿼리를 사용하여 입력 데이터를 안전하게 삽입합니다.
- 입력 유효성 검사: 입력 받는 데이터를 검사하여 예상하지 못한 문자나 코드가 포함되지 않도록 합니다.
- 웹 애플리케이션 방화벽(WAF): WAF를 사용하여 악의적인 SQL 쿼리나 코드를 탐지하고 차단할 수 있습니다.
- 최소 권한 원칙: 데이터베이스 사용자에게 최소한의 권한만 부여하여, 공격자가 악용할 수 있는 영역을 제한합니다.
- 보안 업데이트와 패치: 데이터베이스 시스템과 웹 애플리케이션을 항상 최신 버전으로 유지하고 보안 업데이트와 패치를 적용합니다.
기본적인 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