비트(bit)주세요

SQL Injection을 위한 SQL 본문

정보보안/웹보안

SQL Injection을 위한 SQL

yglee730 2021. 6. 2. 21:53
728x90

 

SQL Injection?

     : 악의적인 SQL문을 실행시켜 데이터베이스를 비정상적으로 조작하는 공격 방법

 

 

※ SQL Injection을 실습하기 전, 알면 좋은 몇가지

DML(Data Manipulation Language) : 데이터 조작어

          -> SELECT, INSERT, UPDATE, DELETE

 

DDL(Data Definition Language) : 데이터 정의어

          -> CREATE, ALTER, DROP, RENAME, TRUNCATE

 

DCL(Data Control Language) : 데이터 제어어

          -> COMMIT, ROLLBACK, SAVEPOINT

 

SQL Injection을 할때는 DML을 사용할 예정입니다.

DML의 명령어 SELECT, INSERT, UPDATE, DELETE의 사용법을 알아보겠습니다.

 

위에 나온 표를 하나의 table이라고 하며

표에서 num, depart, name, address, phone같은 것들을 column(컬럼)이라고 합니다. 

 

SELECT 기본 형식

    -> SELECT [출력할 것(컬럼)] FROM  [테이블이름];

            -> 이 테이블로부터 이런 컬럼을 출력(조회)할거다.

 

ex) SELECT * FROM Student;

       -> Student 테이블에서 모든 컬럼을 뽑아내라. ( * 은 전체라는 뜻입니다.)

 

INSERT 기본 형식

    -> INSERT INTO [테이블이름](삽입 할 값의 컬럼)

        VALUES(삽입할 값);

              -> 이 테이블의 이 컬럼에 이러한 값을 넣을거다.

 

ex) INSERT INTO student(num, depart, name, address, phone) 

     VALUES('2020201020', '보안', '김민식', '대전시','010-1234-5678');

        -> student 테이블에서 num, depart, name, address, phone 컬럼에

           '2020201020', '보안', '김민식', '대전시','010-1234-5678' 라는 값을 넣을거다.

 

UPDATE 기본 형식

      ->  UPDATE [테이블 이름] SET [바꿀 컬럼] = '[바꿀 값]' WHERE [바꿔질 컬럼] = '[바꿔질 값]';

 

ex) UPDATE Student SET depart = '컴퓨터공학' WHERE depart = 'ICT융합보안';

      -> Student 테이블에서 학과가 ICT융합보안인 사람의 과를 컴퓨터 공학으로 바꿀것이다.

 

DELETE 기본 형식

      -> DELETE FROM [테이블 이름] WHERE [삭제할 컬럼] = '[삭제할 값]';

 

ex) DELETE FROM Student WHERE name = '김민식';

      -> Student 테이블에서 이름이 김민식인 사람을 테이블에서 지우겠다.

 

두 개의 문장을 합쳐서 출력할 수는 없을까?

그러기 위해 UNION이 존재합니다.

두 개 이상의 문장을 합쳐서 출력하고 싶을 때 사용합니다.

 

출력문 사이에 UNION만 넣으면 됩니다

※ 단, 두 출력문의 출력 컬럼 수는 서로 같아야 합니다.

 

ex) SELECT num FROM Student UNION SELECT depart FROM Student;

모두 출력되었지만 테이블에 컬럼은 맨 처음 등장한 컬럼만 표시됩니다

 

두 출력문의 출력 컬럼 수를 다르게 한다면?

ex) SELECT num, name FROM Student UNION SELECT depart FROM Student;

문법오류가 납니다. 그래서 출력 컬럼의 수는 서로 같게 해주어야 합니다.

 

하지만 아무리 생각해도 더 출력할게 없다면?

아무거나 채우면 됩니다.

 

ex) SELECT num, name FROM Student UNION SELECT depart,'haha' FROM Student;

              -> num과 name에 있는 값을 출력하고

                  학과를 출력하는데 공란은 'haha'로 채운다.

 

ex) SELECT num, name FROM Student UNION SELECT depart,1 FROM Student;

              -> num과 name에 있는 값을 출력하고

                  학과를 출력하는데 공란은 1로 채운다.

 

공란을 조금 더 의미있게 채우고 싶다면?

 

database() : 현재 데이터 베이스의 이름을 출력시킴

user() : 현재 접속해있는 유저들을 출력시킴

now() : 현재시각을 출력시킴

 

ex) SELECT num, name, depart FROM Student UNION SELECT database(), user(), now(); 

            -> Student 테이블에서 num, name, depart를 출력하고

                현재 database이름, DB에 접속중인 유저, 현재 시각을 출력하라

지금까지는 데이터가 많이 없었지만 나중가면 많은 데이터가 존재하는 데이터베이스를 접하실겁니다.

그러면 겹치는 데이터도 많을텐데, 똑같은 것은 더 이상 보고 싶지 않을 땐, DISTINCT를 사용합니다.

 

SELECT DISTINCT [컬럼 이름] FROM [테이블 이름];

      -> 테이블에서 컬럼의 데이터 값을 출력하는데 겹치지 않게 출력해라.

 

SQL Injection할때 유용하게 쓰이는 단어 5가지

 - information_schema

 - information_schema.columns

 - table_schema

 - table_name

 - column_name

 

information_schema

  : MySQL에 존재하는 DB의 모든 데이터(메타 데이터)가 저장되는 데이터베이스

information_schema.columns

  : 모든 스키마의 컬럼이 들어있는 테이블

    컬럼 관점에서 모든 정보를 제공합니다.

 

스키마?

   : 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터의 집합.

   

    데이터베이스를 구성하는 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 및

    데이터 조작 시 데이터 값들이 갖는 제약 조건 등에 관해 전반적으로 정의합니다.

    

table_schema : 데이터베이스의 이름을 저장하는 컬럼

table_name : 테이블의 이름을 저장하는 컬럼

column_name : 컬럼의 이름을 저장하는 컬럼

 

 

'정보보안 > 웹보안' 카테고리의 다른 글

Blind SQL Injection  (0) 2021.06.04
SQL Injection  (0) 2021.06.03
Web Shell  (0) 2021.05.27
netcat과 포트포워딩  (0) 2021.05.23
방화벽  (0) 2021.05.22