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' 일 때
- 범위 지정
비밀번호에 포함될 수 있는 아스키에서 출력 가능한 문자의 범위 => 32~126
중간 값인 79부터 비교한다.
SELECT * FROM user WHERE username='admin' and ascii(substr(password,1,1) > 79 --1'and password='1'
password의 첫 번째 글자는 'P'(80)이므로 결과는 True - 범위 조절
-> 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 |