일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 보안 설정 오류
- SQL 쿼리문
- 암호화 실패
- sql 문법
- sql select
- ISMSP
- 정보보안컨설팅
- SQLD
- sql 공부
- Open Web Application Security Project
- sql join
- 잘못된 접근 제어
- owasp 취약점
- 해킹
- sql injection
- sql 개발자
- web shell공격
- ssrf
- CSRF
- owasp 2022
- SQL
- SQL ORDER BY
- server side request forgery
- sql developer
- web shell
- sql group by
- blind sql injection
- sql injection 공격
- owasp 가이드
- SQL 자격증
- Today
- Total
MetaCODING
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