본문 바로가기

1. Web hacking (웹 해킹)/2) 개념 정리

[2020.11.14] Dream Hack - Server-Side Advanced-SQL Injection

01 개요

데이터베이스의 종류

 

1) 관계형 데이터베이스 (RDB)

-가장 많이 사용되는 데이터베이스

-행(Column)과 열(Row)로 표현되는 테이블 간의 관계를 나타낼 때 사용되며, 이렇게 표현된 데이터베이스는 SQL을 통하여 관리 및 접근함.

-장점: 다양한 용도로 사용 가능, 데이터의 일관성 보증, 정규화에 따른 갱신 비용 최소화 등

-단점: 컬럼 확장의 어려움, 대량의 데이터 입력 처리 등 

 

2) NoSQL (Not Only SQL)

- NoSQL은 RDB의 특성 뿐만 아니라 다른 특성까지도 지원해 주는 데이터베이스라는 의미를 지닌다.

- 장점 : 대용량 데이터, 데이터 분산 처리에 용이, 유연한 데이터 모델링 가능, Cloud Computing에 적합

 

[NoSQL 종류]

 

Document 방식

- MongoDB(MongoDB Inc.), CouchDB(Apache) : Json, XML과 같은 Collection 데이터 모델 구조 사용

Key - Value 방식 

- Redis, Memchached : 둘다 In-memory DB이기도 하며 Key와 Value의 데이터가 쌍으로 저장되는 가장 단순한 데이터 모델 구조 사용

Big Table DB

- HBase, Cassandra, Hypertable, ScyllaDB : Key-Value 형에서 발전된 형태인 Column Family 데이터 모델 구조 사용

 

3) 그 외 DB

- 계층형 데이터베이스 : 데이터 간의 관계가 트리 구조인 데이터 모델 사용

- 네트워크형 데이터베이스 : 데이터 간의 다양한 관계가 그물망과 같은 모델 사용 

 

 

 

02 SQL Injection 공격

 

Logic, union, Subquery, Error Based, Blind

 

union을 이용한 sql injection에서는 error를 기반으로 우리에게 sql injection을 하는 데 필요한 간접적인 단서들을 제공, 하지만 error를 사용하여 DB에 직접적으로 정보를 탈취할 수 있다.

 

Error Based

 

Updatexml을 이용한 error based sql injection

 

Select id from user where id = 1 and updatexml(null, concat(0x3a,(우리가 실행할쿼리)),null);

이러한 쿼리를 사용한다면 에러를 사용하여 현재 DB 이름을 알 수 있을 것이다.

 

ERROR 1105 (HY00): XPATH syntax error: ‘:(DB명)

→  위 에러 구문처럼 에러를 사용하여 DB의 이름을 가져올 수 있다. 

 

ERROR 1105 (HY00): XPATH syntax error: ‘:(우리가 실행한 쿼리의 결과)

위에서 본 에러인 형식으로 원하는 정보를 가져올 수 있다.

 

이를 상용 사이트에서 사용하려고 한다면 다음과 같은 방법으로 사용가능

www.[공격할 웹 사이트의 주소].php?id=-1’ and updatexml(null, conact(0x3a,(우리가 실행할 쿼리)),null)…

 

 

Extractvalue을 이용한 error based sql injection

 

