Blind SQL Injection

DATE : 2023/12/08

지금까지 다룬 SQL Injection은

공격자가 주입한 Query의 결과가 화면에 나오는 경우에 해당하는 사례였다.

이번에 살펴볼 Blind SQL Injection은 이와 달리

Query의 결과가 화면에 나오지 않는 경우, 실행할 수 있는 공격 기법이다.

Query의 결과를 볼 수 없는데 어떻게 정보를 추출할 수 있다는 거지? 의문이 생길 것이다.

데이터를 꺼내오는 데 까지는 성공했다 하더라고

화면 상에서 확인이 불가능하다면 무용지물인 게 당연하다.

지금까지는 우리가 DB 이름을 알려 달라고 하면

select database()

DB 이름이 화면에 나오고, Table 이름을 물어보면

select table_name from information_schema.tables where table_schema='DB_NAME'

Table 이름을 알 수 있었는데 이제는 어떤 Query가 실행되더라도 그 결과를 화면에 보여주지 않는다.

하.지.만 주입한 SQL이 실행되지 않는 것은 아니다.

즉, 우리는 "SQL의 결과가 이거야!" 라고 값을 받아볼 수는 없지만, 결과에 대한 질문은 던져볼 수 있다.

What is Blind SQL Injection?

Blind SQL Injection의 핵심 개념은 질문을 던진다. 라는 건데

쉽게 말해 스무 고개와 같은 게임을 생각하면 된다.

주입한 SQL의 결과가 화면에 나오는 지 않는다고 해서 SQL이 실행되지 않는 것은 아니다.

다만, 그 값이 무엇인지 꽁꽁 숨기고 있는 것일 뿐!

그렇다면 우리는 이와 같이 물어볼 수 있을 것이다.

substr((select database()),1,1) = 'a'

"너! 내가 주입한 SQL 제대로 실행했지? DB 이름 안 알려줄 거 알아. 대신.."

"DB 이름의 맨 앞 글자가 a가 맞아?"

substr((select database()),2,1) = 'b'

"두 번째 글자는 b인가~? 😏"

이런 식으로 SQL의 결과에 대한 질문을 던짐으로써 참 or 거짓의 응답 차이

정보를 모아 우리가 원하는 데이터를 완성하는 방식의 SQL Injection을, Blind SQL Injection이라 한다.

"질문을 던진다"는 행위를 통해 정보를 얻기 위해서는 대답에 따른 응답 차이가 분명하게 존재해야 하기에

Blind SQL Injection을 수행하기 위한 조건은

조건이 참일 때와 거짓일 때 명확하게 달라지는 응답이 필요하다는 것!

참과 거짓을 구분할 수 있는 POINT를 찾아냈다면 Blind SQL Injection을 시도해볼 준비는 끝났다!! 👍

Last updated