본문 바로가기
정보보안/Web Hacking

SQL Injection을 위한 SQL기초 구문 모음

by 우동이 2020. 8. 6.
300x250

▶SQL Injection

Injection ▶ 주입, 삽입하다

SQL ▶ 데이터베이스 관리용 언어

 

SQL Injection ▶ OWASP 10대 웹 취약점 2020년 기준으로

1순위(Injection)에 기재될 정도로 단순하고 강력한 공격법

 

 

SQL의 단위 : 테이블(정보가 속해있는), 열(정보)

테이블

 

테이블 내의 열들

 

 


1. DB생성 & 주석 문 CREATE DB

CREATE DATEBASE testDB;
--주석

testDB라는 DB를 생성(Create) 하는 구문입니다.

 

2. DB 사용 USE

USE testDB;

생성된 testDB를 사용(Use)선언을 합니다.

 

3. 테이블 생성 후 값 넣기 CREATE TABLE

CREATE TABLE testTable(
    data1 INT, PRIMARY KEY,
    data2 DATETIME,
    data3 VARCHAR(20)
);

testDB에 속한 testTable생성 후 값 넣기

[data이름 , 자료형, 키 지정(Primary key, foreign key)]

 

Primary Key(기본키) : 다른 레코드들과 구별되는 유일한 값을 가지는 필드에 대해 설정해줍니다.

NULL값 일수 없으며(개체 무결성) 테이블상에서 첫 번째에 위치하는 주요한 (고유한) 값

즉 테이블에 존재하는 고유한 기본키라고 보시면 됩니다.

 

Foreign Key(외래 키) : 테이블 간의 관계 설정 시 다른 테이블의 기본키에 해당되는 자신 테이블의 필드에 설정

즉 타 테이블의 기본키를 참조한 자신의 테이블의 키라고 이해하면 됩니다.

 

4. 값 삽입 INSERT문

INSERT INTO testDB
VALUES(10,2020-12-25,"배고파");

생성된 testTable에 정보를 삽입해줍니다.(int,datetime,varchar) 세가지 타입의 값을 

생성된 data1, data2, data3 각 세개의 컬럼에 값을 넣어줍니다.

 

5. 값 조회 SELECT 문

SELECT * FROM testDB; --testDB의 모든 쿼리 조회
SELECT data1, data3 FROM testDB; -- testDB의 data1,data3 컬럼만 조회

첫번째 구문 : testDB의 모든 쿼리를 조회합니다.

두번째 구문 testDB의 data1,data3 컬럼만 조회합니다.

SELECT 조회 구문은 SQL 사용을 하던 웹 해킹을 하건

어떤 상황에서도 자주 쓰이는 명령어이며

조회에 여러가지 조건을 추가해 더 세밀한 조회를 수행할 수 있습니다.

 

6. 값 수정 UPDATE 문

UPDATE testDB --testDB의
SET data1 = 30; -- 모든 data1를 30으로 변경

UPDATE testDB --testDB의
SET deptno = 99; -- 값이 2020-08-05인 data2의
WHERE data2 = 2020-08-05; --deptno를 99로 변경

 

말 그대로 수정되어야 할 값을 변경해줍니다.

SELECT문과 동일하게 조건을 추가할 수 있습니다.

두번째 UPDATE 구문에서는 WHERE 구문으로 조건이 추가되었습니다.

 

7. 값 조회 및 수정 시 조건 추가 WHERE문

SELECT * FROM testDB
WHERE deptno = 99;  -- testDB에서 deptno가 99인 레코드의 정보를 전부 조회

SELECT * FROM testDB
WHERE deptno = 99 AND data2 NOT NULL; -- testDB에서 deptno가 99이고 data2가 공백이 아닌 경우 조회

 

'AND', 'OR', 'NOT', 'IS' 등 여러 연산자를 통해

레코드 조회나 값 수정 시 조건을 추가하여 사용 가능합니다.

 

8. 쿼리문을 합쳐 기능시키는 UNION, UNION ALL문

SELECT * FROM testDB UNION SELECT * FROM testDB2;

 

UNION과 UNION ALL은 같은 기능을 수행하지만

결정적으로는 중복 값을 출력&제거 함에 있어 차이점이 존재합니다.

UNION -> 중복값을 제거해서 출력

UNION ALL -> 중복 값도 전부 출력

가상으로 생성된 testDB2가 있다고 가정할 때 testDB와의 합집합을

UNION을 통해 출력할 수 있다

※UNION 수행 시 칼럼명이 동일해야 하며 칼럼 별의 데이터 타입이 같아야 합니다.

 

|| SQL 문자열

SELECT data1 || data2 FROM testDB;
SELECT data1 ||'~'|| data2 FROM testDB; -- ||내의 둘의 사이에 붙을 문자열을 적는것도 가능

|| 쌍파이프를 통한 SQL Injection 우회 구문

|| 사이에 문자를 넣어 우회합니다.

 


-SQL Injection의 기초 개념-

다음은 SQL Injection의 기초 개념에 대해 알아보겠습니다.

보안이 취약한 홈페이지의 로그인 창

이건 어디까지나 sql injection을 수행하기 위한 기초적인 개념 설명에 불과합니다.

실제 운영되는 웹사이트의 경우(개인,기업) 수준에 따라

보안과 환경이 천차만별이며

결국 그에 맞는 공격코드를 짜는것은 쉽지 않습니다.

게다가 우리가 배운 대부분의 코드나 실습은

이미 발견되어 패치가 완료된 취약점이기 때문에

이미 알려진 코드를 통해 해킹하는것은 불가능에 가깝습니다.

 

물론 보안 수준이 현저히 낮은 개인 웹사이트 같은 경우에는

가능할수도 있지만.

 

아무튼 위 사진에 나와있는 게시판은 

보안이 아주 취약한 개인 홈페이지의 로그인 창이라고 가정합니다.

해당 사이트의 관리자 계정 ID가 admin이라고 또 가정합시다.

 

그러면 우리는 admin이라는 ID값 하나는 알고 있지만

패스워드 값은 모르는 상태가 됩니다.

 

이러한 경우 ID/PW 전부 참값을 만들어야 하는 인증 과정에서

이미 참값인(알고있는) ID값과

모르고 있는 패스워드 값을 참값으로 만들어주는 코드를

[삽입] 하게 됩니다.

'1 or '1' = 1' 이라는 코드는 논리적으로 TRUE, 참값입니다.

해당 코드가 웹사이트에 들어가 동작하게 되면

아래와 같은 구문의 구조로 동작합니다.

더보기

"SELECT * FROM tablename WHERE

id = 'admin' and password = '1' or '1' ='1'"

이렇게 되면 id,password 전부 참값이 되어

SQL Injection이 수행됩니다.

 

300x250

댓글