Web

SQL injection이란? (with Dreamhack)

HackHiJack 2022. 2. 28. 21:43
728x90
반응형

오늘은 드림핵에 있는 강의 내용을 요약하면서, sql injection에 대해서 알아볼 것이다.

 

1. DATABASE (DBMS)

먼저 sql injection을 배우기 전에 먼저 database지식이 있어야 한다.

 

Database는 일상생활에서 여러 가지 정보를 컴퓨터에 기록하는 데 사용한다.

그리고 이를 관리하는 것이 DBMS라고 하는 것이다.

 

Database에 저장된 내용을 이용하여 수정, 삭제, 기록을 하는 것이 DBMS이다.

 

DBMS는 관계형(Relational), 비관계형(Non-Relational) 으로 크게 나누어진다.

 

Relational Database : Table 형식,  EX. MySQL, MariaDB, PostgreSQL, SQLite

Non-Relational Database : {Key: Value} 형식 EX. MongoDB, CouchDB, Redis

 

 

이번에는 관계형 데이터베이스에 초점을 두고 설명을 해볼 것이다.

 

먼저 관계형 데이터베이스는 "RDBMS"라고 한다.

RDBMS는 Table형식으로 데이터를 관리한다.

그리고 이를 조작할수 있는 SQL이라는 관계연산자를 제공한다.

 

SQL은 3개로 나뉜다.

DDL : 데이터를 정의한다. 데이터베이스(스키마)를 생성, 삭제, 수정 등을 한다. 
DML : 데이터를 조작한다. 데이터베이스 내부의 데이터를 생성, 삭제, 수정 등을 한다.
DCL : 데이터베이스 안의 설정을 위한 것이고, 접근 권한을 주는 행위 등을 한다.

 

DDL

CREATE를 이용하여 Database 혹은 Table 생성

 

Database(schema) 생성

CREATE DATABASE[db_name];

 

Database(schema) 사용

USE [db_name];

 

Table 생성

CREATE TABLE [table_name](
	idx INT AUTO_INCREMENT,
	boardTitle VARCHAR(100) NOT NULL,
	boardContent VARCHAR(2000) NOT NULL,
	PRIMARY KEY(idx)
);

 

 

DML

데이터 생성 : INSERT

INSERT INTO [Table_Name](boardTitle, boardContent, createdDate) Values( 'Hello', 'World !', Now() );

데이터 조회 : SELECT

SELECT * FROM [Table_Name];

데이터 수정 : UPDATE

UPDATE [Table_Name] SET boardContent='DreamHack!' Where idx=1;

데이터 삭제 : DELETE

DELETE * FROM [Table_Name];

 

이쯤에서 광고한번 클릭해주세용~~^^

반응형

 

2. SQL injection

이제 본격적으로 sql injection에 대해서 알아보겠다.

 

SQL injection 이란, 사용자가 SQL 구문에 임의의 문자열을 넣어서 조작하는 것이다.

이를 이용해서 쿼리 인증을 우회하거나, 데이터베이스 내의 정보를 탈취할 수 있다.

 

예를 들어, 아래와 같은 sql구문이 있다고 가정해보자.

SELECT * FROM accounts WHERE user_id='HHJ' and user_pw='password'

이 뜻은 accounts 테이블에서 user_id가 HHJ이고 user_pw가 password인 정보를 가져온다는 것인데, 이를 쿼리 인증 우회를 하여 user_pw가 뭔지 상관없이, 아래처럼 user_id가 HHJ인지만 확인하고 정보를 가져오게 할 수 있다.

SELECT * FROM accounts WHERE user_id='HHJ'

 

이제 드림핵 실습을 통해서 예제를 살펴보겠다.

SQL 구문에서 문자열을 나타내는 것이 " , ' 에 따라 다르게 sql injection을 할 수 있다.

드림핵의 예제는 아래와 같다.

위처럼 로그인을 할 수 있는 폼이 있고, 아래에 SQL 구문이 입력에 따라 어떻게 달라지는지 확인할 수 있다.

그리고 SQL 쿼리 실행을 하면 SQL 구문이 실행된 결과를 보여준다.

 

아래는 예제에서 사용할 user_table이다.

1. 쿼리 인증 우회

첫 번째로 admin계정을 비밀번호 없이 로그인하는 방법에 대해 알아볼 것이다.

 

일단, 두 가지 방법이 있다.

 

- admin'or'1

첫 번째 조건은 uid가 “admin”인 데이터, 두 번째 조건은 이전의 식이 참(True)이고, upw가 없는 경우이다.

 -admin'--

where를 uid까지만 받고 upw를 받는 부분은 -- 혹은 #을 이용하여 주석 처리한다.

 

2. admin 비밀번호 획득하기

admin 비밀번호를 알아내기 위해서는 데이터베이스를 다시 조회해야 한다.

그런 기능이 있는 sql구문 중 하나가 union이다. 아래와 같은 형식으로 사용하면 된다.

SELECT[1] ~~~ UNION SELECT[2] ~~~

그러면 앞부분에 uid를 출력하는 첫 번째 select를 아무것도 입력하지 않아서 출력을 막고 뒤에 union구문을 넣어서 공격을 시도하면 된다.

728x90
반응형