사용자 삽입 이미지
보안 업계에서 일한지 만 3년이 되었다. 그동안 나름 열심이 노력한 분야도 있고 미쳐 알지 못하는 부분 그리고 시간에 쫓겨 어쩔 수 없는 부분 등 참 다양하다. 알고 있는 것이라곤 저 빙산 처럼 수면 위의 일각에 불가한거 같다. 수면 속에 거대한 무언가가 숨겨져 있는 그런 곳이 바로 보안 분야인거 같다. 일을 하면 할수록 왠지 자신이 없어 지는거 같다. 아니면 겸손해 지고 있는 건지도 모른다. 그동안 안전하다고 여겨 왔던 방식은 더이상 안전하지 않다는 결론에 이르게 되는 순간을 자주 만나곤한다. 노력과 노력을 거듭하지만 언제나 누군가는 더 많은 것을 이미 알고 있다. 그래서인지 그 누군가와 끝 없는 싸움을 하는 것만 같다. 자신과의 싸움 처럼....

"공격은 최선의 방어이다"라는 말이 있다. 물론 공격 측면에서 경험이 많아서 인지 이쪽에 대해서 설명하는게 좀더 수월하다. 일반적으로 Blind SQL Injection은 SQL Injection에 비해서 탐지가 어려운 편이다. 현재는 다양한 방법이 나와 있어 인터넷에 공개된 수많은 자료를 참고하면 취약점에 대해서 더 깊게 이해할 수 있게 된다. 여기에서는 그동안 얻은 경험을 토대로 SQL Injection과 Blind SQL Injection 탐지 방법에 대해서 설명한다.


1. 공격 기법의 종류

SQL Injection과 Blind SQL Injection은 다양한 기법이 존재하며 필터링을 우회하기 위한 기법도 많이 존재한다. 이러한 기술들은 아래의 그림과 같이 구분할 수 있다.

 
사용자 삽입 이미지
그림1. Databased Hacking Techniques : Web Based

구체적인 분류가 없어 경험에 의하여 분류를 하였다. 위의 분류는 공격 기법에 대한 분류이며 Blind SQL Injection 기술은 SQL Injection 기술들을 포함한다. 위의 공격 기법은 여기서 다루고자하는 탐지 기법과는 다소 차이가 있다. 공격에는 제한 사항등의 다양한 환경을 우회하거나 또는 강력한 공격을 위해 쓰이기도 한다.    


2. 파라메터 타입의 이해

SQL관련 취약점의 원인은 사용자가 입력한 데이터를 이용하여 DB에서 조회를 하는데서 시작한다. 만약 사용자가 입력한 데이터를 사용하지 않는다면 안전하겠지만 현재와 같은 웹 애플리케이션은 존재할 수 없을 것이다. 그렇다면 원인은 사용자가 입력한 데이터를 아무런 검증 없이 사용하는데서 발생한다. 웹 관련 대부분의 취약점은 여기에서 기인한다고 할 수 있다.

웹 애플리케이션은 사용자 입력 데이터를 Parameter를 이용하여 Web Server에 전송하며 웹 애플리케이션에서 각 파라메터에 맞게 사용자가 입력한 데이터를 처리한다. SQL 관련 취약점에서는 아래와 같은 종류의 파라메터 타입으로 분류 할 수 있다.

사용자 삽입 이미지
그림2. 취약점 점검에 쓰이는 파라메터 타입 종류

이 파라메터 타입은 방어 기법과도 아주 밀접한 관계가 있지만 차후에 다루기로 하고 각 타입에 대해서 먼저 알아보자.

- 문자열 타입(String Type)
DB에서 사용자가 입력한 문자열을 처리하기 위해서는 Single Quote를 사용하여야 한다. 물론 특별한 경우는 제외한 모든 경우에 사용된다. 그래서 파라메터 타입이 String형일 경우에는 파라메터에 Single Quote 삽입이 가능해야만 SQL Query 조작이 가능해 진다.

- 숫자형 타입(Numeric Type)
숫자형 타입은 Integer형이라고 부르지만 여기에서는 Numeric으로 사용한다. 이 타입은 String형과 다르게 Single Quote 없이 SQL Query 조작이 가능하게 해준다. DB에서는 Numeric형은 그냥 숫자로 입력되며 별도의 Single Quote연산자는 사용하지 않는다. SQL Query에서 문자열 데이터 삽입이 필요하면 Single Quote를 쌍으로 사용하거나 숫자형으로 치환(Hex-Based)하는 방법을 사용한다.

