티스토리 뷰

반응형

sql 인젝션을 학습하면서 가장 적합한 공격을 뽑으라면 바로 유니온 인젝션이 제격이라 생각합니다.

다른 인젝션 기법에 비해서 좀 더 수월하게 정보를 획득 할 수 있기 때문인데요 특히 블라인드 인젝션은 .. 정말.. 

 

해당 기법은 UNION 연산자를 포함한 쿼리를 이용하여서 DB의 데이터를 획득하는데요

 

그렇기 위해서 기본적으로 UNION 연산자가 무엇인지 짚고 넘어 가겠습니다.

 

UNION 연산자란? : 둘 이상의 select 문 결과를 단일 결과로 출력 할 수 있다. 
이에 조건이 존재하는데 
첫째 : 칼럼의 개수가 같아야됨
둘째 : 칼럼의 형식이 같아야됩니다. ex 문자형, 숫자형 

더불어 UNION ALL이 존재하는데 UNION은 중복된 결과를 제거하여 출력해주며
UNION ALL은 중복된 결과도 다 같이 포함하여 출력하여 줍니다.

 

해당 부분을 쿼리 박스를 통해서 예시를 들어보겠습니다. (유니온 인젝션은 mysql, mssql, oracle의 비슷한 구문이기 때문에 mysql을 기준으로 진행하였습니다)

 

 

위의 구문 처럼 하나의 select 문에 유니온 연산자를 통해서 한번에 두개의 select 문의 결과를 얻을 수 있었습니다.

 

그럼 이번엔 데이터 형식에 대해서 알아 보겠습니다.

 

먼저 숫자형 데이터 인데요. 먼저 인젝션은 데이터 형식에 매우 민감한 공격입니다.

 

웹 서비스 과정을 살펴 보게 되면 사용자가 웹페이지에 요청을 할때 웹에서 제공하는 파라미터와 쿼리를 조합하여 DB에서 조회를 합니다.

 

쉽게 말해서 웹 페이지로 조회를 하기 때문에 먼저 웹페이지의 파라미터의 형식을 먼저 보고 그다음에 쿼리의 형식을 보게 된다는 말입니다.

 

보통 PHP에서는 명시적으로 형식을 적지 않으면 변이형 (VARIANT) 이되는데요 이에 아무 형식을 적어도 됩니다.

 

그렇다면? 위에서 말했던 것처럼 웹 페이지에서의 형식은 고려하지 않아도 되니 쿼리 형식만 고려하면 되는거죠

 

하지만 이를 잘 활용한다면 방어적 기법으로 사용 할 수 있는데요 예를 들어 INTER(숫자형) 이라면?

 

숫자만 받을 수 있는 곳에 select 같은 문자를 넣을려니 웹어플리케이션에서 형변환 오류로 쿼리가 제대로 전달이 되지 않겠죠?

 

보통 데이터 타입은 한번 쿼리를 던져보고 나오는 오류나 페이지를 통해서 유추 합니다.

 

 

이제 예제 홈페이지를 통해서 한번 실습해보았습니다.

조건은 유니온 인젝션 공격이 가능하며 상세 에러 메세지를 노출 하는 PHP 페이지입니다.

 

 

 

 

해당 홈페이지를 보면 empid 라는 파라미터에 숫자를 넣게 되면 해당 숫자에 맞는 데이터가 출력 되는 구조라는 것을 알 수 있습니다.

 

SQL 인젝션의 취약점 도출에서 제가 가장 먼저 하는 것은 파라미터 값에 '(싱글쿼터)를 넣어 보는 것입니다.DB의 약점을 탐지하는 방법으로 대부분에서 유효 하거든요 한번 시도해 보겠습니다.

 

이렇게 오류 메세지가 출력이 되네요 (%27로 바뀐건 웹 인코딩 때문입니다)

이 오류 메세지로 알수 있는건 먼저 해당 구문이 DB에 전달이 잘된다는 것입니다.

 

대부분의 모의 해킹 프로젝트에서는 제가 넣는 쿼리문이 어디에 들어가는지 잘 알 수 없는데요

왠만하면 where 절이라고 하네요

 

자 이제 이 파라미터로 쿼리를 전달 할 수 있는 것을 알았으니 이제 유니온 인젝션이 성립 되는지를 확인 해봅시다.

 

먼저 유니온 인젝션이 되는지 확인할려면 칼럼 개수와 칼럼 형식이 같아야 된다고 했죠? 먼저 칼럼 개수부터 확인 해봅시다.

 

SQL 에서 칼럼의 개수를 확인하는 쿼리 문은 Order by가 있습니다. 

 

order by는 데이터 정렬에 사용되어서 지정 칼럼을 오름차순, 내림차순으로 정렬 하는데요

 

구조는 이와 같습니다. {}은 생략 가능 []은 필수 (하지만 없으면 ASC로 기본 설정됨)

 

order by {col_name | expr | position } [ASC | DESC]

 

저희가 사용한 기능은 position 기능인데요 해당 기능으로 칼럼의 개수를 파악 할 수 있습니다.

 

 

 

해당 파라미터 값에 뒤에 order by 구문을 붙여서 숫자를 하나씩 증가 시켜 보았습니다 (1~19까지)

(+는 띄어쓰기 하면 %20으로 웹 인코딩 치환 되는데 너무 어지럽게 되서 +로 띄어쓰기를 대체 했습니다)

 

 

 

숫자 20을 넣자 오류가 뜹니다. 그렇다면? 칼럼의 갯수는 총 19개가 있다는 것을 알 수 있습니다.

 

 

 

 

 

반응형

'Web > web 기초' 카테고리의 다른 글

OWASP TOP 10 (2020) ?  (0) 2020.11.16
[웹] 파라미터 변조 -기초  (1) 2020.11.13
[웹] OWASP TOP 10 (2017)란?  (0) 2020.11.13
[웹] 웹 인코딩 종류 및 정의  (0) 2020.11.13
[Web] SQL Injection - 기초편  (0) 2020.11.13
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함