Error based SQL Injection

Error based SQL Injection의 개념

  • 데이터베이스 오류 메시지를 활용하여 데이터베이스에 대한 정보를 획득하는 SQL Injection 기법
  • SQL 쿼리를 사용하거나 DB를 활용하는 플랫폼에서 잘못된 쿼리를 전송하면 에러가 발생하게 되는데 이때 이 에러를 활용하여 DB의 정보를 추출하는 개념이다.
  • 문법에러와 로직에러로 분류가 되는데 문법에러를 일으키게 되면 서버로 SQL 쿼리가 전송하기 전에 이미 문법적으로 에러가 발생하기 때문에 서버로 전송이 되지 않는다
  • 그렇기 때문에 우리는 Error based SQL Injection을 사용하려면 로직에러를 일으켜야 한다.
  • 로직 에러를 일으켰을 때 나타나는 에러를 바탕으로 SQLI 취약점을 찾고 DB의 구조와 원하고자 하는 데이터를 추출하는 기법이다.
  • 이로 인해 민감한 개인정보와 그 이외의 DB에 담겨있는 데이터가 유출될 수 있다.

SQLI의 종류와 유형

  • 널리 알려져 있는 기법으로는 다음과 같이 3가지가 있다.
  1. UNION SQL Injection
  2. Error based SQL Injection
  3. Blind SQL Injection
  • 어떠한 유형일 때 어떤 종류의 SQLI 기법을 사용하는지 알아보자.
  • UNION SQL Injection
    • 질의한 SQL 쿼리가 화면에 표시가 될 때 사용한다.
    • 이 방법을 통해서 눈으로 질의한 결과를 보면서 DB의 정보를 추출해 낼 수 있다.
  • Error based SQL Injection
    • 질의한 쿼리문이 로직에러를 일으켰을 시 에러 내용이 화면에 표시된다면 사용가능하다.
    • 표시된 에러문구를 통하여 DB의 데이터를 추출할 수 있다.
  • Blind SQL Injection
    • 오로지 참과 거짓의 형태로 표시가 될 때 사용가능하다.
    • 예를 들어서 올바른 ID를 입력하면 “존재하는 아이디입니다.”라고 표시가 되고 그렇지 않다면 “존재하지 않는 아이디입니다.”라고 표시가 될 것이다.
    • 이를 바탕으로 유추하여 DB의 데이터를 추출할 수가 있다.
    • 로그인 우회할 때 주로 쓰일 수 있다.

로직에러를 유발할 수 있는 Tip!

  • 먼저 DB가 어떤 유형의 DB인지 파악해야 한다
    • mysql , oracle , mssql , nosql 등 다르다
    • 하지만 원리만 알면 쿼리만 다르기 때문에 구글에 리서치를 하면 각 종류의 DB의 쿼리를 찾아서 시도하면 된다
  • 먼저 mysql(maria DB)을 예시로 필요한 함수가 있는데 바로 extractvalue 함수이다
  • extractvalue
    • extractvalue 함수에는 인자값이 2개 필요하다
    • extractvalue(1,2)로 예를 들자면
    • 첫 번째 인자값은 XML 구문이다
    • 두 번째 인자값은 XML에서 찾을 표현식이다
    • 여기서 우리는 에러를 발생시켜야 하기 때문에 두 번째 인자값으로 XML표현식이 아닌 것을 대입한다. → 그 방법으로는 앞에 특수문자를 넣으면 에러가 발생한다.
  • extractvalue 함수를 사용하는 예시와 설명
    • normaltic’ and extractvalue ( ‘1’ , (에러를 일으키는 표현식) ) and ‘1’=’ 1
    • 맨 뒤 ‘ 를 넣지 않는 이유는 폼의 형식을 맞춰주기 위함
    • 아까 우리는 두 번째 인자값으로 XML표현식이 아닌 것을 대입한다고 하였는데 그 방법은 특수문자를 넣는 것이라고 했다
    • 그렇기 때문에 우리가 질의할 쿼리문 앞에 특수문자를 넣으면 된다. 하지만 :select 이런 식으로 넣어버린다면 로직에러가 아닌 문법에러가 발생하기 때문에 직접적으로 사용할 수는 없다.
    • 그래서 concat 함수를 사용한다
    • concat 함수는 두 개의 문자를 붙여주는 역할을 하게 된다 → concat( 1 , 2 ) = ‘12’
    • 여기서 특수문자는 아무거나 넣어줘도 되지만 직접적으로 사용하게 되면 문법오류가 일어나므로 인코딩을 하여 붙여준다
    • concat( 0x3a , (select ‘normaltic’)) → 0x3a는 : 와 같다.
    • 작성한 concat함수를 위에 에러를 일으키는 표현식 부분에 넣게 되면 완성이 된다.
    • normaltic' and extractvalue('1', concat(0x3a, (select 'normaltic'))) and '1'='1
  • 예시 결과물

다음과 같이 XPATH 구문이 잘못되었다 라고 표시가 나온다.

 

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

Error based SQL Injection Process  (0) 2024.12.03
UNION SQL Injection Process  (0) 2024.11.22
로그인 인증 우회 SQL Injection  (0) 2024.11.22