- 직접입력 타입(Direct Type)
정확한 명칙을 정하기가 어려워 Direct Type이라고 표기하였다. 이 방식은 파라메터에 입력된 값이 SQL Query문에 직접 입력되어 사용되는 방식을 뜻한다. 대표적인 예로 게시판 별로 Table명을 다르게 사용할 경우 board=QNABOARD 라고 사용되는 경우로 DB에서는 select ~ from QNABOARD라고 입력되는 경우이다.

취약점 점검을 위해 기본적으로 데이터 타입별로 파라메터 식별 방법에 대해서 설명하였다. 위의 파라메터는 타입 별로 탐지 방법이 다르다.


3. 파라메터를 통한 SQL Query 조작의 이해

파라메터를 통해서 입력된 값을 이용하여 웹 애플리케이션에서는 SQL Query를 생성한다. 여기에서는 크게 하드코딩된 부분과 소프트코딩된 부분으로 분류할 수 있다. 사용자가 수정 가능한 부분은 소프트코딩된 부분이다. 그럼 사용자가 개입 가능한 포인트를 분류하여 좀더 자세하게 알아보자.

- Where 절의 끝에 위치할 경우
SELECT * FROM USER WHERE USER_ID=$user_id

사용자가 입력한 값이 구문의 맨 마지막에 위치하는 경우이다. 이럴경우는 필요한 구문을 이어서 추가해 주면 된다. 여기에서는 union 도 사용이 가능하다.

- Where 절의 중간에 위치할 경우
SELECT * FROM USER WHERE  USER_ID=$user_id and user_level=10

사용자가 입력한 값이 Where 절의 중간에 위치한 경우이다. 위의 구문 예제가 부적절하지만 여기에서는 뒤에 위치한 구문을 적절하게 처리를 해줘야한다. 가장 많이 쓰이는 방법이 '--' 사용하는 방법이며 DB에 따라서는 '#', '/*', '*/' 등의 주석 처리 구문이 사용되기도 한다.

- Join문이나 다중 구문일 경우
SELECT * FROM student_details WHERE first_name IN (SELECT first_name FROM student_details WHERE subject= '$SUBJECT')

위의 예제는 부적합하나 의미는 SQL 구문이 복잡하여 도저희 유추가하기 어려운 환경을 뜻한다. 이러한 경우는 중간에 개입하는 방식으로 처리를 해줘야 하낟. 대표적인 방법으로 ' AND ''=' 과 같은 방법등이 있다.

- Schema 명으로 쓰일경우
SELECT * FROM $BOARD_NAME WHERE ID=10

파라메터의 값이 TABLE명으로 직접 입력되어 쓰이는 경우이다. 이러한 경우는 테이블 명으로 사용되었으므로 파라메터의 값이 $BOARD_NAME=NOTICE_BOARD일 경우 변수 값에 'WHERE' 절을 사용하여 조건절을 적절하게 처리해 주고 '--', '#', '/*' 등의 주석 처리 구문을 사용하면 된다. 여기에서는 환경에 따라서 union도 사용이 가능하다.

- SQL구문 전체를 수정이 가능한 경우
$SQL=SELECT * FROM MEMBER_BOARD

위의 예제는 사용자 요청 파라메터에서 SQL구문 전체가 노출되는 경우이다. 이러한 경우 SQL 구문은 애플리케이션의 처리 구조를 감안하여 자유롭게 입력이 가능하다.


4. 취약점 점검 방법

웹 애플리케이션에서 발생하는 SQL관련 취약점의 공격 종류와 파라메터 식별 방법에 대해서 설명하였다. 취약점을 점검하기 위해서는 이 외에도 몇가지 이해가 필요하다 그 중에서 대표적인게 필터링 규칙과 SQL Query문의 구조이다. 이 부분을 잘 이해해야 효율적으로 취약점 도출이 가능하다.

필터링 여부는 공격에 필요한 문자열을 대입하여 차단 여부로 확인이 가능하며 SQL Query의 구조는 구문이 단순할 경우 일반적인 방법으로 점검이 가능하며 복잡한 구문일 경우 중간이 삽입이 가능한 형태만이 가능하다.

그러면 기본적인 형태에 대해의 점검 방법에 대해서 설명한다.


- 문자열 타입

문자열 타입은 Single Quote가 입력 되어야만 SQL 구문 조작이 가능하므로 파라메터에 Single Quote를 삽입하여 점검해야 한다.

→ 예제 환경
    URL : http://localhost/n3015m.asp?pdt_list=dbms
    Query : select * from product where pdt_list='%$pdt_list%'

