One_Blog

SQL Injection - Union SQL Injection 본문

웹해킹

SQL Injection - Union SQL Injection

0xOne 2022. 10. 29. 23:57
728x90

우리는 정보를 탈취하기 위해

서버에 SQL Injection 공격을

날리곤 한다. 

 

하지만 우리가 하는 SQL Injection  공격이 항상 성공하는 것은 아니다.

성공을 한다고 해도, 항상 우리가 원하는 정보를 탈취할 수 있는 건 아니다.

 

우리가 항상 서버로부터 원하는 정보를 탈취하려면,

서버에서 사용하는 DB의 이름

 

서버에서 사용하는 DB - Table의 이름

 

Table - 칼럼의 이름

 

칼럼의 갯수

등등...

또한 

SQL 구문이 서버에서 어떻게 작동하는가

 

필터링은 있는가 ?

 

필터링이 있다면, 어떤 문자를 어떤 방식으로 필터링하며,

 

사용자 입력에서 특정 문자열이 검출되었을 때,

사용자의 입력을 어떻게 처리하는가.

 

오늘은 우리가 SQL Injection을 성공 시키기 위해 알아야 하는

SQL Injection의 3가지 기법.

 

Blind SQL Injection

Union SQL Injection

Error Based SQL Injection

이 3가지 기법 중 Union SQL Injection에 대해 가볍게 알아보도록 하자.

 

 

Union SQL Injection

MYSQL 구문 중 Union을 활용한 공격 기법이다.

 

Union?

MYSQL 문법 중 하나인데, SELECT문 2개의 결과를 합쳐서 하나의 결과로서 출력해준다.

SQL 질의문이 보이는 경우에 해당 기법을 사용할 수 있다.

 

Union이 필터링 당한다면...그건 뭐 안타까운거다.

Union SQL Injection 을 하는 과정은 , 대강 6가지 정도로 나뉜다.

1. 취약점 확인

2. 컬럼 개수 파악

3. Data 출력 위치 파악

4. Database 이름 확인

5. Table 이름 확인

6. column 이름 확인

7. 데이터 추출

사실 과정이 많아서 복잡해보이는데, 개인적으로 error based기법이나 

blind에 비해서 되게 쉬운 기법이라고 생각한다.

 

1. 취약점 확인

사용자 입력이 들어가는 곳에 '이나 "같은 따옴표들을 넣어본다.

해당 값들을 넣었을 때 서버가 SQL 구문 오류를 뱉어낸다면, 취약점이 존재한다는 것이다.

 

2. order by N 구문을 활용하여 칼럼 갯수를 파악한다.

order by는 쉽게 말해서

칼럼 갯수를 순서대로 정렬해주는 건데,

뒤에 오는 숫자가 칼럼의 갯수를 의미한다.

' order by 6 #

처음엔 이정도 숫자로 넣어보고, 만약 오류를 뱉거나 구문 결과가 출력되지 않으면

숫자를 하나 씩 줄여보면 된다.

그러다가 오류가 출력되지 않거나 구문 결과가 출력되는 숫자가 있는데, 

그게 칼럼의 갯수인 것이다.

 

3. Data 출력 위치 파악

' union select 1,2,3,4,5,6 #

칼럼의 갯수를 파악 했다면,

칼럼 갯수만큼 뒤에 숫자를 써주고, 

위 구문을 삽입해 값을 확인한다.

 

칼럼의 데이터가 각각 몇번쨰에서 가져오고 출력하는 지 확인하는 과정이다.

 

4. Database 이름 확인

' union select database(),2,3,4,5,6 #

database()라는 문법을 활용하여 칼럼칸에 사용하고 있는 DB의 이름을 출력할 수 있다.

 

5. Table 이름 확인

information_schema.tables를 활용하여 4번과 같이 

테이블 이름을 알아낸다.

' union select table_name,2,3,4,5,6 from information_schema.tables
WHERE table_schema = 'DB이름' and '1%'='1

 

6. column 이름 확인

아까 알아낸 칼럼의 갯수를 토대로, 칼럼의 이름들을 파악하는 과정이다.

 ex) id, pw, num ..

칼럼 이름까지 파악하는 이유는, 당연하게도 

우리가 원하는 정보가 어디에 저장되어있는지 파악하여,

해당 정보를 더 쉽게 탈취하기 위해서이다.

칼럼이 6개라고 가정했을 때, 구문은 

' union select column_name,2,3,4,5,6 from information_schema.columns where table_name='테이블 명'# / %'

과 같은 형태로 이루어진다.

 

7. 데이터 추출

정보를 수집할만큼 했으면. 가장 중요한 단계.

정보를 탈취해야한다.

DB에 대한 정보는 다 수집해놓고, 그 안에 있는 정보를 탈취하지 못한다면 말짱 도루묵 아니겠는가?

이제 우리가 수집한 정보를 토대로, DB안의 테이블안의 칼럼의 데이터를 탈취해야한다.

 

' union select 칼럼명1, 칼럼명2, 칼럼명3, 칼럼명4, 칼럼명5, 칼럼명6 from 테이블명 #

과 같은 형식으로, 모든 칼럼 안에 있는 데이터를 가져올 수 있다.

오늘은 가볍게 union SQL Injection에 대해 알아보았습니다.

엄청 어려운 기법은 아닌데, SQL구문을 정확히 모르시는 분들한텐 어려운 개념이 될 수 있다고 생각합니다.

글을 좀 급하게 쓰느라 두서가 없는데, 나중에 Blind , Error based SQL Injection에 대해 정리하고 나면

 SQL Injection에 대한 글을 통합해서 한꺼번에 정리해보도록 하겠습니다.

 

글 읽어주셔서 감사합니다.