본문 바로가기

SEC/DH

[WEB] SQL Injection #1

DBMS로 관리되는 데이터베이스에는 다양한 민감 정보가 포함되어 있다.

공격잔는 데이터베이스의 데이터 유출이나 SQL Injection과 같은 공격으로 데이터를 확보 및 악용할 수 있다.

따라서 데이터의 소유자 이외의 이용자가 해당 데이터에 접근할 수 없도록 해야한다.

 

인젝션(Injection) 공격

인젝션 공격은 사용자의 입력값이 애플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석되어 발생하는 취약점이다.

개발자가 정상적인 입력값이 아닌 비정상적인 입력값에 대한 적절한 예외처리나 필터링을 수행하지 않았을 때 발생한다.

 

SQL Injection

SQL은 DBMS에 데이터를 질의하는 언어이다. 개발자는 웹서비스 개발 시 사용자의 입력을 SQL 구문에 포함하여 요청하도록 개발할 수 있다. 예를 들어 사용자가 로그인 시 입력하는 ID/PW 값을 SQL 구문에 포함하여 데이터베이스에 질의할 수 있다. 

이러한 SQL 구문에 포함되는 입력값에 대해 임의 문자열을 삽입하는 행위를 SQL Injection이라고 한다.

SQL Injection이 발생하면 조작된 쿼리로 인증을 우회하거나, 데이터베이스의 정보를 유출할 수 있다.

 

Simple SQL Injection

user_table
---------------
uid    | upw
guest  | guest
admin  | ******
---------------

// 기존 SQL 구문 (로그인)
SELECT * FROM user_table WHERE uid='admin' and upw='';

// 우회 1
SELECT * FROM user_table WHERE uid='admin' or '1' and upw='';

// 우회 2
SELECT * FROM user_table WHERE uid='admin'--' and upw='';

 

SQL 구문에 대한 필터링이 없을 시 간단하게 SQL 쿼리를 조작하여 인젝션 공격을 수행할 수 있다.

 

우회 1에서는 조건문을 통해 uid='admin' 인 데이터와 이전 식이 참이고 upw=''인 데이터를 반환하게 한다.

upw=''인 데이터가 없으므로 uid='admin'인 데이터를 반환하여 관리자 계정으로 로그인이 가능하다.

 

우회 2에서는 uid='admin' --' 을 입력하여 뒷 부분을 주석으로 처리하여 관리자 계정으로 로그인이 가능하다.

환경에 맞는 주석(--, #, /**/) 을 사용하여 우회가 가능하다.

 

Blind SQL Injection

SQL Injection을 통해 개발자가 의도하지 않은 결과를 반환해 인증을 우회하는 것을 확인할 수 있다.

SQL Injection은 인증 우회 외에도 데이터베이스의 데이터 유출에 사용될 수 있다. 

웹서비스가 SQL 쿼리에 대한 참/거짓과 같은 정보를 응답할 때 공격자는 SQL 쿼리를 변조하여 데이터를 유출할 수 있다.

예를 들어 admin 계정의 패스워드의 첫글자가 'p'인가? 라는 SQL 구문에 대해 참/거짓 응답을 통해 첫글자에 대한 정보획득이 가능하다.

이처럼 SQL 쿼리 결과를 사용자가 확인하지 못하고 참/거짓 반환 결과로 데이터를 획득하는 공격을 Blind SQL Injection이라고 한다.

 

Blind SQL Injection

// 문자 → 아스키 변환 함수
ascii('a') // 97

// 문자열에서 지정한 위치부터 길이까지의 값 반환
substr(string, position, length)

substr('ABCD', 1, 1) = 'A'

// 첫 글자 질의
SELECT * FROM user_table WHERE uid='admin' and ascii(substr(upw,1,1))=97-- ' and upw=''; // False

 

위의 SQL문에서 첫 글자에 대해 a인가라는 질의를 했을 때 False라는 응답값을 통해 첫글자가 a가 아님을 알 수 있다.

이처럼 가능한 문자에 대한 질의를 반복수행하여 데이터 유출이 가능하다.

 

Blind SQL Injection을 수행하기 위한 질의를 수동으로 작성하는 것은 어렵기 때문에 파이썬을 통한 자동화 스크립트를 작성하여 공격하는 것이 효과적이다.

 

파이썬 HTTP 통신을 위한 requests 모듈

import requests
import string

#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
pw_chr = string.ascii_letters + string.digits + string.punctuation


url = "http://victim.com"

headers = {
	'Content-Type' : ' ~ ',
    'User-Agent' : ' ~ '
}

params = {
	'login' : 'admin'
}

data = {
	'uid' : 'admin',
    'upw' : 'admin'
}

# GET Method
res = requests.get(url, headers=headers, params=params)
print(res.text)

# POST Method
res = requests.post(url, headers=headers, data=data)
print(res.text)

 

파이썬에서 HTTP 통신을 위한 requests 모듈을 통해 payload를 작성하여 자동화된 공격 수행이 가능하다.

 

'SEC > DH' 카테고리의 다른 글

[WEB] XSS 우회 #2  (0) 2022.07.16
[WEB] XSS 우회 #1  (0) 2022.07.16
[REV] IDA 사용법  (0) 2022.07.13
[WEB] XSS (Cross Site Scripting) 테스트  (0) 2022.03.21