basic my sql problems(sqlzoo.net - select from world) & basic sql injection(zixem.altervista.org...

40
Basic MySQL (sqlzoo.net – Select from world) & Basic SQL Injection (zixem.altervista.org/SQLi) (Level1 ~ Level3) by Alchemic (KoreaTech 이세한)

Post on 15-Jan-2017

156 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

Basic MySQL (sqlzoo.net – Select from world)& Basic SQL Injection (zixem.altervista.org/SQLi)

(Level1 ~ Level3)

by Alchemic(KoreaTech 이세한)

Page 2: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

2

INDEX0x01. Basic MySQL Problems (in sqlzoo.net)

0x02. Zixem SQLi Problems (level1 ~ level3)

Page 3: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

3

0x01. Basic MySQL Problems (in sqlzoo.net)

Page 4: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

4

0x01 Basic MySQL Problems (in sqlzoo.net)

이 문제는 위 그림에서 보이듯이 주어진 world 테이블에서 레코드 추출을 어떻게할 것인지를 익혀보는 문제입니다.

Page 5: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

5

0x01 Basic MySQL Problems (in sqlzoo.net)

1번 문제)

간단하게 world 테이블이 어떻게 출력이 되는지를 쿼리문을 읽고 실행해보라는 문제입니다.

Page 6: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

6

0x01 Basic MySQL Problems (in sqlzoo.net)

2번 문제)

world 테이블에서 name 속성을 가지는 레코드를 추출하는데, 조건이 population 속성의원자값이 200 million을 초과하는 레코드만 추출하여 출력하라는 문제입니다.

해당 쿼리문은 위 그림과 같습니다.

Page 7: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

7

0x01 Basic MySQL Problems (in sqlzoo.net)

3번 문제)

world 테이블에서 name 속성과 새로운 속성인 (gdp/population)에 관련된 레코드를추출하되, 조건으로 population이 200 million 이상인 원자값을 가지는 레코드를 추출하여 출력하는 문제입니다.

해당 쿼리는 위 그림과 같습니다.

Page 8: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

8

0x01 Basic MySQL Problems (in sqlzoo.net)

4번 문제)

world 테이블에서 name 속성과 population/1million 속성을 추출하되, 조건으로continent 속성의 원자값이 ‘South America’인 레코드를 추출하여 출력하는 문제입니다.

해당 쿼리는 위 그림과 같습니다.

Page 9: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

9

0x01 Basic MySQL Problems (in sqlzoo.net)

5번 문제)

world 테이블에서 name 속성과 population에 관련된 레코드를 추출하되, 조건으로는name 속성의 레코드 중에서 원자값이 ‘France’, ‘Germany’, ‘Italy’인 레코드만 추출하여출력하는 문제입니다.

해당 쿼리문은 위 그림과 같습니다.

Page 10: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

10

0x01 Basic MySQL Problems (in sqlzoo.net)

6번 문제)

world 테이블에서 name 속성과 관련된 레코드를 추출하되, 조건으로는 name 속성의레코드 중에서 ‘United’ 라는 문자열을 포함하는 원자값을 가진 레코드만 추출하여 출력하는 문제입니다.

해당 쿼리문은 위 그림과 같습니다.

Page 11: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

11

0x01 Basic MySQL Problems (in sqlzoo.net)

7번 문제)

world 테이블에서 name 속성과 population 속성, area 속성과 관련된 레코드를 추출하되,조건으로는 area 속성 원자값 중 3 million 을 초과하는 값과 population 속성 원자값 중250 million을 초과하는 값을 가지는 레코드만 추출하여 출력하는 문제입니다.

해당 쿼리문은 위 그림과 같습니다.

Page 12: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

12

0x01 Basic MySQL Problems (in sqlzoo.net)

8번 문제)

world 테이블에서 name 속성과, population속성, area 속성을 가진 레코드를 추출하되,조건으로는 area 속성의 원자값이 3 million 초과이면서 population 속성의 원자값이 250million 미만인 값을 가지는 레코드를 추출하거나, area 속성의 원자값이 3 million 미만,population 속성의 원자값이 250 million 초과인 값을 가지는 레코드를 추출하여 출력하는문제입니다.

해당 쿼리문은 위 그림과 같습니다.

Page 13: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

13

0x01 Basic MySQL Problems (in sqlzoo.net)

9번 문제)

world 테이블에서 name 속성과 population/1million 속성, gdp/1billion 속성의 레코드를추출하되, 조건으로는 population/1million 과 gdp/1billion의 값을 소수점 이하 2자리 수까지만 표현하고, continent 속성의 원자값이 ‘South America’인 레코드만 추출하여 출력하는 문제입니다.

해당 쿼리문은 위 그림과 같습니다.

Page 14: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

14

0x01 Basic MySQL Problems (in sqlzoo.net)

10번 문제)