Select id from user where id = 1 and extractvalue(0x0a, concat(0x0a,concat(0x0a,(우리가 실행할 쿼리문)));

 

ERROR 1105 (HY00): XPATH syntax error: ‘(우리가 실행한 쿼리의 결과)’

→  위의 쿼리 또한 에러를 사용하여 실행하고 싶은 쿼리의 실행 값을 보여준다.

이를 상용 사이트에서 사용하려고 한다면 다음과 같은 방법으로 사용가능

www.[공격할 웹 사이트의 주소].php?id=-1’ and extractvalue(0x0a,concat(0x0a,concat(0x0a,(우리가 실행할 쿼리문)));

 

→ Union을 사용한 sql injection을 사용하여 DB의 자료를 빼올 수 있음에도 불구하고 Error를 사용한 sql injection을 배워야 하는 이유는 union이라는 키워드가 필터링 되었을 경우 사용할 수 있는 다른 수단으로 사용할 수 있기 때문이다. 

 

time based

 Blind sql injection을 할 때 에러결과값을 반환하지 않는 경우가 있기 때문에 time based sql injection을 수행해야 한다. Time based sql injection는 일반적으로 Sleep()함수를 사용하여 수행한다. 

 

Blind sql injection 쿼리문

www.[공격할 사이트의 주소].php?pw=100' || id='admin' and substr(pw,1,1)=0-- -

 

기본 원리는 and sleep(정지시킬 초) 구문을 합쳐 쿼리의 결과 값이 이 되면 sleep문이 작동하여 몇 초간 딜레이가 생기고, 쿼리문의 결과 값이 참이 아니라면 sleep문이 작동하지 않는 원리를 사용한다. Python을 사용하여 SQL Injection공격을 수행한다고 했을 때 time 모듈의 time()함수를 사용하여 Time based sql injection 공격을 수행할 수 있다.

Sleep()함수가 필터링 당했을 경우, benchmark()함수를 사용하여 수행 가능하다.

 

Requests 모듈

 import requests

 : 웹 브라우저에서 특정 홈페이지에 접속하는 역할을 하게 되는 모듈

 

 

03 SQL DML구문에 대한 이해

DML이란? 선택, 삽입, 수정, 삭제 같은 데이터 조작에 사용되는 SQL문

  1. SELECT (선택) : 데이터를 조회

    1) FROM : 데이터를 조회하기 위한 테이블의 이름 입력

    2) WHERE : 해당 테이블 내에 조회하는 데이터의 조건 입력

         - <, >, =, ! 와 같은 조건 연산

         - AND, OR, NOT과 같은 관계 연산자

         - IN(A, B) 함수 = A이거나 B인 데이터 조회

         - 테이블 내에 특정 데이터를 조회하고자 할 때에 SELECT문 삽입 가능

    3) ORDER BY : 쿼리의 결과값들을 원하는 컬럼의 기준으로 정렬

         - ASC = 오름차순 (default값)

         - DESC = 내림차순

    4) GROUP BY : 집계함수를 이용해 데이터를 그룹화

         - 집계함수 = SUM(), MIN(), MAX(), COUNT(), AVG() 등등

    5) LIMIT :  쿼리의 결과로 출력될 row개수를 또는 Offset을 지정

 

   2. INSERT (삽입) : 데이터가 추가하는 구문

         - VALUE[S]절: 추가될 데이터값 입력

   3. UPDATE (수정) : 데이터를 수정하는 구문

         - UPDATE : 수정을 요청한 테이블 정의

         - SET : 수정할 컬럼과 수정될 데이터 정의

         - WHERE : 수정할 row 지정

   4. DELETE (삭제) : 데이터를 삭제하는 구문

         - DELETE ROW : 삭제할 데이터가 존재하는 테이블 정의

         - WHERE : 삭제할 데이터의 row 지정

         - LIMIT : 원하는 개수의 데이터 삭제

출처: https://velog.io/@ooknimm/MYSQL-DML-%EA%B5%AC%EB%AC%B8

 

04 Exploit Technique

Blackbox 점검 중 SQL Injection 취약점을 발견하고 공격의 목적을 달성하기 까지의 과정

   1. SQL Injection 취약점 발견

       - HTTP Response Status Code를 통해 오류 발생 확인

       - DBMS의 오류 메시지를 통해 취약점 가능성 확인

       - 웹 어플리케이션에서 변조된 SQL 구문이 실행된 데이터가 변환 되는지 확인

   2. 구문 예측 / DBMS 정보 획득

       - 사용자의 입력 데이터를 처리하는 구문을 예측

       - DBMS의 정보를 획득하여 Exploit 작성을 위한 정보를 획득

   3. Exploit 작성

       - 사용할 공격 기법을 선정. (데이터베이스의 결과가 그대로 노출된다면 union 또는 subquery구문 사용 / 정보가 노출되지 않는다면 Blind SQL Injection을 사용)

       - WAF과 같이 SQL Injection을 방어하는 로직 등이 존재할 경우 우회 가능성을 판단

   4. 정보 탈취 및 수정/삭제

       - 시스템 테이블 등을 이용하여 데이터베이스의 정보 등을 획득

       - 저장된 데이터를 탈취하거나 수정/삭제하여 공격 목적 달성

 

* Subquery: 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL문을 말함. 메인 쿼리가 

서브쿼리를 포함하는 종속적인 관계, 서브 쿼리는 괄호로 감싸서 이용함

* Blind SQL Injection: 쿼리 결과에 따른 서버의 참과 거짓 반응을 통해 공격을 수행 

(임의의 SQL 구문을 삽입하여 인가되지 않은 데이터를 열람할 수 있는 공격 

 방법이라는 점에서는 일반적인 SQL Injection과 동일)

     

   SQL Injection - DBMS Fingerprinting:

     공격 대상 DBMS에서만 사용 가능한 함수 등을 통해 SQL Injection 공격을 좀 더 수월하게 수행

   System Tables

     DBMS마다 데이터베이스의 정보를 담고 있는 시스템 테이블이 존재

    (DB설정, 계정 정보 외에도 데이터베이스/테이블/컬럼 정보, 현재 실행되고 있는 쿼리 정보 등 다양한 정보들을 담고 있음)

   WAF Bypass

      WAF(Web Application Firewall, 웹 방화벽)과 같이 웹 해킹에서 주로 공격 시 사용하는 키워드들에 대해 방어하는 시스템이 존재하는 경우가 있음

           - 주요 키워드 사용을 차단해서 취약점이 발생하더라도 공격 코드들이 정상적으로 실행되지 못하는 경우 발생, 하지만 다양한 방법으로 우회 가능

   Out Of DBMS

       DBMS에서 제공하는 특별한 함수 또는 기능 등을 이용해 파일 시스템, 네트워크 심지어 OS 명령어 등에도 접근할 수 있음.

 

-> Dream Heck Web Hacking 5-4