본문 바로가기
Web/SQL Injection

Blind SQL Injection

by ㅇㅅㅇ.. 2024. 8. 6.

Blind SQL Injection

쿼리의 실행 값이 화면에 출력되지 않을 때 사용하는 SQL Injection 기법

스무고개와 유사한 방식의 공격


 

1. Leak length

  • SELECT * FROM user WHERE username='admin' and  length(password)=n --1' and password='1'

    username이 'admin'이면서 password의 길이가 n인 user를 SELECT
    • Login Fail => password.length != n
    • Login Success => password.length == n

2. Leak charaters

  • SELECT * FROM user WHERE username='admin' and  ascii(substr(password,n,1) = 65 --1' and password='1'

    username이 'admin'이면서 password의 n-1번째 글자가 'A'인 user를 SELECT
    • Login Fail => password[n-1] != 'A'
    • Login Success => password[n-1] == 'A'

+ 이진 탐색

ex) username='admin', password='P@ssword' 일 때

 

  1. 범위 지정
    비밀번호에 포함될 수 있는 아스키에서 출력 가능한 문자의 범위 => 32~126
    중간 값인 79부터 비교한다.

    SELECT * FROM user WHERE username='admin' and  ascii(substr(password,1,1) > 79 --1' and password='1'

    password의 첫 번째 글자는 'P'(80)이므로 결과는 True 

  2. 범위 조절
    -> 80~136 사이인 103 대입 False
    -> ... -> 80 대입 False => 첫 글자는 'P'

+ Bit 연산

ex) username='admin', password='P@ssword' 일 때

ASCII는 0~127 범위의 문자를 표현할 수 있으며, 이는 곧 7개의 비트를 통해 하나의 문자를 나타낼 수 있다는 것을 의미

MySQL에서는 숫자->비트로 변환하는 bin이라는 함수를 제공한다. SELECT bin(ord('A'));   => 10000001

  • SELECT * FROM users WHERE username='admin' and substr(bin(ord(password)),1,1)=1;
    => password의 각 문자를 ASCII에 대응하는 숫자로 출력 -> 숫자를 비트로 변환 -> substr으로 한 비트씩 비교

    => substr 숫자를 바꿔가며 7번 반복했을 때 출력값이 있으면 1 아니면 0
    => 위 예시의 경우 1010000 문자로 표시하면 'P'가 된다.

    => ord( ): 문자의 Unicode 값 출력


 

'Web > SQL Injection' 카테고리의 다른 글

DB 종류, 버전 알아내기  (0) 2024.08.15
System table  (0) 2024.08.15
Error & Time based SQL Injection  (0) 2024.08.07
UNION / Subquery  (0) 2024.08.06
DML  (0) 2024.08.06