Web Study/Theory

SQL Injection 공격 기법

2023. 12. 25. 20:23

QUOTE THE DAY

Self-Talk
반응형

※ 본 내용은 공부 목적으로 작성된 내용입니다 ※ 잘못된 부분이 있으면 언제든지 댓글로 알려주세요!

 

SQL Injection

 

 

SQL Injection은 웹 서버와 데이터베이스의 소통 언어인 SQL 언어에 악성 SQL 문을 주입시켜 데이터베이스 안에 있는 데이터를 탈취할 수 있는 공격입니다

 

간단한 예시를 들어 설명하자면 우리가 클라이언트를 통해 웹 서버에 로그인 요청을 보낼 때 웹 서버는 요청 정보를 DB랑 소통하기 위해 '무사'의 비밀번호 1234라는 SQL 언어로 요청합니다 그러면 DB는 '무사'의 비밀번호 1234를 찾아 맞으면 웹 서버에게 맞다고 응답하여 클라이언트에 로그인이 정상적으로 작동되게 됩니다 이때 SQL Injection은 '무사'의 비밀번호 1234라는 SQL 언어에 '무사의 비밀번호를 1111로 변경해 줘 그리고 뒤에 문자는 무시해 줘'라는 코드를 주입시킬 수 있습니다

 

원본 : '무사'의 비밀번호 1234

주입 : '무사의 비밀번호를 1111로 변경해 줘 그리고 뒤에 문자는 무시해 줘'의 비밀번호 1234

 

결국 '의 비밀번호 1234'는 무시되니 '무사의 비밀번호를 1111로 변경해 줘 그리고 뒤에 문자는 무시해 줘'라는 SQL 문이 작동되게 됩니다 이후 DB에서 무사의 비밀번호가 1111로 변경됩니다 이런 식으로 SQL 문을 주입시켜 데이터를 변경하거나 추출할 수 있습니다

 

 

해당 개념을 바탕으로 SQL 언어로 논리적 취약점을 이용한 SQL Injection을 이해해 봅시다

 

[ 실제 SQL 쿼리 문 ]

select * from login where name='musa' and password = '1234'

//select : 데이터를 조회할 때 사용하는 구문
// * : 모든 정보
// login : 테이블 이름
// where : 조회할 데이터의 조건문으로 뒤에 오는 name은 id이며 이 id가 'musa'이고, password는 '1234' 일 때라는 조건문이다

해석 : login 테이블에 있는 모든 정보에서 name id가  'musa'이고 password가 '1234'인 데이터를 추출한다
SELECT 속성1,속성2 FROM TABLE이름 WHERE 조건문
( 이 구문에 로그인 정보가 맞으면 로그인이 성공하게 됩니다 )


↓ ↓  💉 SQL Injection 삽입 ↓ ↓

select * from login where name='musa' and password = 'or'1'='1

'or'1'='1은 (1=1) 1과 1이 같으므로 항상 참이 됩니다 결국 이 구문은 항상 참이므로 로그인이 성공하게 됩니다

위 쿼리문처럼 논리적 취약점을 이용해서 musa의 비밀번호가 없어도 로그인에 성공하게 됩니다

 


💉 Union based SQL Injection

 

SQL Injection의 종류인 Union based SQL Injection 공격 방법에 대해 설명하겠습니다

먼저 Union은 합치다는 의미인데 SQL 문을 하나로 합쳐 주는 것을 의미합니다

이 Union Injection이 성공하면 원하는 쿼리문을 실행할 수 있습니다 그러나 Union Injection을 성공하기 위해서는 두 테이블에 열(column) 개수와 데이터 형태가 같아야 합니다

 

 

①번 쿼리문은 Board라는 테이블에서 입력된 값이 title 혹은 contents 내용과 비교하여 테이블을 조회하는 쿼리문 입니다

 

②번 쿼리문은 ①번 쿼리문에 입력값을 Union과 함께 열(Column)을 맞춰 ①번 쿼리문에 넣습니다(현재 Union 쿼리문은 id와 password를 요청하는 쿼리문 입니다)

 

③번 쿼리문은 두 테이블이 합쳐 하나의 테이블로 보이게 됩니다 결국 사용자의 password 데이터가 게시글과 함께 화면에 출력됩니다 (FROM Users -- 구문은 Users 테이블 뒷부분부터 모두 주석 처리)

 

즉 Union based SQL Injection은 기존에 존재하는 쿼리문에 열(Column)과 데이터 형태가 같은 악성 쿼리문을 넣어 하나의 쿼리문으로 출력한다

 


💉 Blind based SQL Injection

 

Blind based SQL Injection은 Boolean based SQL Injection과 Time based SQL Injection으로 나뉘는데 Boolean based SQL Injection부터 설명하겠습니다

 

💊 Boolean based SQL Injection

 

Boolean based SQL Injection은 쿼리문을 삽입할 때 참과 거짓의 정보를 구분하기 위해 사용되는 기술입니다 주로 테이블 이름을 알아낼 때 사용됩니다

 

 

①번 쿼리문은 Users 테이블에 모든 정보에서 id가 'INPUT1'이고 password가 'INPUT2'인 값을 추출하는 쿼리문 입니다

 

②번은 테이블 이름을 알아내기 위해 'abc123'이라는 계정을 공격자가 미리 생성하여 아이디 값과 ASCII(SUBSTR(SELECT name From information_schema.tables WHERE table_type=’base table’ limit 0,1)1,1)) > 100 –의 악성 문법을 넣은 쿼리문 입니다

 

