1. SQL injection이란
2. SQL injection의 종류
3. 대응방법
1. SQL injection이란
SQL injection은 Database의 취약점을 이용하여 정상적이지 않은 동작을 하도록 하는 SQL문을 입력하여 공격자가 원하는 작업을 수행하거나 정보를 유출하게되는 공격입니다.
SQL injection은 최근까지도 많이 일어나고 있는 공격기법 중 하나입니다.
2. SQL injection의 종류
2.1 Normal SQL injection
Normal SQL injection은 논리적 에러를 이용한 SQL injection으로 위의 로그인 예시에서 ' OR 1=1 --와 같이 값을 입력해주게 되면 OR 1=1에 의해 항상 참, --에 의해 뒷 부분은 주석처리가 되며 로그인에 성공하게 됩니다.
2.2 Error based SQL injection
Error based SQL injection은 주로 데이터베이스에 대한 정보를 획득하기 위해 사용됩니다. SQL의 잘못된 문법이나 자료형 불일치 등에 의해 데이터베이스가 알려주는 데이터베이스 오류 메시지에 의존하여 수행되는 공격 기법입니다.
2.3 Union based SQL injection
SQL의 Union이라는 구문을 사용하는 공격인 Union based SQL injection은 Union을 이용하여 원래의 요청에 하나의 추가 쿼리를 삽입하는 공격입니다.
이 때 필요한 전제조건으로 Union하는 두 쿼리의 컬럼의 개수와 데이터 형식이 같아야합니다.
위의 사진의 경우 게시글을 찾는 쿼리문에 Union을 넣어 Users 테이블의 id, 패스워드를 읽어오는 공격입니다.
2.4 Blind SQL injection - Boolean based SQL
위의 사진은 MySQL 에서 테이블 명을 조회하는 구문으로 limit 키워드를 통해 하나의 테이블만 조회하고, SUBSTR 함수로 첫 글자만, 그리고 마지막으로 ASCII 를 통해서 ascii 값으로 변환해줍니다
만약에 조회되는 테이블 명이 Users 라면 ‘U’ 자가 ascii 값으로 조회가 될 것이고, 뒤의 100 이라는 숫자 값과 비교를 하게 됩니다.
U의 ascii 값은 125이므로 뒤의 100의 값을 변경해가면 125일때 거짓이 나오므로 첫 글자가 U라는것을 알 수 있습니다.
이를 자동화하여 테이블명을 알아내는 방법입니다.
2.5 Blind SQL injection - Time based SQL
위의 그림은 Time based SQL Injection을 사용하여 현재 사용하고 있는 데이터베이스의 길이를 알아내는 방법입니다. 로그인 폼에 주입이 되었으며 임의로 abc123 이라는 계정을 생성해 두었습니다.
악의적인 사용자가 abc123’ OR (LENGTH(DATABASE())=1 AND SLEEP(2)) -- 이라는 구문을 주입하였습니다. 여기서 LENGTH 함수는 문자열의 길이를 반환하고, DATABASE 함수는 데이터베이스의 이름을 반환합니다.
주입된 구문에서, LENGTH(DATABASE()) = 1 가 참이면 SLEEP(2) 가 동작하고, 거짓이면 동작하지 않습니다.
이를 통해서 숫자 1 부분을 조작하여 데이터베이스의 길이를 알아 낼 수 있습니다. 만약에 SLEEP 이라는 단어가 치환처리 되어있다면, 또 다른 방법으로 BENCHMARK 나 WAIT 함수를 사용 할 수 있습니다.
3. 대응방법
입력 값에 대한 검증
사용자의 입력이 올바른 값인지 검증합니다. 사용자가 공격할 가능성이 있는 키워드들을 검증하고 차단합니다.
Prepared Statement 구문사용
Prepared Statement 구문을 사용하게 되면, 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에DBMS가 미리 컴파일 하여 실행하지 않고 대기합니다. 그 후 사용자의 입력 값을 문자열로 인식하게 하여 공격쿼리가 들어간다고 하더라도, 사용자의 입력은 이미 의미 없는 단순 문자열 이기 때문에 전체 쿼리문도 공격자의 의도대로 작동하지 않습니다.
Error Message 노출 금지
공격자가 SQL Injection을 수행하기 위해서는 데이터베이스의 정보(테이블명, 컬럼명 등)가 필요합니다. 데이터베이스 에러 발생 시 따로 처리를 해주지 않았다면, 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환해 줍니다. 여기서 테이블명 및 컬럼명 그리고 쿼리문이 노출이 될 수 있기 때문에, 데이터 베이스에 대한 오류발생 시 사용자에게 보여줄 수 있는 페이지를 제작 혹은 메시지박스를 띄우도록 하여야 합니다.
웹 방화벽 사용
웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 것도 하나의 방법입니다. 웹 방화벽은 소프트웨어 형, 하드웨어 형, 프록시 형 이렇게 세가지 종류로 나눌 수 있는데 소프트웨어 형은 서버 내에 직접 설치하는 방법이고, 하드웨어 형은 네트워크 상에서 서버 앞 단에 직접 하드웨어 장비로 구성하는 것이며 마지막으로 프록시 형은 DNS 서버 주소를 웹 방화벽으로 바꾸고 서버로 가는 트래픽이 웹 방화벽을 먼저 거치도록 하는 방법입니다.
'Security > Webhacking' 카테고리의 다른 글
CSRF 공격 (0) | 2024.05.12 |
---|---|
XSS문제 실습 (0) | 2024.05.10 |
Cookie & Session (0) | 2024.05.08 |