Lab: SQL injection attack, querying the database type and version on Oracle
오늘은 SQL Injection 문제를 하나 풀건데 문제 내용은 database version을 알아내는 방법이다. 하나를 제대로 알면 나머지 데이터 명 또한 쉽게 알아낼 수 있으니 처음에 어렵더라도 포기하지말자.
처음 사이트에 들어가면 아래와 같이 나오게 된다
이때 search 중 gifts나 lifestyle을 클릭하면 url이 아래와 같이 형식으로 나오게 된다. category="검색데이터" 형식으로 sql을 질의하여 데이터를 가져오는 것을 볼 수 있다. 여기서 sql injection을 테스트해보면 가능하다는 것을 알 수 있다.
https://ac3e1fa21fc00b0cc07a032700830059.web-security-academy.net/filter?category=Gifts
https://ac3e1fa21fc00b0cc07a032700830059.web-security-academy.net/filter?category=Lifestyle
이 문제를 해결하기 위해서는 UNION을 사용하여 다른 select를 이어 붙여서 사용해야한다.
UNION은 다른 기존 sql문에 다른 select 문을 결합하여 출력가능하도록 하는 코드이다.
이 페이지에서는 SQL 질의의 결과가 화면에 출력되기 때문에 우리가 원하는 출력도 해당 화면에 출력하기 위해 이어 붙여서 출력하기 위해 UNION을 사용한다.
(1)UNION의 조건
UNION을 사용하기 위해서는 SELECT할 데이터와 열의 갯수가 같아야 한다. 이를 위해 우선 기존 data의 열의 갯수를 알아야하는데 이는 order by 나 select null,null을 이용하여 알아낼 수 있다.
예시
Select * from Data where category = '입력값'
위 코드에서 입력값을 'order by 2-- 넣으면
2열을 기준으로 정렬하게 된다. 만약 2열이 없다면 오류를 발생'
-> Select * from Data where category = ''order by 2--
입력값 = 'union select null,null--
union은 열이 같아야 쓸 수 있기 때문에 null을 계속 추가하다가 열의 갯수가 일치하면
오류가 안떠서 열의 갯수를 알 수있다.'
-> Select * from Data where category = ''union select null,null--
위 코드를 이용하면 열의 갯수를 알아낼 수 있고, 두번째로 해야하는 것은 데이터의 형태가 어떻게 되었냐 이다. union의 경우 열 뿐만 아니라 데이터셋도 같아야 합칠 수 있다. 그래서 위에서 null을 이용한 것인데 null의 경우 숫자와 텍스트 둘다 가능하기 때문에 null을 통해 열의 갯수를 파악하고 null 대신 하나씩 'a'의 텍스트를 넣어 데이터의 type을 알아낸다. 이를하기 위해서는 Database version의 명도 text 형식이기 때문에 text형식이 가능한 열에 출력을 해야하기 때문이다.
ex) 데이터셋
idx name data
0 jame 21
1 hoit 31
2 tyrell 11
4 Database version 4 <- 이와 같이 union을 이용해 합칠 데이터는 해당 열의 데이터 type이 일치해야함
하지만 여기 사이트에서는 order by는 작동하지만 'union select null,null-- 은 작동하지 않는다. 그 이유는 아래 oracle 튜토리얼에 나와있는데 oracle의 경우 어느 테이블에서 가져올지를 나타내는 from을 써야만 작동한다.
oracle을 알 수 있던 이유는 페이지 상단 위에 무슨 Database를 사용할지 알려줬기 때문에 알 수 있었다. 만약 없다면 모든 종류를 해봐야 할것이다.
https://www.oracletutorial.com/oracle-basics/oracle-dual-table/
Oracle DUAL Table: What is DUAL Table in Oracle
This tutorial introduces you to Oracle DUAL table which is a special table used for evaluating expressions or calling functions
www.oracletutorial.com
이를 위해서는 위에 사이트에서 나와있는 모든 유저들이 접근가능한 테이블을 사용해야한다. 대표적으로 dual이 있다고 글에서 소개하고 있다.
그렇다면
'union select null,null from dual-- 이렇게 해야 결과가 나오게 된다.
이를 이용하여 기존 데이터와 일치하는 열 갯수를 파악하고 위 코드에서 null 대신에 문자열을 집어넣어서 어디서Database version 명을 출력가능한지 파악한다. 아래는 Select 문을 사용하여 Database version 을 출력해야하는데 이를 알아내기 위한 select문은 https://portswigger.net/web-security/sql-injection/cheat-sheet 여기에 나와있다.
코드로 작성하게 되면
-> Select * from Data where category = ''union select banner,null from v$version--
이렇게 될 것이다.
url에 작성을 해야하기 때문에 띄어쓰기는 +로 대치해야한다.
마지막으로 --을 사용한 이유는 기존 sql where 뒤에 오는 조건을 주석처리함으로써 삽입하는 sql 문에 영향을 주지 않기 위해서 이다. # 또한 사용 가능하다.
위 사이트에서는 database 버젼 뿐만 아니라 테이블 명도 알아내는 방법이 있으니 위 글을 참고해서 시도해보길 바란다.
다음은 burp suit을 이용해 sql injection 하는 방법을 소개해 보겠다.
'Coding > Wargame' 카테고리의 다른 글
[ Burp suit] File upload 문제3 풀이 (0) | 2022.05.31 |
---|---|
[ Burp suit] File upload 문제2 풀이 (0) | 2022.05.30 |
[ Burp suit] File upload 문제 풀이 (0) | 2022.05.29 |
[SQL Injection]Error base SQL Injection을 이용한 Database table, column name (0) | 2022.05.25 |
[Dreamhack] basic_exploitation_000 문제 (1) | 2022.03.05 |