일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 보안 설정 오류
- owasp 취약점
- blind sql injection
- SQL 쿼리문
- CSRF
- sql group by
- sql join
- owasp 2022
- web shell
- 잘못된 접근 제어
- sql 개발자
- sql 문법
- sql 공부
- sql injection
- sql injection 공격
- ssrf
- owasp 가이드
- SQLD
- ISMSP
- 정보보안컨설팅
- SQL 자격증
- sql select
- server side request forgery
- Open Web Application Security Project
- SQL ORDER BY
- web shell공격
- sql developer
- 해킹
- 암호화 실패
- Today
- Total
MetaCODING
SQL(Structured Query Language) Injection 공격 대응방안(2) 본문
Blind SQL Injection
Boolean based 불 방식의 SQL
Blind SQL Injection은 데이터베이스로부터 특정한 값과 데이터를
전달받지 않고 단순히 참과 거짓의 정보만 알 수 있을 때 사용합니다.
로그인 폼에 SQL Injection이 가능하다고 유추되면
서버가 응답하는 로그인 성공과 로그인 실패 메시지를 이용하여
DB의 테이블 정보 등을 추출해 낼 수 있습니다.
블라인드 공격은 에러 기반 공격과 다르게
DB 서버 에러 메시지를 이용하지 않고 바로 DB를 공격합니다.
이 공격은 DB 취약점을 노리고 공격하는 기법보다
성공하기 어렵긴 하지만 꾸준히 발생하는 공격 중 하나입니다.
위의 그림은 Blind Injection을 이용하여
데이터베이스의 테이블 명을 알아내는 방법입니다.
MySQL Injection이 가능한 로그인 폼을 이용하여 악의적인 공격자는
임의로 가입한 abc123이라는 아이디와 함께
abc123’ and ascii(substring 혹은 SUBSTR(SELECT name From information_schema.tables WHERE table_type=’base table’ limit 0,1)1,1)) > 100 --
구문을 주입합니다.(sub은 문자열을 나누는 명령어)
해당구문은 MySQL에서 테이블 명을 조회하는 구문으로
limit 키워드를 통해 하나의 테이블만 조회하고 SUBSTR 함수로
첫 글자만 그리고 마지막으로 ascii를 통해서 ascii값으로 변환해줍니다.
만약에 조회되는 테이블 명이 Users 라면 ‘U’ 자가 ascii 값으로 조회가 될 것이고
뒤의 100이라는 숫자 값과 비교를 하게 되죠.
거짓이면 로그인이 실패할 것이고 진실이 될 때까지 뒤의 100이라는 숫자를 변경해 가면서 비교를 하면 됩니다.
공격자는 이 프로세스를 자동화 스크립트를 통하여 단기간 내에 테이블 명을 알아 낼 수 있습니다.
Time-based SQL Injection
Time Based SQL은 서버로부터 특정응답 대신,
진실 혹은 거짓의 응답을 통해서 데이터베이스의 정보를
유추하는 기법으로써 사용되는 함수는 MySQL기준으로 SLEEP과 BENCHMARK입니다.

