HOW TO HACK/Basics

해커라면 알아야 할 리눅스 기초-13 : MySQL 다루기

Mr. Rootable 2016. 4. 27. 15:01

# 본 게시글은 작성자 본인의 스터디한 내용을 바탕으로 작성된 글입니다.


# 본 게시글에는 일부 잘못된 정보가 포함되어있을 수 있습니다.


# 이 글을 열람하는 것은 위 사항에 동의하는 것으로 간주합니다.


# 잘못된 정보에 대한 예의바른 태클 및 지적질 적극 환영합니다.



이번 포스팅에서는 MySQL을 다뤄볼까 합니다.

기억하실지 모르겠지만 MySQL은 이미 지난 포스팅에서 설치했었습니다.

LAMP(Linux + Apache + MySQL + PHP) Stack!!! 기억나시죠?

기억이 안나시는 분은 아래 링크된 글을 다시 읽어주세요.


   해커라면 알아야 할 리눅스 기초-10 : 아파치 웹서버(Apache Web Sever) 설치


Step 1 : MySQL이란?




MySQL은 1995년에 처음 발표되었고, 전 세계적으로 가장 많이 사용되고 있는 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다.

오픈소스.. 즉, 무료라는 말입니다. 단, 상업적인 목적으로 MySQL을 사용하려면 라이선스 구매를 해야 하니 꼼꼼히 살펴보시길 바랍니다.

대부분 PHP, 아파치 웹서버와 함께 구성하여 웹서비스에 사용되고 있죠.


Step 2 : MySQL 실행


칼리리눅스 2.0에서 MySQL을 실행하려면 "프로그램-Usual Applications" 메뉴에서 "mysql start"를 실행하면 됩니다. 



좀 기다리면 터미널창이 자동으로 하나 뜹니다.


MySQL을 실행하는 또 다른 방법은 터미널에서 아래 명령어로 MySQL 서비스를 시작하면 됩니다.


# service mysql start



정상적으로 MySQL이 시작되었다면 mysql 명령어 실행 시 아래 스크린샷과 같이 MySQL monitor에 진입이 됩니다.


# mysql



Step 3 : MySQL에 로그인(Log-In)하기


로그인은 mysql 명령어를 통해 가능합니다. Step 1에서와 같이 mysql 명령어으로만으로도 접속이 가능하지만

주로 사용되는 방법은 아래와 같습니다.


사용법 : mysql -u 사용자명 -p [대상DB]


시스템에 설치된 MySQL에 한번 로그인해봅시다. 로컬이므로 대상 DB는 따로 지정하지 않았습니다.


# mysql -u root -p



패스워드를 물어보네요. MySQL을 설치할 때 따로 패스워드를 설정하지 않았다면 패스워드가 없을 겁니다.

패스워드를 입력하라 그래도 당황하지 말고, 그냥 Enter~~ 

MySQL 설치단계에서 root의 패스워드를 설정했다면 설정한 패스워드 입력 후 Enter!!



나를 반기는 Welcome to the MySQL monitor!!! 문구가 보이면서 mysql> 프롬포트가 나옵니다.


사실상 위의 접속 명령어는 로컬 MySQL Database로 접속할 때 사용됩니다.

즉, mysql -u [사용자명] -p [대상DB]에서 [대상DB]를 생략하면 로컬로 간주합니다.

원격 Database에 접속할 때는 [대상DB]에 접속하려는 Database서버의 호스트명이나 IP주소를 아래처럼 지정해주어야 합니다.


# mysql -u root -p 192.168.0.3


Step 4 : 데이터베이스 조회 및 연결하기


로그인을 성공적으로 했다면, 어떤 데이터베이스가 있는지 살펴봅시다.


mysql > show databases;



기본으로 3개의 데이터베이스가 있습니다.

찾은 데이터베이스 중에 원하는 데이터베이스에 연결하려면 use 명령어를 사용합니다.


 use [Database명]


아래 명령어를 통해 mysql 데이터베이스로 연결을 해봅시다.


mysql> use mysql;



스크린샷과 같이 'Database changed'라는 문구와 함께 mysql Database로 연결되었음을 알려줍니다.


참고로, 데이터베이스 삭제는 drop database 데이터베이스명; 명령을 사용한다.


Step 5 : 테이블 생성 (create)


