[DVWA 실습] SQL Injection

SQL Injection


 

SQL Injection 이란?

 SQL Injection 은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL 문을 실행되게 함으로써

데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법이다. 주로 사용자가 입력한 데이터를 제대로

필터링하지 못한 경우에 발생한다. 공격 난이도는 비교적 쉬우나, 공격이 성공한다면 피해가 상당하기 때문에

보안 위협 1순위로 불릴만큼 중요한 기법이다.

 

 

SQL Injection 의 특징

  • 대소문자를 구분하지 않는다.
  • 고유의 값은 따옴표로 감싼다.
  • 객체를 나타낼 때는 백틱 (`) 으로 감싼다.
  • 세미콜론으로 끝낸다.
  • 한 줄 주석의 경우 문장 앞에 ' -- ' 를 붙여서 사용한다.
  • 여러 줄의 주석은 /* */ 로 감싼다.

 

 

SQL Injection 의 종류

1) Error based SQL Injection

 가장 대중적인 기법으로, SQL 쿼리에 고의적으로 오류를 발생시키고 그로 인해 출력되는 에러의

내용을 이용하여 필요한 정보를 찾아내는 공격 기법을 말한다.

 

2) Union based SQL Injection

 공격자가 Union을 이용하여 원래의 요청에 추가 쿼리를 삽입하여 얻어내는 방식을 말한다.

Union은 2개 이상의 쿼리를 요청하여 결과를 얻은 SQL 연산자를 말한다.

Union 쿼리는 2개의 테이블이 동일한 필드 개수와 데이터타입을 가지고 있어야한다.
즉, 사전 정보가 필수적이다.

 

3) Blind based SQL Injection

 에러가 발생하지 않는 사이트에서 데이터베이스로부터 특정한 값이나 데이터를 전달받지 않는 상황에서,참과 거짓의 정보만 알 수 있을 때 사용하는 공격 기법을 말한다. limin, SUBSTR, ASCII 등을 사용하여조건이 참이면 페이지가 정상적으로 출력되고, 거짓일 경우 출력되지 않음으로 구분이 가능하다.

 

4) Stored Procedure based SQL Injection

 저장 프로시저 (Stored Procedure) 에 대한 접근 권한을 가짐으로써 실행되는 공격 기법이다.

저장 프로시저 (Stored Procedure) 는 편의를 위해 일련의 쿼리들을 모아 하나의 함수처럼 모아둔 것을 말한다.

 

공격자가 시스템 권한을 획득해야 하므로 공격 난이도가 높으나, 성공한다면 서버에 직접적인 피해를 입힐 수 있다.

 

5) Mass SQL Injection

 한 번의 공격으로 다량의 데이터베이스를 조작하여 큰 피해를 입히는 공격 기법을 말한다.

 

 

 

대응 방안

1) 입력값 검증

 사용자의 입력을 받을 때 데이터베이스 쿼리에 동적 영향을 주는 경우, 입력된 값이 개발자가 의도한 값인지 검증한다.

  • ', ", #, --, = 등 특수문자와 명령어를 필터링
  • 데이터 길이 제한

 

2) 저장 프로시저 사용

 저장 프로시저를 사용하여 지정된 형식의 데이터가 아니면 쿼리가 실행되지 않도록 한다.

 

3) 서버 보안

  • 데이터베이스의 권한을 제한한다.
  • 신뢰 가능한 네트워크와 서버에 대해서만 접근을 허용한다.
  • SQL 서버 오류 발생 시 해당하는 에러 메세지를 확인할 수 없도록 한다.

 


 

[DVWA 실습]

 

[ Low ]

1) 작은 따옴표 ' 를 이용한 인증 우회

DVWA SQL Injection 탭

 

SQL Injection 탭에 들어오면 User ID 를 입력할 수 있는 칸을 확인할 수 있다.

 

Low 레벨 소스 코드

 

소스 코드를 확인해보면 id 가 싱글 쿼터 (' ') 로 감싸져 있는 것을 알 수 있다.

 

 

1을 입력했을 때 화면

 

User ID 에 1을 입력하고 Submit 을 누르면 아이디의 First name 과 Surname 이 출력된다.

 

 

SQL Injection 코드

 

SQL 구문의 where 문을 우회할 수 있는 or  연산자와 항상 참이되는 값인 1=1 을 입력하여 보겠다.

 

공격이 성공적으로 작동한 모습

 

DB에 저장된 모든 계정의 First name과 Surname이 출력되는 모습을 확인할 수 있다.

 

 이 코드를 통해 DBMS에 SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1';  이 전송되었다.

해당 코드는 OR 논리 연산자와 항상 참이 되는 값인 '1'='1' 을 이용하여 WHERE 구문에 입력된 조건 자체를 무효화시켜

해당 테이블에 저장된 모든 정보들이 출력된 것이다.

즉, SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1'; 구문이 되어버린 것이다.

 

 

 

2) Union based SQL Injection

 

Union SQL Injection 은 Union 함수를 사용하여 원하고자 하는 정보를 조회하는 데 사용된다.

예를 들면 "SELECT <절> Union SELECT <절>" 과 같이 말이다.

다만, 주의해야할 점이 한가지 존재한다. 바로 컬럼 수를 일치시켜야 한다는 점이다.

때문에 먼저 order by 함수를 통해  컬럼의 개수를 확인해야한다.

 

order by 함수 사용

오류 발생 X

 

오류 발생 X

 

3번째 컬럼 조회시 발생한 오류

 

 

3번째 컬럼을 조회했을 때 오류가 발생하는 것으로 보아 해당 DB는 컬럼 수가 2개인 것을 알 수 있다.

 

 

데이터베이스 이름 조회

 

' UNION SELECT schema_name, 2 from information_schema.schemata #

 

UNION 함수를 사용하여 데이터베이스 이름을 조회하였다.

 

dvwa 데이터베이스 내 테이블

 

' UNION SELECT table_name, 2 from information_schema.tables where table_schema='dvwa' #

 

dvwa 데이터베이스의 테이블을 조회한 결과, guestbook, users 테이블이 존재하는 것을 알 수 있다.

 

users 테이블 컬럼 조회

 

' UNION SELECT column_name, 2 from information_schema.columns where table_schema='dvwa' and table_names='users' #

 

users 테이블의 컬럼을 조회해 본 결과다.

 

 

유저 정보 조회하기

 

' UNION SELECT user, password from users #

 

테이블과 컬럼 정보를 알아냈기 때문에, 유저 정보를 조회할 수 있었다.

 

 

 

[ Medium ]

< 이후 실습 예정 >

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[ High ]

< 이후 실습 에정 >

 

 

 

 

 

 

'Web-Hacking > DVWA' 카테고리의 다른 글

[DVWA 실습] CSRF  (0) 2024.01.21
[DVWA 실습] DOM based XSS  (0) 2024.01.14
[DVWA 실습] Reflected XSS  (0) 2024.01.12
[DVWA 실습] Stored XSS  (0) 2024.01.12