Time based SQL Injection을 사용하여 현재 사용하고 있는 데이터베이스의 길이를
알아내는 방법인데, 로그인 폼에 인젝션을 진행하고 임의로 abc123이라는 계정을 생성한 후
공격자가 abc123’ OR (LENGTH(DATABASE())=1 AND SLEEP(2)) -- 이라는 구문을 주입합니다.
여기서 LENGTH함수는 문자열의 길이를 반환하고 DATABASE 함수는 데이터베이스의 이름을 반환합니다.
주입된 구문에서, LENGTH(DATABASE()) = 1 가 진실이면 SLEEP(2) 가 동작하고, 거짓이면 동작하지 않습니다.
이를 통해 숫자 1 부분을 조작하여 데이터베이스의 길이를 알아 낼 수 있는데, 만약에 SLEEP이라는 단어가 치환처리 되었다면, 또 다른 방법으로 BENCHMARK 나 WAIT 함수를 사용할 수 있습니다.
BENCHMARK는 BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')); 이런 식으로 사용이 가능하고
이 구문을 실행 하면 약 4.7초가 걸립니다.
정리해보자면,
Blind SQL Injection 중 Boolean-based Blind 공격은
에러메시지가 친절하지 않으므로 '삽입 시 500에러가 뜨거나
union기술을 썻는데 error가 가망이 없을 때, 진실 거짓에 따라 웹사이트의 반응이 다를때,
- 1. ①키워드' and 1=1 -- ②키워드' and '1'='1 ③키워드' and 1=1 -- or ## ④키워드' and 1'1'=1'1, % 00
- 점검구문이 참일때 ' and 1=1 -- 거짓일때 'and 1=2 --
- e.g. TV' and 'a' = substring(db_name(),1,1) -- << 숫자를 1,2 / 1,8처럼 변경하면서 발견해보자
↑위 'a'를 'o'으로 대신하여 사용하였는데 진실이 되었다면 db_name을 'admin'으로 대체 가능하다.
- TV' and substr(database(),1,1) = 'a
- ' and 111 = ascii(substring(db_name(),1,1)) --
인젝션 해보자!!
'키워드를 검색어에 항상 참인 조건(1=1)을 and로 조합하니까 정상적으로 결과가 반환됩니다.
반면 동일한 키워드에 항상 거짓인 조건(1=2)을 and로 조합하니가 구성하면 게시판 검색이 되지 않습니다.
이 둘을 진실과 거짓의 반응으로 간주할 수 있지요.
즉,
핵심은 게시판 검색 기능을 진실/거짓을 반환하는 요소로 사용할 수 있다는 점입니다.
여기에서 and조건으로 해커가 알고 싶은 쿼리문을 삽입해서 그 결과로부터 정보유출이 가능한 것이
Blind SQL인젝션 공격 기법이며 이중에서도 and 조건에 논리식을 대입하여 참/거짓 여부를 알아내는 방식을
Boolean-based Blind 공격이라 합니다.
Time-based SQL Injection 공격은
시간을 지연시키는 쿼리문를 주입하여
응답 시간의 차이로 진실 거짓 여부를 판별할 수 있습니다.
즉,
쿼리 지연을 유도하여 응답 시간에 걸리는 시간으로
진실 거짓을 판별하게 함으로써 DB의 유용한 정보를 캐낼 수 있게 됩니다.
정리해보자면,
Blind SQL Injection은 쿼리 결과가
진실 거짓의 서버의 반응 만으로 데이터를 얻어낼 수 있는 SQL 인젝션 공격 기법이며
이 기법은 많은 조건에 대한 비교과정을 거쳐야 의미있는 정보를 얻을수 있기 때문에
거의 모든 경우 자동화 툴을 사용해서 공격이 진행됩니다.
- 진실 : '; if 1=1 waitfor delay '0:0:3' --
- 거짓 : '; if 1=2 waitfor delay '0:0:3' --
- '; if 112=ascii(substring(db_name(),1,1)) waitfor delay '0:0:3' --
대응방안
입력 값에 대한 검증
SQL Injection 에서 사용되는 기법과 키워드는 엄청나게 많습니다. 사용자의 입력 값에 대한 검증이 필요한데요. 서버 단에서 화이트리스트 기반으로 검증해야 합니다. 블랙리스트 기반으로 검증하게 되면 수많은 차단리스트를 등록해야 하고, 하나라도 빠지면 공격에 성공하게 되기 때문입니다. 공백으로 치환하는 방법도 많이 쓰이는데, 이 방법도 취약한 방법입니다. 예를 들어 공격자가 SELECT 라고 입력 시 중간의 SELECT가 공백으로 치환이 되면 SELECT 라는 키워드가 완성되게 됩니다. 공백 대신 공격 키워드와는 의미 없는 단어로 치환되어야 합니다.
Prepared Statement 구문사용
Prepared Statement 구문을 사용하게 되면, 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에DBMS가 미리 컴파일 하여 실행하지 않고 대기합니다. 그 후 사용자의 입력 값을 문자열로 인식하게 하여 공격쿼리가 들어간다고 하더라도, 사용자의 입력은 이미 의미 없는 단순 문자열 이기 때문에 전체 쿼리문도 공격자의 의도대로 작동하지 않습니다.
Error Message 노출 금지
공격자가 SQL Injection을 수행하기 위해서는 데이터베이스의 정보(테이블명, 컬럼명 등)가 필요합니다. 데이터베이스 에러 발생 시 따로 처리를 해주지 않았다면, 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환헤 줍니다. 여기서 테이블명 및 컬럼명 그리고 쿼리문이 노출이 될 수 있기 때문에, 데이터 베이스에 대한 오류발생 시 사용자에게 보여줄 수 있는 페이지를 제작 혹은 메시지박스를 띄우도록 하여야 합니다.
웹 방화벽 사용
웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 것도 하나의 방법입니다. 웹 방화벽은 소프트웨어 형, 하드웨어 형, 프록시 형 이렇게 세가지 종류로 나눌 수 있는데 소프트웨어 형은 서버 내에 직접 설치하는 방법이고, 하드웨어 형은 네트워크 상에서 서버 앞 단에 직접 하드웨어 장비로 구성하는 것이며 마지막으로 프록시 형은 DNS 서버 주소를 웹 방화벽으로 바꾸고 서버로 가는 트래픽이 웹 방화벽을 먼저 거치도록 하는 방법입니다.
SQL(Structured Query Language) Injection 공격 위험성(1)
SQL인젝션 공격은 대표적으로 DB를 공격해서 개인정보 등의 정보를 탈취하는 방식입니다. 예컨대, 어떤 웹사이트가 있는데 사용자 아이디가 ‘korea' --’이고 비밀번호는 ‘사용자pw’으로 설정했
metacoding.tistory.com
'보안' 카테고리의 다른 글
웹 서비스 기반 주요 위협 SQL Injection (0) | 2023.09.06 |
---|---|
ARP Spoofing 스푸핑 공격을 이용한 MITM 공격 원리 (0) | 2023.09.01 |
SQL(Structured Query Language) Injection 공격 위험성(1) (1) | 2023.08.31 |
SQL(Structured Query Language) Injection 공격 개념 취약점 (0) | 2023.08.31 |
OWASP(Open Web Application Security Project) TOP10 10대 취약점 가이드 변천사 (0) | 2023.08.29 |