Etc ( 기타 )/보안

Blind SQL Injection란?

노루아부지 2022. 11. 20. 21:29

SQL Injection 공격의 유형 중에 Blind Injection이라는 것이 있습니다. SQL Injection은 흔하게 들어봤는데, Blind SQL Injection은 얼마 전 GS 인증을 진행하며 처음 알게 되었습니다. Blind SQL Injection은 무엇일까요?

 

Blind SQL Injection이란?

Blind SQL(Structured Query Language) 주입은 데이터베이스에 참 또는 거짓 질문을 하고 애플리케이션 응답에 따라 답을 결정하는 SQL 주입 공격 유형입니다. 이 공격은 웹 애플리케이션이 일반 오류 메시지를 표시하도록 구성되었지만 SQL 주입에 취약한 코드를 완화하지 않은 경우에 자주 사용됩니다.

공격자가 SQL 인젝션을 악용할 때 때때로 웹 애플리케이션은 SQL 쿼리의 구문이 올바르지 않다는 데이터베이스 오류 메시지를 표시합니다. 블라인드 SQL 인젝션은 일반 SQL 인젝션과 거의 동일 하며 유일한 차이점은 데이터베이스에서 데이터를 검색하는 방법입니다. 데이터베이스가 웹 페이지에 데이터를 출력하지 않으면 공격자는 데이터베이스에 일련의 참 또는 거짓 질문을 하여 데이터를 훔치게 됩니다.

출처: owasp

 

 

Blind SQL Injection의 위험요소

Blind SQL Injection의 위험요소는 SQL Injection와 동일합니다.

 

 

1. 콘텐츠 기반

공격자는 ID를 매개변수로 받는 간단한 URL을 사용하여 페이지가 SQL 주입 공격에 취약한지 확인하기 위해 몇 가지 간단한 테스트를 수행할 수 있습니다.

 

정상 URL 호출

http://test.com/test.php?id=2

 

이 URL을 호출하면 데이터베이스에 다음 쿼리를 보냅니다.

 SELECT title, description, body FROM items WHERE ID = 2

 

공격 시도

그런 다음 공격자는 다음과 같이 'false'를 반환하는 쿼리를 삽입하려고 시도할 수 있습니다.

http://test.com/test.php?id=2 and 1=2


이제 SQL 쿼리는 다음과 같아야 합니다.

SELECT title, description, body FROM items WHERE ID = 2 and 1=2


웹 애플리케이션이 SQL 인젝션에 취약한 경우 아무 것도 반환하지 않을 것입니다. 확실히 하기 위해 공격자는 'true'를 반환하는 쿼리를 주입합니다.

http://test.com/test.php?id=2 and 1=1


'true'를 반환하는 페이지의 내용이 'false'를 반환하는 페이지의 내용과 다른 경우 공격자는 실행된 쿼리가 언제 true 또는 false를 반환하는지 구분할 수 있습니다.

 

 

2. 시간 기반

이 유형의 블라인드 SQL 주입은 지정된 시간 동안 데이터베이스를 일시 중지한 다음 성공적인 SQL 쿼리 실행을 나타내는 결과를 반환하는 방식에 의존합니다. 이 방법을 사용하여 공격자는 다음 논리를 사용하여 원하는 데이터 조각의 각 문자를 열거합니다.

 

첫 번째 데이터베이스 이름의 첫 글자가 'A'이면 10초 동안 기다립니다.
첫 번째 데이터베이스 이름의 첫 글자가 'B'인 경우 10초 동안 기다립니다. 등.

 

예제 1: MySQL에 다음과 같은 쿼리가 있다고 가정합니다.

SELECT * FROM 제품 WHERE id= 1-IF(MID(VERSION(),1,1) = '5', SLEEP(15), 0)

서버 응답이 15초 이상 걸리면 이 데이터베이스 서버가 MySQL 버전 5.x를 실행하고 있다고 결론을 내릴 수 있습니다. 

 

 

예제 2: MSSQL에 다음과 같은 쿼리가 있다고 가정합니다.

SELECT * FROM 제품 WHERE id= 1; IF SYSTEM_USER='sa' 대기 지연 '00:00:15'

이 쿼리를 사용하여 사용자가 SA인지 확인합니다.

728x90
loading