안녕하세요! 오늘은 블라인드 SQL인젝션을 진행할 때 알아두면 좋은 두가지를 포스팅하려고 합니다.
이번 포스팅 내용은 다음과 같습니다.
- 이진탐색기법
- Bit연산기법
1. 이진탐색기법
> 이진탐색이란 정렬된 리스트에서 임의의 값을 효율적으로 찾기 위한 알고리즘 입니다. 0부터100 사이의 임의의값을 찾으려 하는경우 0 > 1 > 2 > 3 ..... 이런식으로 차례대로 계산하면 너무 비효율적입니다.
그래서 중앙값인 50 보다 크냐 작으냐를 먼저 비교후, 만약 크다면 이후 또 중앙값인 75보다 크냐 작으냐 하는 식으로 중앙값과 비교를 통해 범위를 줄여나간다면 보다 빠르게 임의의값을 찾아낼 수 있을것입니다.
아래 그림은 위 설명을 도식화 한 것입니다.
> 파이썬 코드로 표현한 이진탐색 기법
아래는 위에 그림을 파이썬 코드로 표현해 본 것입니다.
target 에 들어가는 값은 저희가 블라인드 SQL을 하며 한글자 한글자 찾아낼 값입니다.
또한 ASCII 코드는 0~127까지 이루어져있으니 시작(start)을 0 , 끝(end)을 127로 정의하고 시작합니다.
계속되는 mid 값 갱신을 통해 비교연산을 하여 target의 아스키코드값을 찾아내는 코드입니다.
def binary_search(target):
start = 0 # 맨 처음 위치
end = 127 # 맨 마지막 위치
while start <= end: # start가 end보다 작거나 같으면 반복
mid = (start + end) // 2 # 중간값 (처음 경우엔 0+127 이니깐 mid=63)
if mid == target:
return mid # target 위치 반환
elif mid > target: # target이 작으면 왼쪽을 더 탐색
end = mid - 1 #end를 mid왼쪽값으로 정의
else: # target이 크면 오른쪽을 더 탐색
start = mid + 1 #end를 mid 오른쪽값으로 정의
return
2. Bit 연산기법
> 만약 서버에서 사용자의 입력값에 ascii 라는 문자를 필터링한 상황에서 Blind SQL인젝션을 진행하려면 어찌해야 할까요? 꼭 ascii 값이 아니더라도 SQL 쿼리중에 Bit 값을 연산하는 함수가 있습니다. 숫자를 비트로 표현해주는 bin 함수를 사용하여 0,1 비교를 통해 어떤 문자인지 알아낼 수 있습니다. 아래는 그 예시입니다.
> Bit 연산을 Blind SQL Injection에 적용하는법
1. A라는 문자열을 ord함수 를 통해 우선 아스키 숫자로 바꿔줍니다. 이후 bin함수 를 통해 숫자를 비트로 치환하게 되면 1000001 이라는 비트가 나오게 됩니다. 이 방식을 통해서 Blind SQL Injection 이 진행되는 법을 알려드리겠습니다.
2. 우선 데이터 베이스엔 james 라는 아이디에 admin1234 라는 비밀번호가 설정되어 있습니다. 이 상황에서 비트 연산을 이용한 공격을 해보겠습니다.
3. 현재 james의 비밀번호 맨 앞자리는 a로 시작합니다. a의 아스키 숫자를 비트로 표현하면 97 => 1100001로 표현이 됩니다. 1100001이란 값을 참거짓을 통하여 알아보겠습니다. 사용할 구문은 아래와 같습니다.
사용자가 입력할 SQL 구문 : select id,password from userlog where name='[사용자가 입력할 값]'
mysql > select id,password from userlog where name='james' and substr(bin(ord(password)),1,1) and '1'='1';
(( 사용자 입력값으로 james' and substr(bin(ord(password)),1,1) and '1'='1 를 넣었다고 가정 ))
(↓ 참 거짓문 결과값)
아래 사진은 substr에 1100001 값이 들어간후 첫번째 비트부터 차례대로 출력이 된것입니다.
비트가 1일땐 정보가 출력이 되지만 0일땐 Empty set 이 뜹니다.
이 참 거짓을 이용하여 비트가 1100001인 것을 알아냈습니다.
즉 첫번째 문자열이 'a' 라는것을 알아낸 것이죠!
긴 글 읽어주셔서 감사합니다
'웹해킹' 카테고리의 다른 글
[웹 해킹]Bit연산 기반의 Blind SQL Injection 방법 (실습 포함) (0) | 2025.01.14 |
---|---|
Authentication&Athorization (인증/인가 취약점)이란? (0) | 2024.08.03 |
File upload vulnerability - 파일 업로드 취약점 (1) (2) | 2024.07.19 |
CSRF(Cross Site Request Forgery)공격 (0) | 2024.07.04 |
XSS 공격 대응방안 (0) | 2024.06.30 |