Blind SQL Injection 공격 및 복습
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()
SQL(Structured Query Language) Injection 공격 위험성(1)
SQL인젝션 공격은 대표적으로 DB를 공격해서 개인정보 등의 정보를 탈취하는 방식입니다. 예컨대, 어떤 웹사이트가 있는데 사용자 아이디가 ‘korea' --’이고 비밀번호는 ‘사용자pw’으로 설정했
metacoding.tistory.com