world 테이블에서 name 속성과 gdp/population 속성의 레코드를 추출하되, 조건으로는gdp/population 속성의 원자값을 1000단위로 표현하고, gdp 속성의 원자값이 1 trillion을 초과하는 레코드를 추출하여 출력하는 문제입니다.

해당 쿼리문은 위 그림과 같습니다.

Page 15: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

15

0x01 Basic MySQL Problems (in sqlzoo.net)

11번 문제)

이 문제는 case 문을 이용하여 값을 추출할 때, case whre 조건에 맞는 것을 찾아서 다른방식으로 출력하는 문제입니다.name 속성과 case문을 이용하여 continent 속성의 원자값이 ‘Oceania’이면 ‘Australasia’로 대신 출력하고, 나머지는 그냥 출력합니다. 그리고 case 문까지 진행되어 추출된 레코드중에서 name 속성의 원자값이 ‘N’으로 시작하는 문자열을 가진 원자값의 레코드만 추출하여 출력하는 문제입니다.

Page 16: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

16

0x01 Basic MySQL Problems (in sqlzoo.net)

12번 문제)

world 테이블에서 name과 case 문에 의해, continent 속성의 원자값이 ‘Europe’이거나‘Asia’이면 ‘Eurasia’로 출력하고, continent 속성의 원자값이 ‘America’를 포함하거나‘Caribbean’ 이면 ‘America’로 출력하고, 나머지는 그냥 출력합니다. 그리고 case 문까지진행되고 추출된 레코드 중에서 name 속성의 원자값이 A로 시작하거나 B로 시작하는값만을 따로 추출하여 출력하는 문제입니다.

해당 쿼리문은 위 그림과 같습니다.

Page 17: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

17

0x01 Basic MySQL Problems (in sqlzoo.net)

13번 문제)

world 테이블에서 name과 case 문에 의해, continent 속성의 원자값이 ‘Oceania’ 이면‘Australasia’로 출력하고, continent 속성의 원자값이 ‘Eurasia’이고 name 속성의 원자값이 ‘Turkey’이면 ‘Europe/Asia’로 출력하고, continent 속성의 원자값이 ‘Caribbean’이고name 속성의 원자값이 ‘B’로 시작하는 값이면 ‘North America’로 출력하고, continent 속성의 원자값이 ‘Caribbean’이고 name 속성의 원자값이 ‘B’로 시작하는 값이 아니면 ‘SouthAmerica’로 출력하고, 나머지는 그냥 출력합니다. 그리고 추출되어진 레코드를 name 속성을 기준으로 오름차순 정렬하여 출력하는 문제입니다.

Page 18: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

18

0x02. Zixem SQLi Problems (level1 ~ level3)

Page 19: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

19

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 1 (Super Easy)]

Level1은 이러한 문제가 주어집니다.

url을 확인해보면 id 라는 파라미터값이 넘어가게 됩니다.

Page 20: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

20

0x02 Zixem SQLi Problems (level1 ~ level3)

우선, ‘ 을 url 뒤에 붙여서 서버로 보냈더니 다음과 같은 화면이 나타났습니다.

이를 통해서 우리는 다음과 같은 사실을 알 수 있습니다.

• http://www.zixem.altervista.org/SQLi/level1.php?id=1 이 취약하다는 것.

• 테이블 중에서 ID 속성이 취약하다는 것.

[Level 1 (Super Easy)]

Page 21: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

21

0x02 Zixem SQLi Problems (level1 ~ level3)

컬럼(column) 수를 알아보기위해 다음과 같이 order by 명령어를 이용하여 구해보았습니다.

order by 3은 제대로 출력이되었습니다.

반면, order by 4는 오류가 나타났습니다.

이를 통해 현재 사이트의 DB테이블은 3개의 컬럼(column)을 가지고 있다는 것을 확인할수 있습니다.

[Level 1 (Super Easy)]

Page 22: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

22

0x02 Zixem SQLi Problems (level1 ~ level3)

지금까지 방식으로 알아낸 사실들은 다음과 같습니다.

• http://www.zixem.altervista.org/SQLi/level1.php?id=1 이 취약하다는 것.

• 테이블 중에서 id 속성이 취약하다는 것.

• 테이블 컬럼(column) 수가 3개 라는 것.

[Level 1 (Super Easy)]

Page 23: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

23

0x02 Zixem SQLi Problems (level1 ~ level3)

union select 를 이용하여 어느 컬럼(column)이 인젝션(injection)이 되는지를 알아보도록 하겠습니다.

id=2+union+select+6661,6662,6663 을 입력하면, 다음과 같은 화면이 출력됩니다.이를 통해 컬럼(column) 1과 2가 취약하다는 것을 확인할 수 있습니다.

[Level 1 (Super Easy)]

Page 24: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

24