(이 쿼리문은 limit 키워드를 이용하여 하나의 테이블만 조회하게 하고, substr이라는 문자열 자르는 함수를 이용해 문자의 첫 글자를 가져와 아스키코드 값으로 변환하여 비교해 주는 쿼리문 입니다 만약 조회되는 테이블이 musa라면 이 문자에 'm' 자를 아스키코드 값으로 변환하여 100이라는 범위에서 비교하게 됩니다 거짓이면 실패이고, 참이면 다음 'u' 문자도 마찬가지로 100 범위를 조정해서 똑같은 방식으로 테이블 이름을 찾아낼 수 있습니다 여기서 지난 시간에 다룬 이진 탐색 개념을 활용할 수 있습니다) - MySQL 문법일 때 사용이 가능하고 DBMS 종류에 따라 문법이 달라집니다

 

③번은 ②번 악성 쿼리문을 ①번 쿼리문 'INPUT1' id 위치에 주입시켰습니다

 

 

💊 Time based SQL Injection

 

Time based SQL Injection도 Boolean based SQL Injection과 동일하게 참과 거짓의 응답을 통해 DB의 데이터를 구분할 수 있습니다 해당 기법을 이용하여 DB의 이름의 길이를 알아낼 수 있습니다

 

 

①번 쿼리문은 Boolean based SQL Injection과 동일합니다

 

②번은 공격자가 미리 생성한 'abc123'이라는 계정을 넣어 LENGTH 함수를 이용하여 데이터베이스의 이름의 길이를 반환하게 됩니다 이때 SLEEP() 함수는 프로그램에서 일정 시간 동안 대기할 때 사용되는 함수입니다 즉 해당 데이터베이스의 이름의 길이가 = 1이면 SLEEP() 함수가 작동되는 겁니다

 

③번은 ②번 악성 쿼리문을 ①번 쿼리문 'INPUT1' id 위치에 주입시켰습니다

 


💉 Error based SQL Injection

 

Error based SQL Injection은 SQL 언어의 에러를 이용하여 DB의 데이터를 탈취할 수 있습니다

 

SQL Injection 개념을 설명할 때 다뤘던 쿼리문과 동일합니다

 

select * from login where name='musa' and password = '1234'

↓ ↓ 💉 Error based SQL Injection 삽입 ↓↓

select * from login where name='musa' and password = 'or'1'='1

 

이렇게 다양한 SQL 공격 기법으로 DB에 있는 데이터를 탈취할 수 있었습니다 그러면 어떻게 하면 SQL Injection을 예방할 수 있을까요? 완벽하지는 않지만 사용자의 입력 값에 대한 검사를 할 수 있게 위에서 다룬 공격 키워드를 의미 없는 단어로 치환되게 하는 소스 코드를 추가하면 됩니다

 

또한 SQL에서 설명했던 Prepared Statement 구문을 사용할 수 있습니다

Prepared Statement 구문은 구문 분석 과정을 최초 1번만 수행하고 이후에는 생략할 수 있기 때문에 입력된 정보는 기계어로 컴파일 되어 쿼리문은 그대로입니다

 

이런 과정을 통해 Prepared Statement은 SELECT 쿼리에 대입된 값을 SQL로 인식하지 않아 SQL Injection을 예방할 수 있습니다 ( 이미 컴파일 되어 있기 때문에 대입된 값을 문자열로 처리함 )

 

 

[ 참고 자료 ]

더보기
 

SQL Injection 이란? (SQL 삽입 공격)

1. SQL Injection 1.1 개요 Ÿ SQL InjectionSQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는

noirstar.tistory.com

 

 

Union SQL Injection 공격 시연

ி 개념 Union SQL Injection은 기존 정상쿼리와 악성쿼리를 합집합으로 출력하여 정보를 획득한다. Injection을 수행할 때는 기존 검색결과와 우리가 원하는 쿼리를 Union으로 합쳐서 조회한다. 먼저 SQL

jdh5202.tistory.com

 

 

SQL Injection

SQL Injection - 서버 사이트 취약점 중 하나 - SQL 쿼리에 이용자의 입력 값을 삽입해 이용자가 원하는 쿼리를 실행할 수 있는 취약점 Error based SQL Injection 1. 내용 SQL의 잘못된 문법이나 자료형 불일치

noredstone.tistory.com

 

🎄🎅 𝓜𝓮𝓻𝓻𝔂 𝓒𝓱𝓻𝓲𝓼𝓽𝓶𝓪𝓼 🎅🎄

반응형
저작자표시 (새창열림)
'Web Study/Theory' 카테고리의 다른 글
  • 파일 업로드 취약점(File Upload Vulnerability)
  • 파일 다운로드 취약점(File Download Vulnerability)이란?
  • SQL(Structured Query Language)이란
  • DB - 데이터베이스란?
MUSA
MUSA
Nine Point Eight

최근 댓글

최근 글

인기 글

  • MUSA
    무사
    Nine Point Eight
    • 홈

    • 방명록

    • 분류 전체보기 (124)
      • Minecraft (29)
        • Server Development (16)
        • ResourcePack (7)
        • Plugin (5)
        • Java Plugin (1)
      • Tistory (15)
        • 티스토리 수익 (3)
        • 티스토리 검색 유입 (3)
        • 티스토리 꾸미기 (9)
      • Windows (2)
      • Kali Linux (42)
        • Linux (24)
        • Bandit (18)
        • Tool (0)
      • Web Study (26)
        • Theory (14)
        • Training (12)
      • CTF (5)
        • HackTheon (1)
        • Customized CTF (2)
        • CTF Write-Up (2)
      • Forensics (1)
      • System (1)
      • Cryptography (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
MUSA
SQL Injection 공격 기법
상단으로

티스토리툴바