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