ORDER BY 구문에서 종종 취약점이 발생하는 경우가 있다. 지금까지는 ORDER BY 이후에 취약점이 발생할 경우 딱히 난감하게 할 수 있는게 거의 없었다. 대부분의 시도가 무효하기 때문이다.

예를 들어 게신판 등등에서 자주 사용하는 UION 구문은 ORDER BY 다음에는 사용할 수 없다.(제가 알고 있는 지식이 맞다면요) 그래서 옛날에는 주로 잠재적으로 취약할 수 있다라고만 보고서를 작성했던 기억이 난다. 일을 하다보면 항상 1%의 가능성이라도 있다면 증명을 해야만 속이 풀리는 경우가 많다. 진단요원(인력) 대부분의 특징이 아닐까 싶다.


SELECT ? FROM ? WHERE ? ORDER BY (Injection point)
표1, SQL Injection 구문


위의 "표1"의 SQL Injection 구문을 보면 이 글에서 말하고자 하는 위치가 어디인지 쉽게 이해 할 수 있다. 그림1의 예시와 같이 Error가 발생한다면 입력 값을 조작해서 Error 구문을 통해서 DB 데이터 획득이 가능할 것이다.

사용자 삽입 이미지
그림1, 에러구문 노출 예시


하지만 Blind라면 상황이 180도 달라진다. 먼저 Black Box Testing의 경우에는 능숙한 인력이 아닌 일반적인 경우는 Order by 절 이후인지 인지하는데 시간이 많이 소요될 것이고 어떻게 조작해야 할지 난해할 것이다.

먼저 이해를 돕기위해 몇 가지 설명을 곁들인다.


SELECT A, B, C FROM ? WHERE ? ORDER BY 1, 2, 3 DESC
표2, ORDER BY 절 특징

사용자 삽입 이미지
그림2, 표2 예시


위의 "표2"와 같이 ORDER BY 절에서는 칼럼의 순서에 맞게 칼럼명 대신에 숫자로 치환하여 사용이 가능하다. "표2"의 예시를 보면 1은 NAME, 2는 ID, 3은 XTYPE Column이다.


SELECT A, B, C FROM ? WHERE ? ORDER BY (1), (2), (3) DESC
표3, ORDER BY 절 특징2

사용자 삽입 이미지
그림3, 표3 예시


"표3"은 꼭 ORDER BY절에 한정된 특징이라고는 할 수 없지만 "()"를 쓸 수 있다. 이 의미는 ORDER BY 절에서 SUBQUERY를 사용할 수 있다는 것이다. 이제 여기서 이야기하고자 하는 ORDER BY절에 대한 지식은 모두 이야기 하였다.

그러면 이제 몇 가지 추가적인 특징에 대해서 알아보자. 이 특징은 다양하게 응용이 가능할 것 것이다.

사용자 삽입 이미지
그림 4, ORDER BY 절에서 SELECT문 사용

"그림 4"와 같이SUBQUERY를 이용하여 SELECT 구문 사용이 가능하다. 비록 해당 SELECT 구문의 결과는 Sort에만 영향을 미친다는 점을 유의해야 한다.

사용자 삽입 이미지
그림 5, Multiple-Row Subquey 에러화면


사용자 삽입 이미지
그림6, Single-Row Subquery 화면

ORDER BY 절에서의 BLIND SQL INJECTION의 핵심 부분의 설명이다. "그림 5와 6"에서 보듯이 다중행 서브쿼리와 단일행 서브쿼리의 특징을 이용하여 2가지 상태, 즉, 에러 출력과 정상 출력을 만들 수 있다.

ORDER BY 절에서는 위의 에러와 같이 단일행 결과만 입력이 가능한 제약이 있다는 것을 알 수 있다.
※ Subquery 설명 참고 : http://e-jooyoung.net/tc/entry/Subquery

사용자 삽입 이미지
그림7, where 절 1

사용자 삽입 이미지
그림8, where 절 2


"그림 7과 8"에서 보듯이 BLIND INJECTION POINT중에 가장 익숙한 WHERE 구문이다. 이제 WHERE 다음에 조건식만 넣으면 된다. 이제 많이들 이해하고 있는 기본적인 WHERE 절 다음의 BLIND SQL INJECTION과 다를 바가 없게 되었다.

사용자 삽입 이미지
그림 9, where 절 3


위의 화면에서와 같이 마지막 and 1=2에 우리가 원하는 조건식을 넣으면 그림 7과 8처럼 조건에 따라서 에러 화면과 정상 화면이 나타난다. SQL INJECTION 툴를 이용하여 적절하게 값을 설정해 주면 BLIND 방식으로 데이터 획득이 가능하다.


※ 예시화면

사용자 삽입 이미지
그림 10, 질의결과 FALSE 화면

사용자 삽입 이미지
그림 11, 질의결과 TRUE화면

"그림 10, 11"에서 보듯이 취약할 경우 다음과 같은 결과를 도출할 수 있다.


※ BLIND INJECTION 툴 활용예시

(select+~+where+1=1+AND+(SELECT+?+FROM+SYSOBJECTS+WHERE+?)>?)--
표4, TOOL에서의 QUERY 구문

사용자 삽입 이미지
그림 12, 표4 입력 예시

"표4"와 같이 BLIND INJECTION 툴에서는 생성한 QUERY 구문은 파란색 부분이며 사용자 설정 구문은 빨간색 부분으로 "그림 12"의 POST, APPEND TEXT END OF QUERY의 값과 같다.

사용자 삽입 이미지
그림 13, 데이터 확득 화면

"그림 13"은 ORDER BY 절에서 위에서 설명한 방식을 이용하여 BLIND SQL INJECTION 툴을 이용하여 DB의 데이터를 획득한 화면이다.

이 외에도 STORED PROCEDURE를 이용하여 편리한 방법 등등 여러가지 방법은 있겠지만 여기서는 BLIND 방식을 예로 설명하였다.

웹 보안쪽을 공부하시는 분이나 업무상 필요하신 분들에게 도움이 되었길 바랍니다.
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 :