본문 바로가기
Web/Webhacking

SQL 인젝션

by jjudy 2022. 4. 22.

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

댓글