→ Single Quote를 삽입하여 참/거짓 점검
    참인 반응 : http://localhost/n3015m.asp?pdt_list=dbms' and 1=1--
    거짓 반응 : http://localhost/n3015m.asp?pdt_list=dbms' and 1=2--

위의 예제는 가장 기본적인 점검 방법으로 삽입한 구문은 아래와 같은 형태로 DB에서 수행된다.

select * from tablename where pdt_list='%dbms' and 1=1--%'
select * from tablename where pdt_list='%dbms' and 1=2--%'


- 숫자형 타입

숫자형 타입은 문자열 타입과 다르게 처음에 Single Quote 삽입이 불가하다.

→ 예제 환경
    URL : http://localhost/n3015m.asp?pdt_id=100
    Query : select * from product where pdt_id=$pdt_id

→ 쿼리를 삽입하여 참/거짓 점검
    참인 반응 : http://localhost/n3015m.asp?pdt_id=100 and 1=1
    거짓 반응 : http://localhost/n3015m.asp?pdt_id=100 and 1=2

위의 예제는 가장 기본적인 점검 방법으로 삽입한 구문은 아래와 같은 형태로 DB에서 수행된다.

select * from tablename where pdt_id=100 and 1=1
select * from tablename where pdt_id=100 and 1=2


- 직접입력 타입

직접입력 타입은 먼저 종류를 보면 크게 3가지 정도로 분류가 가능할거 같다.

1. SQL 구문 전체
파라메터에 SQL 구문 전체가 전송되는 경우 획득하고자 하는 데이터의 종류를 프로그램의 로직에 맞춰서 입력하면 된다.

→ 예제 환경
    URL : http://localhost/n3015m.asp?sql=select+id,password,name+from+member    
    위의 구문을 요청하면 회원 정보인 아이디,패스워드,사용자 이름을 출력하는 게시판이다.
   
→ 쿼리를 삽입
    예시 : http://localhost/n3015m.asp?sql=select+name,null,null+from+sysobjects 
    위와 같이 변경하면 sysobjects에서 table명 리스트가 노출되게 된다.

2. Schema 명으로 사용되는 경우
파라메터에 입력된 값이 테이블 명 등등으로 사용되는 경우이다.

→ 예제 환경
    URL : http://localhost/n3015m.asp?b_id=member
    Query : select * from $b_id

→ 쿼리를 삽입하여 참/거짓 점검
    참인 반응 : http://localhost/n3015m.asp?b_id=member+where+1=1
    거짓 반응 : http://localhost/n3015m.asp?b_id=member+where+1=2

3. 파라메터의 값이 전체가 특정 위치에 삽입되는 경우
사용자가 입력한 값이 파라메터의 값을 이용하여 SQL 구문의 특정 위치에 바로 삽입되는 경우이다.

→ 예제 환경
    URL : http://localhost/n3015m.asp?b_id=member
             Hidden Field로 $s_query=id='n3015m'
    Query : select * from $b_id where $s_query

→ 쿼리를 삽입하여 참/거짓 점검
    참인 반응 : http://localhost/n3015m.asp?b_id=member&s_query=1=1
    거짓 반응 : http://localhost/n3015m.asp?b_id=member&s_query=1=2

※ "3. 파라메터를 통한 SQL Query 조작의 이해"에서 설명한 SQL 구문의 삽입 위치에 따라서 주석 또는 개입처리 등등을 조합하여야 효율적으로 취약점 도출이 가능하다.



위의 내용을 SQL Injection을 탐지하기 위해 필요한 가장 기본적인 내용들을 지금까지 경험한 내용에 비춰서 설명하였다. 부족한 부분도 많지만 취약점 탐지에 도움이 되었으면 한다.
Posted by n3015m
:
BLOG main image
'네오이즘'의 보안LAB 블로그입니다........... n3oism@gmail.com by n3015m

카테고리

분류 전체보기 (228)
[ HappyDevTool ] (29)
[ HappyToolRelease ] (4)
[Book] (6)
[ Security Studies ] (0)
- CII (2)
- BigData (2)
- Web Hacking (10)
- SQL Injection (25)
- Mobile Security (9)
- Network (6)
- OperatingSystem (4)
- Malware & Reversing (4)
- Phishing (5)
- Compliance (0)
- Programming (13)
- Tools (13)
- IoT (6)
- etc (21)
[Pentration Testing] (3)
[OS X] (4)
[ Security Trends ] (16)
[ Fixing Guideline ] (7)
My Way, My Life (34)
About Me (2)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

Total :
Today : Yesterday :