sql의 결과가 뜨는 곳이 아닌 로그인 페이지 등에서 쿼리가 주는 결과가 다른 점을 이용하는 공격이다.
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