SQL 인젝션(INJECTION) ?
- SQL은 DBMS에 데이터를 질의하는 언어이다.
- 정상적인 SQL Query를 변조하고, 삽입해서 비정상적인 데이터베이스 접근을 시도하는 공격
- SQL Injection 발생 시 조작된 쿼리로 인증을 우회하거나, 데이터베이스의 정보를 유출할 수 있다.
- SQL Injection 공격의 목적은 정보 탈취(기밀성 침해), 정보 수정/삭제(무결성 침해)이다.
- 주석 처리 기호 Oracle, MSSQL은 ' -- ' , MYSQL(MariaDB)는 '#', /**/ 는 /* ~ */ 사이 구문 주석 처리
1. Error Based SQL Injection
* 웹 서버와 데이터베이스 간에 통신 시 쿼리문이 맞지 않을 경우 에러가 발생한다.
* 이러한 에러를 기반으로 SQL Injection 진행하는 공격
* GET, POST 요청 필드, HTTP 헤더값, 쿠키 값 등에 싱글 쿼터(‘) 혹은 세미콜론(;) 등 삽입 시 에러가 발생한다면 취약점이라고 판단한다.
예) ‘(싱글 쿼터)를 넣을 때 발생하는 syntax error를 이용해 쿼리문을 유추, 참,거짓을 판별하는 쿼리문을 넣어 에러에 따라 값을 추출
1-1 . 점검 방법
* 사용자 입력 값에 특수문자나 임의의 SQL 쿼리를 삽입하여 DB 에러 페이지가 반환되는지 확인
①
‘having 1=1 -- 구문을 이용하여 필드명을 획득한다.
에러 페이지를 통해 테이블명은 member, 첫번째필드명은 idx 임을 획득한다.
②
‘group by idx -- 구문을 이용하여 다음 필드명을 획득한다.
에러 페이지를 통해 다음 필드명이 bld 임을 획득한다. 이렇게 필드명을 늘려가며 찾게된다.
2. Union SQL Injection
* UNION은 2개 이상의 쿼리를 요청하여 결과를 얻는 SQL 연산자이다.
* 기본으로 작성된 쿼리 + UNION 쿼리를 이용해서 값을 얻는 방법
* 공격자는 이를 악용하여 원래의 요청에 추가 쿼리를 삽입하여 정보를 얻어내는 방식이다.
* order by 를 이용해 컬럼의 개수를 파악하는 것이 핵심이다.
2-1. 점검 방법
* 컬럼의 수와 데이터 타입이 같아야하며, 컬럼 이름을 정확이 알고 있어야 하므로 사전 정보를 얻을 수 있어야 함.
예) 컬럼의 수가 11개라면,
① order by 12-- 구문 입력 시 에러 페이지 발생
② order by 11-- 구문 입력 시 정상 페이지 발생 => 컬럼의 개수가 11개 임을 확인
=> union select 1,2,3,4,5,6,7,8,9,10,11-- 로 injection 공격 가능
3. Blind SQL Injection
* 에러 메시지를 노출하지 않는 사이트 경우 쿼리의 참과 거짓 결과를 통해 정보를 취득한다.
* 참과 거짓을 비교하는 과정을 거쳐가며 계속 질의를 보내 결과들을 조합해 정보를 얻어내는 방법
* 오류 메시지를 자세히 반환하지 않으면 공격할 수 없는 sql injection 단점을 보완한 것이다.
<쿼리문에 사용하는 함수>
- substr 함수 : 문자열과 자를 문자열의 범위를 파라미터로 받아서 해당 부분 문자열을 리턴해주는 함수
- ascii 함수 : 파라미터로 받은 값의 아스키코드 값을 리턴해주는 함수
- limit 함수 : 문자열의 길이를 반환
3-1. 점검 방법
* 사용자 입력 값에 임의의 SQL 참, 거짓 쿼리를 삽입하여 참, 거짓 쿼리에 따라 반환되는 페이지가 다른지 확인
예) url이 www.example.com/list.php?read=1 일 때,
① url 끝부분에 and 1=1 추가 => 1=1 이라는 ‘참’이 성립됨 => 정상 페이지 응답
② url 끝부분에 and 1=2 추가 => 1=2 이라는 ‘거짓’이 성립됨 => 화면이 나타나지 않는다
4. Time based SQL Injection
* 쿼리 결과를 특정시간만큼 지연지키는 것을 이용하는 기법
* Blind SQL Injection 기법과 마찬가지로 에러가 발생되지 않는 조건에서 사용할 수 있다.
* Sleep 구문을 이용한다.
4-1. 점검 방법
① url 끝부분에 and sleep(5) 구문을 추가하면 5초 후에 페이지가 열린다.
② sleep 쿼리가 먹히면 DB 종류가 mysql 이라는 정보를 획득하고, Blind SQL Injection 공격이 가능함을 의미
'Web > Webhacking' 카테고리의 다른 글
SSRF (0) | 2022.11.24 |
---|---|
SQL 인젝션 우회 (0) | 2022.04.22 |
크로스사이트 스크립팅 공격 및 우회 기법 (0) | 2022.04.20 |
크로스사이트 스크립팅(XSS) (0) | 2022.04.19 |
파일 다운로드 공격 및 우회 기법 (0) | 2022.04.13 |
댓글