[Web Hacking] SQL Injection : Blind SQL Injection #4

2023. 12. 15. 20:56정보 보안/Web

 

Blind SQL Injection 

  

  Blind SQL Injection 공격은 SQL Injection 공격 중 한 종류로서 질의문의 결과가 참 혹은 거짓으로 출력이 되는 경우에 사용 가능하다. 사실 Blind SQL Injection는 다른 SQL Injection 공격을 사용할 수 없는 상황일 때 최후의 방법으로 사용이 된다. 공격의 이름 대로 눈먼 장님같이 문자 하나하나 대조하면서 공격을 진행한다.

 

Blind SQL Injection Payload

  

  Blind SQL Injection Payload는 다음과 같은 순서로 작성해 나간다.

 

  1. normaltic' and '1'='1
  2. normaltic' and ('1'='1') and '1'='1
  3. normaltic' and ((select 'test')='test') and '1'='1
  4. normaltic' and (substr('test',1,1)='t') and '1'='1
  5. normaltic' and (ascii(substr('test',1,1)) > 0) and '1'='1

 

1) normaltic' and '1'='1

 

  SQL Injection 하기 위한 기본적인 형태로서 공격대상의 질의문 형태에 맞춰 작성한다. 이때 해당 형태에서의 결과값은 항상 참이어야 한다.

 

2) normaltic' and ('1'='1') and '1'='1

 

  질의문이 삽입될 위치에 조건문 하나를 삽입하여 정상 작동하는지 테스트한다. Payload의 결과값은 해당 위치에 삽입될 조건문의 결과에 따라 달라진다.

 

3) normaltic' and ((select 'test') = 'test') and '1'='1

 

  select 질의문이 정상 작동하는지 조건문에 삽입하여 테스트한다.

 

4) normaltic' and (substr('test',1,1)='t') and '1'='1

 

  substr 함수를 사용함으로써 반복 작업을 좀 더 편리하게 만들어준다. Payload는 빨간색 숫자를 계속 변경하여 'test' 해당 위치에 맞는 문자일 시 그 결과값으로 참을 반환한다.

 

* substr('대상 문자열', '시작 위치', '시작 위치에서부터 n번째 위치까지')

  
substr 함수는 인자로 입력되는 문자열에서 원하는 위치의 문자를 반환해 주는 함수다.

- substr('normaltic',1,1) = 'n' => 'normaltic' 문자열의 첫 번째 위치에서부터 하나의 문자를 반환
- substr('normaltic',3,2) = 'rm' => 'normaltic' 문자열의 세 번째 위치에서부터  문자를 반환

 

 

5) normaltic' and (ascii(substr('test',1,1)) > 0) and '1'='1

 

  Payload의 형태를 반복 작업의 피로를 덜어주기 위해 문자를 숫자 형태로 바꿔주는 작업을 진행한다. 이때 문자에 대응하는 숫자는 아스키코드로 표현이 가능하며 문자를 아스키 코드로 바꿔주는 함수인 ascii 함수를 사용한다.

 

* ascii('문자')

  ascii 함수는 인자로 입력되는 문자에 대응하는 아스키코드를 결과값으로 반환해 주는 함수다.

- ascii('a') = 97
- ascii('X') = 88

  

 

Blind SQL Injection을 이용한 DB 추출 공격

 

  Blind SQL Injection을 이용한 DB 추출 공격은 아래의 과정에 따라 진행한다.

 

  1. SQL Injection 작동 여부
  2. SELECT 문구 사용 가능한지 확인
  3. 공격 Format 만들기
  4. DB 이름 찾기
  5. TABLE 이름 찾기
  6. COLUMN 이름 찾기
  7. DATA 추출

 

[1] SQL Injection 작동 여부

 

실습용 웹 어플리케이션

 

  Blind SQL Injection 공격에 사용될 실습용 웹 어플리케이션으로서 ID 중복 검사 기능을 가진 프로그램이다. ID를 입력하면 해당 ID가 DB에 존재하는지 확인하여 존재여부에 대한 결과를 출력한다. 

 

  SQL Injection이 작동하는지 확인하기 위해 해당 기능에 쓰인 질의문에 맞춰 항등원의 역할을 하는 질의문을 입력한다.

 

 

  입력 결과 정상적으로 작동함으로써 SQL Injection 공격이 가능한 것을 확인하였다.

 

[2] SELECT 문구 사용 가능한지 확인

 

 

  질의문 삽입 시 select 구문이 적용되는지 테스트한 결과 정상 작동됨을 확인하였다.

 

[3] 공격 Format 만들기

 

  Blind SQL Injection 공격에 쓰이는 Format을 만들어 반복 작업을 하기 쉽도록 한다. 

 

normaltic' and (ascii(substr((__'입력할 질의문'__),1,1)) > 0) and '1'='1

 

[4] DB 이름 찾기

 

 

  DB의 이름을 찾는 질의문은 select database()로 Format에 넣어 삽입한 결과, 'blindSqli'라는 DB를 찾아냈다.

 

[5] TABLE 이름 찾기

 

 

  테이블은 'flagTable, member' 총 두 테이블을 찾아냈으나 flagTable 테이블에 한해서만 공격을 진행한다.

  

[6] COLUMN 이름 찾기

 

 

  flagTable에서 'idx, flag' 총 두 컬럼을 찾아냈으나 flag 컬럼에 한해서만 공격을 진행한다.

  

[7] DATA 추출

 

 

  flagTable 테이블 내에는 하나의 데이터만 존재하였다. 그 데이터는 문제의 플레그를 나타낸다.