0x02 Zixem SQLi Problems (level1 ~ level3)

따라서, 컬럼(column) 1과 2 부분에 user(), version() 명령어를 집어넣으면인젝션(injection) 공격이 가능할 것으로 보여집니다.

컬럼(column) 1 과 2 부분에 user()와 version() 명령어를 넣어서 injection 공격을 시도했지만, 에러를 출력하게 됩니다. 아무래도 총 3개의 컬럼(column)이므로 3개 모두 입력을해야 통과가 되는 것으로 보여집니다.

[Level 1 (Super Easy)]

Page 25: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

25

0x02 Zixem SQLi Problems (level1 ~ level3)

컬럼(column) 3개 모두 입력을 해서 1과 2 부분에는 user(), version()을, 3 부분에는쓰레기 값을 집어넣었습니다.

이로써 다음과 같이 성공적으로 injection 공격이 성공한 것을 확인할 수 있습니다.

Level1 Complete!

[Level 1 (Super Easy)]

Page 26: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

26

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 2 (Easy)]

Level2는 다음과 같은 문제가 주어집니다.

Page 27: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

27

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 2 (Easy)]

‘을 붙여서 서버로 보내면 다음과 같이 에러 응답을 보내줍니다.

이를 통해 알 수 있는 사실은 다음과 같습니다.

• http://www.zixem.altervista.org/SQLi/level2.php?showprofile=4 가 취약하다.

• [‘] 표기가 반드시 필요하다.

Page 28: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

28

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 2 (Easy)]

‘ union select user(), version(), null

을 입력했더니 다음과 같은 오류가 나타났습니다.

이를 올바른 명령문으로 인식을 하게 만들기 위해서 다음의 표를 참고하여 명령문을다시 작성해보았습니다.

Page 29: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

29

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 2 (Easy)]

다음과 같은 코멘트(주석) 추가하는 법을 알 수 있었고, 이를 이용하여

‘ union select user(), version(), null -- -

로 명령문을 바꾸었습니다.

Page 30: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

30

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 2 (Easy)]

이제는 명령문에 대한 에러는 나타나지 않고 있고, 이제 컬럼 수가 다르다는에러를 보내주고 있습니다.

이제 컬럼 수만 맞추어주면 내용을 확인할 수 있을 것입니다.

컬럼 수를 하나 더 늘리기 위해 null을 하나 더 추가해보았습니다.

Page 31: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

31

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 2 (Easy)]

‘ union select user(), version(), null, null -- -을 입력했더니 제대로 통과가 되었습니다.

하지만 아직 user() 정보와 version() 정보는 볼 수 없습니다.

이는 간단하게 showprofile 값만 변경해주면 됩니다. (4 이외의 값으로 변경)

Page 32: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

32

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 2 (Easy)]

user()와 version() 명령에 대한 정보를 확인할 수 있습니다!

Level2 Complete!

Page 33: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

33

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 3 (Medium)]

Level3는 다음과 같은 문제가 주어집니다.

Page 34: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

34

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 3 (Medium)]

‘ union select user(), version(), null, null

이 명령어를 작성해서 서버로 보냈더니 위 그림과 같은 에러 메시지를 보여줍니다.

union 명령어의 [union]이 [uni]로 replace 되는 것을 확인할 수 있습니다.

Page 35: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

35

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 3 (Medium)]

지금까지 작업을 통해 알 수 있는 사실들은 다음과 같습니다.

• 이 사이트는 취약하다.

• [‘]에 의해 취약점이 발생한다.

• [union]이 [uni]로 대체된다.

[union]이 [uni]로 대체되는 것을 막기 위해서 [unionon]을 작성하면 될 것입니다.

[unionon] = [union] + [on] => 서버로 보내지면 [uni] + [on]으로 인식되기 때문입니다.

Page 36: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

36

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 3 (Medium)]

‘ unionon select user(), version(), null, null

이 명령어로 보내서 union이 uni로 대체되는 문제를 해결하였습니다.

그리고 끝부분에 [‘]를 하나 더 붙여서 보내보도록 하겠습니다.

Page 37: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

37

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 3 (Medium)]

‘ unionon select user(), version(), null, null’

이렇게 명령어를 보냈더니 제대로 injection 이 되는 것을 확인할 수 있습니다.

이제 item 의 값을 다른 값으로 바꿔주면 원하는 결과를 얻을 수 있을 것입니다.(3이외의 값 지정)

Page 38: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

38

0x02 Zixem SQLi Problems (level1 ~ level3) [Level 3 (Medium)]

성공적으로 결과가 나타난 것을 확인할 수 있습니다.

Level3 Complete!

Page 39: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

39

Any questions?

[Contact][email protected]

Page 40: Basic My SQL Problems(sqlzoo.net - select from world) & Basic SQL Injection(zixem.altervista.org - Level1 to Level3)

Thank You.