제목 | [Special Report] 웹 취약점과 해킹 매커니즘 #2 SQL Injection 개요 | ||||
작성자 | 사이버보안팀 | 등록일 | 2022-05-27 | 조회수 | 1060 |
내용 |
■ 개요 이번 '웹 취약점과 해킹 매커니즘'에서 다룰 첫 번째 취약점은 설계된 쿼리문에 의도하지 않은 미상의 쿼리를 임의로 삽입하여 악의적인 SQL 구문을 실행하는 공격인 'SQL Injection'이다. 해당 취약점을 통해 공격자는 데이터베이스에 직접적으로 접근해 중요 정보를 조회, 탈취할 수 있다. 그렇기 때문에 오픈소스 웹 애플리케이션 보안 프로젝트인 OWASP(The Open Web Application Security Project)의 Top 10 취약점 목록과 주요 정보통신 기반 시설 취약점 분석·평가 항목, 전자금융 기반 시설 취약점 분석/평가 항목 등의 다양한 취약점 진단 기준에 빠지지 않고 등장하고 있다. 이번 4월 호는 위 SQL Injection에 관한 내용을 다루기 전에 데이터베이스와 데이터베이스 관리용 언어인 SQL에 대한 내용을 먼저 설명할 예정이며, SQL Injection의 개념과 3가지 공격 유형 등 기본 개념도 설명할 예정이다. ※ 실제 운영 중인 서버에 테스트 또는 공격을 하는 행위는 법적인 책임이 따르므로 개인용 테스트 서버 구축 또는 bWAPP, DVWA, WebGoat 등과 같은 웹 취약점 테스트 환경 구축을 통해 테스트하는 것을 권장한다. ※ 본 Special Report는 JSP와 Oracle Database 11gR2의 환경에서 실습을 진행한다. ■ 기본 개념 SQL Injection에 대한 내용을 진행하기에 앞서 데이터베이스와 데이터베이스 관리용 언어인 SQL(Structured Query Language)에 대해 알아보고자 한다. Step1. 데이터베이스와 DBMS 데이터베이스란 데이터를 효율적으로 관리하기 위해 구조화한 데이터 집합을 뜻하며 DBMS(Data Base Management System)를 통해 운영 및 관리된다. 계층형, 망형, 관계형 등 다양한 종류의 DBMS가 존재하며 대부분의 DBMS는 관계형 DBMS(RDBMS)의 형태로 사용되고 있다. 관계형 DBMS의 데이터베이스는 하나 이상의 행(row)과 열(column)로 이루어진 테이블 형식으로 데이터를 제공한다. 대표적인 관계형 데이터베이스에는 ORACLE, MySQL, MS-SQL, PostgreSQL 등이 있다. Step2. SQL (Structured Query Language) SQL은 데이터베이스에서 질의, 수정, 삭제 등의 작업을 하는 데이터베이스 관리용 언어이며 대부분의 관계형 데이터베이스에서 사용한다. SQL이라는 언어를 통해 사용자가 원하는 데이터를 데이터베이스에 요청하는 행위인 쿼리(질의)를 작성한다. 쿼리 작성 시 주의해야 할 SQL의 언어적 특성은 다음과 같다. 1. 대소문자를 가리지 않는다. 2. SQL쿼리문은 반드시 세미콜론(;)으로 끝나야 한다. 3. 고유값을 가지는 문자열의 경우 홑따옴표(')로 감싸준다. 4. 주석[1]은 한 줄 주석의 경우 --로 나타내고 여러 줄 주석은 /* */로 감싸서 표현한다. 각 데이터베이스 별 주석 처리 방법은 다음과 같다. [1] 주석 처리를 하는 특수문자 뒤의 문장은 의미가 없어진다. SQL 문법은 사용 용도에 따라 데이터 정의어(DDL, Date Definition Language), 데이터 제어어(DCL, Data Control Language), 데이터 조작어(DML, Data Manipulation Language)로 구분된다. 데이터베이스를 조회하고 관리하는 데이터 조작어가 가장 많이 쓰이며, 공격자의 주요 공격 포인트가 된다. INSERT, UPDATE, DELETE는 운영 중인 서버에 데이터를 추가, 수정, 삭제하는 영향을 줄 수 있기 때문에 사용에 주의해야 한다. 다음은 데이터 조작어의 사용법이다. SELECT : 데이터베이스의 데이터를 조회하거나 검색하기 위한 명령어 INSERT : 데이터베이스에 데이터를 추가하기 위한 명령어 ■ SQL Injection Step 1. 개념 SQL Injection은 개발자가 설계한 쿼리문에 정상적인 SQL 구문이 아닌 악의적인 구문을 삽입(Injection)했을 때, 유효성 검증을 제대로 하지 않아 공격자의 의도대로 악의적인 SQL구문이 실행되는 공격이다. 웹 애플리케이션이 데이터베이스와 연동되어 있고 사용자가 입력한 값이 SQL 구문의 일부로 사용되는 환경에서 발생할 수 있다. 취약점은 사용자가 입력하는 로그인 또는 검색 기 등의 입력 폼에 SQL의 문법적 의미를 갖는 홑따옴표(') 입력 시 아래 그림과 같이 SQL 에러 메시지를 반환한다면 SQL Injection 공격이 가능한 것으로 판단할 수 있다.래는 일반 사용자가 웹 사이트에 등록된 자신의 아이디와 비밀번호로 로그인하는 과정에서 사용자 입력 값인 아이디와 패스워드가 서버 측의 SQL 구문에서 어떻게 동작하는지를 나타낸 것이다. 데이터베이스의 MEMBER 테이블의 값과 사용자가 입력한 아이디와 비밀번호가 일치하는 경우 정상적으로 로그인이 완료된다.래는 일반 사용자가 웹 사이트에 등록된 자신의 아이디와 비밀번호로 로그인하는 과정에서 사용자 입력 값인 아이디와 패스워드가 서버 측의 SQL 구문에서 어떻게 동작하는지를 나타낸 것이다. 데이터베이스의 MEMBER 테이블의 값과 사용자가 입력한 아이디와 비밀번호가 일치하는 경우 정상적으로 로그인이 완료된다. [SQL 문법 오류로 인한 에러 메시지] 아래는 일반 사용자가 웹 사이트에 등록된 자신의 아이디와 비밀번호로 로그인하는 과정에서 사용자 입력 값인 아이디와 패스워드가 서버 측의 SQL 구문에서 어떻게 동작하는지를 나타낸 것이다. 데이터베이스의 MEMBER 테이블의 값과 사용자가 입력한 아이디와 비밀번호가 일치하는 경우 정상적으로 로그인이 완료된다. 아래는 공격자가 관리자의 아이디인 admin의 존재를 알고 비밀번호는 모를 때 SQL Injection을 통해 로그인하는 과정이다. 아이디 입력 값으로 [admin' --]을 입력하고 비밀번호는 임의의 값인 [1111]을 입력하는데, 이때 아이디 입력 값의 특수문자가 SQL 문법으로 작용하여 홑따옴표(') 이후의 주석인 --으로 인해 비밀번호를 검증하는 부분이 주석 처리된다. 따라서 관리자 계정을 알고 있는 공격자는 임의의 비밀번호를 입력해도 admin 계정으로 로그인이 가능해진다. 이렇듯 공격자는 SQL Injection을 통해 로그인을 우회할 수 있으며, 데이터베이스 조작 및 유출, 시스템 명령어 실행 등 데이터베이스에 직접적인 영향을 주는 공격을 할 수 있다. SQL Injection의 개요를 살펴보았다. SQL Injection 취약점이 있을 경우, 공격자가 직접적으로 데이터베이스를 공격하여 중요 정보를 조회하고 탈취할 수 있으므로 개발자는 취약점이 발생하지 않도록 개발해야 하고, 진단자는 취약점 진단 시 누락 없이 찾는 것이 중요하다. 이 콘텐츠의 저작권은 ㈜SK쉴더스에 있으며 영리적, 개인적 사용, 무단 수정을 금합니다. COPYRIGHT ⓒ 2021 SK SHIELDUS. All Rights Reserved.
|
이전 글 | [Special Report] 웹 취약점과 해킹 매커니즘 #1 개요 |
다음 글 | [Special Report] 웹 취약점과 해킹 매커니즘 #3 UNION SQL Injection |
Q. 이 페이지에서 제공하는 정보에 대하여 어느 정도 만족하셨습니까?
평균 4.3점 / 39명 참여