bit연산 이용한 Blind sql injection 기술
blind sql은 비밀번호를 하나하나씩 알아내어 완전한 비밀번호를 찾는 sql injection 기법이다.
예를 들어 admin의 계정이 다음과 같다고 하자.
username : admin
password : P@ssword
그러면 평범한 blind sql injection은 다음과 같이 할 수 있다.
Select * from users where username="admin" and substr(password, 1, 1)="P";
admin계정의 비밀번호 첫자리가 P이니깐 admin계정 정보가 출력될것이다.
반대로 P가 아닌 다른 문자면은 출력이 안될것이다.
이걸 이용해서 첫자리부터 끝자리까지 대입해서 확인하면 full password를 확인할 수 있다.
하지만 이걸 다 대입하기엔 문자에 숫자에 너무 많다. 그래서 방안을 3가지 정도 가져와봤다.
1. 파이썬 자동화 코드 짜기
이건 뭐 너무 당연한 말이다.
먼저 length()함수로 비밀번호 길이 확인 후 반복문으로 문자와 숫자를 다 대입해서 확인해보면 알 수 있다.
2. 이진 탐색
이진 탐색을 이용해 좀 더 빠르게 찾을 수 있다.
아스키에서 출력 가능한 문자 범위는 32~126이므로 먼저 그 중간인 79보다 큰지 확인하고 아니면 32~79 중간 값을 확인하고 하면은 좀 더 수월하게 찾을 수 있을 것이다.
3. Bit 연산
이 글의 핵심 단어이다.
바로 bit연산인데 아스키는 0부터 127범위의 문자를 표현 가능하며 7개의 비트에 표현 가능하다.
예를 들어 A를 bit로 표현하면 1000001이다. 이는, 7개의 자리를 각각 0인지 1인지 확인하면 무슨 문자인지 알 수 있다는 것이다.
즉, 7번만 연산하면 답을 알 수 있다.
Select * from users where username="admin" and substr(bin(ord(password), 1, 1)=1;
Select * from users where username="admin" and substr(bin(ord(password), 2, 1)=1;
Select * from users where username="admin" and substr(bin(ord(password), 3, 1)=1;
....