MetaCODING

Blind SQL Injection 공격 및 복습 본문

보안

Blind SQL Injection 공격 및 복습

METACODING 2023. 9. 21. 04:23
728x90
반응형

https://zrr.kr/xL8S

 

SQL(Structured Query Language) Injection 공격 개념 취약점

웹서버와 DB서버가 연동되는 웹 서비스 중 사용자의 입력을 받는 화면이 로그인 화면, 검색 입력 창 등 존재하고 입력 받는 문자열에 별도의 처리없이 데이터베이스 조회를 위한 SQL 구문이 사용

metacoding.tistory.com

Blind SQL Injection

Blind SQL(Structured Query Language) Injection은 데이터베이스에

True&False을 하고 애플리케이션의 응답에 따라 답변을 결정하는 SQL Injection 공격의 한 유형이다.

이 공격은 웹 애플리케이션이 일반 오류 메시지를 표시하도록 구성되었지만

SQL Injection에 취약한 코드를 완화하지 못한 경우에 자주 사용되며 공격자가 SQL Injection을 악용할 때,

웹 애플리케이션은 SQL 쿼리의 구문이 올바르지 않다고 불평하는 데이터베이스의 오류 메시지를 표시하는 경우가 있다.

 

Blind SQL Injection은 일반 SQL Injection과 거의 동일하며,

유일한 차이점은 데이터베이스에서 데이터를 검색하는 방식이다.

데이터베이스가 웹 페이지에 데이터를 출력하지 않으면 공격자는 데이터베이스에 일련의 True&False 질문을 하여 데이터를 훔치게 된다.이로 인해 SQL Injection취약점을 악용하는 것이 더 어려워지지만 불가능하지는 않다.

 

공격자는 다음과 같은 몇 가지 방법으로 전송된 요청이 true 또는 false를 반환했는지 확인할 수 있습니다.

 

콘텐츠 기반

공격자는 지정된 ID를 매개변수로 사용하여 기사를 표시하는 간단한 페이지를 사용하여

페이지가 SQL 주입 공격에 취약한지 확인하기 위해 몇 가지 간단한 테스트를 수행할 수 있습니다.

예시 URL

http://newspaper.com/items.php?id=2

다음 쿼리를 데이터베이스로 보낸다.

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

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

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

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

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

웹 애플리케이션이 SQL 주입에 취약한 경우, 아무 것도 반환하지 않을 것이다.

확인하기 위해 공격자는 'true'를 반환하는 쿼리를 삽입한다.

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

'true'를 반환하는 페이지의 내용과 'false'를 반환하는 페이지의 내용이 다른 경우,

공격자는 실행된 쿼리가 언제 true를 반환하는지 또는 false를 반환하는지 구별할 수 있다.

이것이 확인되면 유일한 제한은 데이터베이스 관리자가 설정한 권한과 다른 SQL 구문 및 공격자의 상상력이다.

시간 기반

이러한 유형의 Blind SQL Injection은 지정된 시간 동안

데이터베이스를 일시 중지한 다음, 결과를 반환하여 성공적인 SQL 쿼리 실행을 나타내면

이 방법을 사용하여 공격자는 다음 논리를 사용하여 원하는 데이터 조각의 각 문자를 열거한다.

 

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

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

마이크로소프트 SQL 서버

http://www.site.com/vulnerable.php?id=1' waitfor delay '00:00:10'--

MySQL

SELECT IF(expression, true, false)

BENCHMARK()와 같이 시간이 많이 걸리는 작업을 사용하면 표현식이 True인 경우 서버 응답이 지연된다.

BENCHMARK(5000000,ENCODE('MSG','by 5 seconds'))

ENCODE 기능을 5000000번 실행한다.

데이터베이스 서버의 성능과 로드에 따라 이 작업을 완료하는 데 잠시 시간이 걸릴 수 있다.

공격자의 관점에서 중요한 것은 데이터베이스 응답 시간에 눈에 띄는 방식으로

영향을 미칠 만큼 BENCHMARK() 함수 반복 횟수를 충분히 높게 지정하는 것이다.

두 쿼리의 조합 예

1 UNION SELECT IF(SUBSTRING(user_password,1,1) = CHAR(50),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM users WHERE user_id = 1;

데이터베이스 응답에 오랜 시간이 걸리는 경우,

user_id = 1인 첫 번째 사용자 비밀번호 문자는 문자 '2'일 것으로 예상할 수 있다.

(CHAR(50) == '2')

나머지 문자에 대해 이 방법을 사용하면,

데이터베이스에 저장된 전체 비밀번호를 열거하는 것이 가능한데,

이 방법은 공격자가 SQL 쿼리를 인젝션하고 취약한 페이지의 콘텐츠가 변경되지 않는 경우에도 작동한다.

 

MySQL 이외의 데이터베이스에도 시간 기반 공격에 사용할 수 있는 시간 기반 기능이 있다.

  • MS SQL : 'WAIT FOR DELAY '0:0:10''
  • PostgreSQL : pg_sleep()

https://url.kr/8l2kju

 

SQL(Structured Query Language) Injection 공격 위험성(1)

SQL인젝션 공격은 대표적으로 DB를 공격해서 개인정보 등의 정보를 탈취하는 방식입니다. 예컨대, 어떤 웹사이트가 있는데 사용자 아이디가 ‘korea' --’이고 비밀번호는 ‘사용자pw’으로 설정했

metacoding.tistory.com

https://owasp.org/www-community/attacks/Blind_SQL_Injection

 

728x90
반응형