웹해킹 전체 세션 때 배웠던 내용을 떠올리며 다시 한 번 SQL Injection의 기본 개념과 기본 문법을 정리해 보았다!
- NoSQL
관계형 데이터베이스: 데이터를 열과 행의 구조로 테이블 형태로 데이터를 보관
- SQL Injection이란?
이 데이터베이스에 전송되는 SQL 쿼리문을 조작
=> 데이터를 변조 / 허가되지 않은 정보에 접근
예를 들자면,
$id = $_REQUEST['id'];
// 사용자가 ID를 입력
$query = "SELECT name, email FROM users WHERE id = '$id';";
// 해당 아이디를 검색, 있다면 결과를 사용자에게 전송
와 같이 입력되지만,
SELECT name, email FROM users WHERE ID='1' or '1'='1';
// WHERE 문이 항상 true가 되어버림
// 데이터베이스 내의 모든 사용자의 정보가 노출된다
SELECT name, email FROM users WHERE id = '1' UNION SELECT name, pw FROM users#'
** UNION: 2개 이상의 쿼리를 한번에 요청하여 그 결과를 하나의 테이블에 합쳐서 출력해주는 연산자
- SQL 공격 기법의 종류
: 논리적 에러를 이용한 방법
상단의 경우와 같이 OR 1=1 --
이라는 내용을 주입하였다.
// OR 1=1 => WHERE 절을 모두 참으로 만듦.
// -- => 구문을 주석처리함.
와 같은 종류가 더 존재하나, 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 구문을 사용해 보면,
전체 사용자의 정보가 출력된다.