ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Blind SQL Injection
    IT/웹 해킹 2024. 1. 10. 16:44

    [이 블로그는 해킹 공부하면서 가볍게 정리용으로 기록 및 내 생각을 끄적여 두기 위한 블로그(라 쓰고 일기라 읽는)이다.]

     

    • 목차
    1. Blind SQL Injection 이란
    2. Bind SQL Injection Process

    1) Blind SQL Injection 이란

    Union SQLi, Error Based SQLi 가 안 통한다면 마지막 수단으로 Blind SQL Injection을 써보는 방법만이 남았다. 이 둘은 화면에 DB데이터가 출력이 된다든지 오류 메시지가 화면에 출력된다든지 하는 화면 출력을 바탕으로 공격하는 기법이라 아예 화면에 안 띄우게 하면 그만인 간단한 방어 방법이 있다. 이럴 때 Blind SQL Injection이 큰 능력을 발휘하게 된다.

     

    말 그대로 Blind => 안 보인다. 참과 거짓만으로 데이터를 추출하는 것이다. 한 땀 한 땀... db이름의 첫 글자부터 하나씩 아스키코드 값이랑 비교하는 함수를 가지고 참인지 거짓인지 확인하여 추출하고 테이블 ,컬럼 , 데이터까지 하나씩 알아내야 하는 노가다 기법이라 할 수 있다. 사실 코딩을 하여 자동화로 만드는 방법도 있긴 하다. (여러 개를 찾아야 한다면 자동화를 추천)

     

    2) Bind SQL Injection Process

    • Blind SQL Injection Point 찾기
    • select 구문 사용 가능 테스트
    • (select '글자') 결과의 첫 글자 비교 확인
    • DB 이름 확인
    • Table 이름 확인
    • Column 이름 확인
    • Data 추출

    1) Blind SQL Injection Point 찾기

     

     

    거짓

     

    참일 때는 존재하는 아이디로 거짓일 때는 존재하지 않는 아이디로 나와 참, 거짓을 구분할 수 있는 곳이 포인트이다.

     

    2) select 구문 사용 가능 테스트

     

     

     

     

    select로 글자를 다르게 하여 select 구문이 작동하는지 확인하는 과정이다. 이것도 참일 때는 존재하는 아이디로 거짓일 때는 존재하지 않는 아이디로 표시된다.

     

    3) (select '글자') 결과의 첫 글자 비교 확인

     

    1
    2

     

    substr 함수로 인자로 들어가는 값은 차례대로 원하는 문자열, 시작지점, 길이 를 넣어 문자열에서 글자를 한 글자씩 추출하기 위해 사용한다.

     

    3

     

    4

     

    여기에 문자를 ascii 값으로 변환하는 함수를 넣어 값 자체를 숫자 비교를 하도록 시킨다.

    삽입한 쿼리문 : ' and (ascii(substr((select 'test'),1,1)) > 0 ) and '1'='1 

    여기서 test의 첫 글자 t의 값을 아스키 값으로 변환 시켜주면 116 이 나온다. 0보다 크니 조건문을 비교했을 때 참으로 나오게 된다.

    그러나 4번 사진처럼 120과 비교하면 116 > 120 은 거짓이므로 존재하지 않는 아이디로 뜨게 되는 것이다.

    up&down 게임과 같은 원리이다.

     

    4) DB 이름 확인

    (ascii(substr((select database()),1,1)) > 0) 를 넣어서 글자를 알아내면 2,1 ... 3,1 ... 하다 보면 데이터 베이스 이름을 획득하게 된다.

    다 쓰면 길어질 것 같아서 db이름만 가져와 봤다.

     

     

     

    5) Table 이름 확인

     

    삽입한 쿼리문 :

    ' and (ascii(substr((select table_name from information_schema.tables where table_schema='segfault_sql' limit 0,1),1,1))>0) and '1'='1

     

    6) Column 이름 확인

     

    삽입한 쿼리문 :

    ' and (ascii(substr((select column_name from information_schema.columns where table_name='game' limit 0,1),1,1))>0) and '1'='1

     

    7) Data 추출

     

    삽입한 쿼리문 : ' and (ascii(substr((select name from game limit 0,1),1,1))>0) and '1'='1

     

    끝! 앞에서 했던 Union SQLi, Error Based SQLi 와 끝은 같다.

    'IT > 웹 해킹' 카테고리의 다른 글

    XSS(Cross Site Scripting)  (2) 2024.01.11
    Blind SQL Injection 자동화 툴 만들기 및 사용법 with Python  (0) 2024.01.11
    Error Based SQL Injection  (1) 2024.01.10
    Union SQL Injection  (0) 2024.01.09
    SQL Injection  (2) 2024.01.09
Designed by Tistory.