백박스 리눅스를 활용한 모의 침투 — 7장(1)

Yu Jin Yang
Quantum Ant
Published in
7 min readSep 3, 2019

7장 SQL 삽입 공격 원리와 실습(1)

책 사진

INDEX

  1. SQL 삽입 공격
  2. 실습 전 사전설정

1.SQL 삽입 공격

SQL 삽입 공격(SQL Injection)이란?

SQL 문장에 고의로 논리적 오류를 유발시켜 데이터베이스를 비정상적으로 조작하는 기법을 말한다.

인증 과정에서 신뢰할 수 없는 데이터를 제대로 차단하지 못했을 경우, 서버의 데이터베이스를 공격할 수 있는 공격방식이다.

보안회사 Imperva가 2012년에 발표한 보고서에 따르면 월평균 4회가량의 SQL 삽입 공격이 일어날 정도로 웹 분야에서 광범위하게 일어나는 공격이다.

2. 실습 전 사전 설정

본격적으로 SQL 삽입 공격을 진행하기 전에는 사전에는 설정해야 하는 사항들이 있다.

[그림7–1]

apt-get install mysql-server mysql-client

SQL 삽입 공격 원리를 확인하고 실습을 진행하기 위해서는 My-SQL 서버가 필요하다. 따라서 위 명령어를 통해 My-SQL 서버를 설치한다.

[그림7–2]

mysql -u root -p

설치가 끝나면 위 명령어를 입력해서 my-sql 서버에 접속한다.

그러면 [그림7–2]처럼 비밀번호를 입력하라고 뜨는데 이 부분에는 예전에 백박스 초기 설정할 때 입력했던 사용자계정의 비밀번호를 입력하면 된다.

위 링크의 [그림1–30]부분에서 설정한 비밀번호이다.

[그림7–3]

create database injectiond;

injectiond라는 이름의 데이터베이스를 새롭게 생성한다.

[그림7–4]

use injectiond;

[그림7–3]에서 생성한 데이터베이스 injectiond를 사용하겠다는 의미이다.

exit를 이용해서 mysql을 끝낸 이후에 다시 접속했을 때, 위 명령어를 쓰지 않으면 데이터베이스 관련된 작업들을 수행할 수 없다. 그렇기 때문에 my-sql에 접속한 후 데이터베이스를 사용하기 전에 위 명령어를 입력하는 습관을 들이는 것이 좋다.

[그림7–5]

create table injectiont (num int(10) auto_increment primary key,

user varchar(20) not null,

passwords varchar(20) null

) engine=InnoDB default charset=utf8;

create 명령어를 사용해서 injectiond데이터베이스에 injectiont라는 테이블을 생성한다.

injectiont라는 테이블에는 num, user, passwords라는 Field가 형성된 것이다.

num

int(10) : 10자리 숫자까지 입력할 수 있는 int형이라는 의미이다.

auto_increment : 자동적으로 1씩 증가시킨다는 의미이다.

primary key : 데이터를 구분해주는 지표이다. 하나의 테이블은 하나의 primary key만 가질 수 있다.

users

계정 이름을 표시하는 필드이다.

varchar(20) :20자리 문자를 입력할 수 있는 varchar형이라는 의미이다.

Not null : 데이터에 null값이 들어가면 안 된다는 의미이다. 즉, 무조건 문자가 들어가야 한다는 의미이다.

passwords

계정 비밀번호를 표시하는 필드이다.

varchar(20) :20자리 문자를 입력할 수 있는 varchar형이라는 의미이다.

null : 데이터에 null값이 들어가도된다는 의미이다. paswords가 null이 가능한 이유는 계정에 비밀번호가 설정되지 않은 경우도 있기 때문이다.

[그림7–6]

desc injectiont;

[그림7–5]에서 생성한 injectiont 테이블 상태를 확인하는 명령어이다.

[그림7–7]

INSER INTO injectiont (user,passwords) VALUES (‘root’, ‘1234’);

INSER INTO injectiont (user,passwords) VALUES (‘odj’, ‘1234’);

INSER INTO injectiont (user,passwords) VALUES (‘tiger’, ‘1234’);

INSER INTO injectiont (user,passwords) VALUES (‘psw’, ‘1234’);

INSER INTO injectiont (user,passwords) VALUES (‘obyt’, ‘1234’);

INSERT 명령어를 활용하여 injectiont 테이블에 값을 입력해준다.

여기서 잠깐,

명령어가 갑자기 대문자로 되어 있어서 당황한 사람이 있을 것이다.

명령어 부분은 대소문자 구분이 없기 때문에 대문자로 써도 소문자로 써도 상관이 없다.

이렇게 사용하는 이유는 시각적으로 보았을 때 명령어로 대문자로 작성해주면 명령어와 변수가 명확하게 구분이 가기 때문이다. 이렇게 작성하는 것이 불편하다면 그냥 소문자로 작성해도 상관없다.

다만, 변수이름은 대소문자 구분이 있으니 명확하게 작성해주어야 한다.

[그림7–8]

SELECT * FROM injectiont;

SELECT 명령어를 이용하여 [그림7–7]에서 입력했던 데이터 값들을 출력할 수 있다.

여기서 SELECT 명령어 뒤에 있는 *은 전체를 의미한다.

즉, SELECT *라면 전체 데이터를 의미하는 것이다.

리눅스에서도 자주 사용하니 꼭 기억해두는 것이 좋다.

여기까지 하면 사전 정보 설정이 끝난다.

다음 시간에는 앞서 설정했던 것들을 바탕으로 SQL 삽입 공격의 원리에 대해 확인해 본 후 본격적인 실습을 진행할 것이다.

마치며..

이번 시간에는 SQL-삽입공격이 무엇인지에 대해 알고, 본격적인 실습에 필요한 설정을 진행하였습니다. 웹서버 등을 통해 My-SQL을 배우신 분들은 실습을 진행하면서 익숙함을 느끼셨을 것입니다.

처음 보신 분들도 MY-SQL이 복잡한 문법을 가지고 있지 않으니 무서워하시지 마시고,구글에 검색하면서 차근차근 실습을 진행하면 충분히 도움이 될 것이란 생각이 듭니다.

다음 시간에는 “SQL 삽입 공격(2)”에 대해 글을 올릴 것입니다.

[WARNING]

공부한 내용을 정리하는 글이라서 틀린 내용이 있을 수도 있습니다. 잘못된 내용이 있다면 망설이지 마시고 알려주세요!

읽어주셔서 감사합니다 :)

--

--