이후의 테이블 명세보기, 데이터 조회의 설명을 위해 임시로 테이블을 만들어 봅시다.

테이블 생성은 다음과 같은 SQL 쿼리문을 통해 생성할 수 있습니다.


 create table 테이블이름 (

 컬럼명1 데이터유형 primary key,

 컬럼명2 데이터유형 not null,

 컬럼명3 데이터유형);


primary key는 테이블안의 레코드를 유일하게 식별할 수 있는 컬럼으로 지정하기 위한 것이며,

not null은 해당 컬럼에 null값이 저장되지 않게 제한하는 기능을 합니다.

not null 조건이 필요한 컬럼에 선택적으로 사용하시면 됩니다. 테이블 생성을 위한 MySQL 쿼리문은 다른 서적이나 문서를 참고하시길 바랍니다.


members라는 테이블을 하나 만들어봅시다.



Query OK!! 테이블 생성 쿼리가 잘 실행되었다는 뜻입니다.

그럼 이제 mysql 데이터베이스안의 테이블을 볼까요? show tables 명령으로 볼 수 있습니다.

방금 생성한 members 테이블이 있겠죠?


mysql > show tables;



어휴~ 많네요^^ 

스크린샷을 보시다시피 members 테이블이 생성되어있습니다.

테이블 목록을 뽑아봤으니, 특정 테이블을 하나 골라 테이블 명세를 봐야겠죠?

테이블 명세를 보면 어떤 컬럼이 있고, 각 컬럼의 데이터유형은 어떤 것인지 알 수 있겠죠?

테이블 명세를 보는 명령은 describe 입니다.

members 테이블을 들여다보겠습니다.


Step 6 : 테이블 명세보기 (describe)


mysql> describe members;



create문을 통해 생성한대로 4개의 컬럼이 보이네요.

새로 만든 테이블이기 때문에 아직 테이블안에 데이터는 없습니다.


Step 7 : 데이터 삽입 (insert)


이제 members 테이블에 데이터를 insert하고, 테이블안에 있는 데이터를 select문을 통해 조회해보도록 하겠습니다.


데이터를 insert하기 위한 SQL쿼리 구문 형식입니다.


  insert into 테이블이름 (컬럼명1, 컬럼명2,...... 컬럼명n) 

  values (컬럼명1의 값, 컬럼명2의 값,..... 컬럼명n의 값); 



insert 쿼리문은 잘 실행되었네요.

그럼 삽입한 데이터가 테이블에 저장되어있는지 확인해볼까요?


Step 8 : 데이터 조회 (select)


테이블을 조회하기 위한 SQL쿼리는 select-from-where를 사용합니다. 

형식은 아래와 같습니다.


select 컬럼1, 컬럼2, ... 컬럼n

 from 테이블명

 where 사용할 조건;


쿼리를 구성하여 members 테이블의 데이터를 조회해봅시다.



브라보~ members 테이블에 저장되어있는 아까 insert한 데이터가 잘 출력됩니다.

근데.. 이상하죠? 제가 insert를 할 때 테이블의 memberid의 컬럼이 char(4) 데이터유형인 것을 무시하고, mrrootable이라는 컬럼의 데이터길이보다 긴 값을 insert 했었습니다. 컬럼의 길이를 초과하는 문자는 잘려서 저장되지 않은 것을 보실 수 있습니다. 

오라클 데이터베이스에서는 오류 나던데 MySQL은 컬럼이 허용하는 길이까지만 insert되나 봅니다.


Step 9: 데이터 Export 하기 (mysqldump)


mysqldump 명령어를 통해 특정 테이블의 데이터를 덤프할 수 있습니다.

아래 명령어를 실행해보세요.


# mysqldump --tab=/tmp --user root -p mysql members;




/tmp 디렉토리안에 members.txt 파일이 생성되었습니다. 파일의 내용을 보니 제대로 덤프되었네요.



지금까지 MySQL 로그인 및 데이터베이스 관련 명령을 살펴보았는데요.

임시로 테이블을 만들어서 보여드렸지만, 해커에 의해 DB서버가 장악당했고, 그 DB서버에 매우 민감한 정보가 있다면 해커는 위에 설명드린 방법을 통해 데이터베이스 및 테이블, 컬럼 정보를 알아내고, 그 안의 데이터를 절취할 수 있을 겁니다. <끝>