[SQLi] Blind Based SQL Injection

CHIKA·2024년 6월 4일

0.Blind Based SQL Injection

sql의 결과가 뜨는 곳이 아닌 로그인 페이지 등에서 쿼리가 주는 결과가 다른 점을 이용하는 공격이다.

1. Process

1. SQL Injection이 가능한지 확인하기

예를들어 아이디 입력칸에 

chika’ and ‘1’=’1 -> 참
chika’ and ‘1’=’2 -> 거짓을 반환한다면 Blind SQL Injection이 가능하다.

2. Select문을 사용할 수 있는지 확인하기

chika’ and ((select ‘test’)=’test’) and ‘1’=’1 ->참
chika’ and ((select ‘test’)=’asdf’) and ‘1’=’1 ->거짓
을 반환한다면 Select문이 사용 가능하다.

3. 공격 format 만들기

공격 format:

chika’ and (ascii(substr((SQL문),1,1))>0) and ‘1’=’1


데이터베이스나 테이블명 등을 참, 거짓을 이용하여 한 글자씩 추출할 것이다.
숫자는 부등호를 이용하여 추출할 수 있는데 문자는 어떻게 추출해야 할까?
ASCII를 이용하면 된다!!!

🔎ASCII란?
영문 알파벳을 사용하는 대표적인 문자 인코딩이다.
출력 가능한 문자들은 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수문자, 그리고 하나의 공백으로 이루어진다.

예를 들어 'A'의 ascii코드 10진수는 97이다.

chika' and (ascii(substr((select ‘chika’),1,1))>90) and ‘1’=’1

위의 식은 substr의 결과인 c의 10진수 아스키코드가 90보다 큰 지 확인한다.

소문자 'c'의 ascii 는 99이므로

chika' and (ascii(substr((select ‘chika’),1,1))>98 and'1
은 True를 반환,

chika' and (ascii(substr((select ‘chika’),1,1))>99 and ‘1’=’1
은 false를 반환할 것이다.

이를 활용하여 데이터를 한 글자씩 추출할 수 있다.
한 글자씩 추출하는데에는 시간이 오래걸리므로 리피터를 이용거나 자동화하자.

4. DB 이름 찾기

select database()를 이용한다.
3.의 공격 format이용

5. 테이블 이름 찾기

information_schema 를 이용한다.
3.의 공격 format이용

6. 컬럼 이름 찾기

information_schema 를 이용한다.
3.의 공격 format이용

7. 데이터 추출

select 컬럼명 from 테이블명
3.의 공격 format이용

참고자료
https://m.blog.naver.com/ycpiglet/222146759413
https://hanuscrypto.tistory.com/entry/SQL-Injection-Blind-SQL-Injection

0개의 댓글